• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Andromeda.. Кхе-кхе

KraZz

(L3) cache
Пользователь
Регистрация
18.06.2009
Сообщения
196
Реакции
7
Вообщем я не особо горел желанием обсуждать сабж в паблике, но автор попросил сделать адский реверс
Так как у меня времени очень мало, чтобы сделать полный реверс сразу и потом еще все это дело оформить и запостить на форуме
Подумав, решил сделать "свой" формат обзора - назовем его «онлайн-обзор». То есть, как будет появляться свободное время, буду тут отписываться ну и в процессе, вполне возможно, что кто-то захочет высказаться, хотя я уже привык, что в моих "мини-обзорах" обсуждений маловато будет
Но и в процессе возможно автор вообще откажется от реверса - ну скажем, посчитает меня некомпетентным в данной области
Ладно, вытрем сопли и скорее начнем...

Итак накрыт сабж UPX`ом, анпачим и видим вот такой код:
Код:
004016D2 03C E8 A7 3A 00 00          call    CreateWindowExA
004016D7 00C 89 45 FC                mov     [ebp+hWnd], eax
004016DA 00C 33 C9                   xor     ecx, ecx
004016DC 00C 53                      push    ebx                            ; dwData
004016DD 010 68 2C 14 40 00          push    offset ResultCallBack          ; lpResultCallBack
004016E2 014 51                      push    ecx                            ; lParam
004016E3 018 51                      push    ecx                            ; wParam
004016E4 01C 6A 10                   push    10h                            ; Msg
004016E6 020 FF 75 FC                push    [ebp+hWnd]                     ; hWnd
004016E9 024 E8 96 3A 00 00          call    SendMessageCallbackA
Сразу скажу, что push ebx ; dwData не есть гуд юзать
Дело в том, что некоторые (а может и большинство) крипторов могут после своей инициализации (выделение памяти, мапинг и т.д.) значение этого регистра (обычно они только ентрипоинт в пебе восстанавливают) НЕ восстановить, вследствие чего в регистре ebx может оказаться, ну допустим, значение 0x1000 и стало быть будет падение
И опять-же некоторые личности, не разобравшиеся кто виноват и в чем причина, будут винить криптовальщиков %))) искать врагов и предателей
Как минимум клиентов надо предупреждать о таком "трЭше", либо заставить всех кодеров поддерживающих крипторы, учитывать подобную особенность и восстанавливать значение всех регистров при переходе на ОЕП - ИМХО

Далее переходим к следующей части кода:
Код:
00401459 0DC 8D 35 F0 13 40 00       lea     esi, t_hash
0040145F 0DC 8D 7D F8                lea     edi, [ebp-8]
00401462                             loc_401462:
00401462 0DC FC                      cld
00401463 0DC AD                      lodsd
00401464 0DC 85 C0                   test    eax, eax
00401466 0DC 74 15                   jz      short loc_40147D
00401468 0DC 50                      push    eax
00401469 0E0 FF 73 18                push    dword ptr [ebx+18h]; ntdll.dll 7C900000
0040146C 0E4 E8 DF FB FF FF          call    GetProcAddressByHash
00401471 0DC 85 C0                   test    eax, eax
00401473 0DC 0F 84 31 02 00 00       jz      LEXIT
00401479 0DC FD                      std
0040147A 0DC AB                      stosd
0040147B 0DC EB E5                   jmp     short loc_401462
Из кода видно, что идет инициализация импорта для ntdll.dll, а lea esi, t_hash (4013F0) указывает на таблицу хэшей
Код:
004013F0 01 A9 A0 04                 t_hash dd 4A0A901h
004013F4 88 F2 19 62                 dd 6219F288h
004013F8 CF FA DA 82                 dd 82DAFACFh
004013FC E0 44 43 10                 dd 104344E0h
00401400 83 A5 DB 38                 dd 38DBA583h
00401404 E2 A5 C7 BC                 dd 0BCC7A5E2h
00401408 44 17 E1 12                 dd 12E11744h
0040140C 9F 13 32 93                 dd 9332139Fh
00401410 3B C5 99 59                 dd 5999C53Bh
00401414 17 36 77 00                 dd 773617h
00401418 CE 9C 12 19                 dd 19129CCEh
0040141C A2 44 0F C8                 dd 0C80F44A2h
00401420 74 F7 14 23                 dd 2314F774h
00401424 76 0C C1 F3                 dd 0F3C10C76h
00401428 00 00 00 00                 dd 0
Сразу же после первого сравнения функция GetProcAddressByHash возвращает ноль и вследствие чего происходит прыжок на LEXIT, а там:
Код:
004016AA                             LEXIT:
004016AA 0DC 6A 00                   push    0
004016AC 0E0 6A FF                   push    0FFFFFFFFh
004016AE 0E4 FF 55 EC                call    dword ptr [ebp-14h]
004016B1 0DC 5F                      pop     edi
004016B2 0D8 5E                      pop     esi
004016B3 0D4 5B                      pop     ebx
004016B4 0D0 C9                      leave
004016B5 000 C2 10 00                retn    10h
004016B5                             ResultCallBack endp
call dword ptr [ebp-14h] не был инициализирован и соответственно там в стеке мусор из-за чего и падаем
Сразу возникает мысль, что не может быть такого, чтобы сразу вот так печально все закончилось, может там в самом UPX`е была какая-та проверка, и мы ее просто не заметили
Проверим наши предположения и запустим сабж без отладчика
Мда, видим сабж пал смертью храбрых при этом сообщив, что готов слать баг-репорт ахтунгам из Microsoft

Теперь нам надо понять причину из-за чего падаем
Итак, продолжим нам надо проанализировать код, который находится ниже и понять, что за функции вызываются, смотрим:
Код:
00401492 0DC 33 C9                   xor     ecx, ecx
00401494 0DC 89 4D B0                mov     [ebp+var_50], ecx
00401497 0DC C7 45 AC 00 10 00 00    mov     [ebp+var_54], 1000h
0040149E 0DC 6A 04                   push    4
004014A0 0E0 68 00 10 00 00          push    1000h
004014A5 0E4 8D 45 AC                lea     eax, [ebp+var_54]
004014A8 0E4 50                      push    eax
004014A9 0E8 51                      push    ecx
004014AA 0EC 8D 45 B0                lea     eax, [ebp+var_50]
004014AD 0EC 50                      push    eax
004014AE 0F0 6A FF                   push    0FFFFFFFFh
004014B0 0F4 FF 55 F0                call    dword ptr [ebp-10h]; 7C90D4DE ntdll.ZwAllocateVirtualMemory 940959B9
004014B3 0DC 85 C0                   test    eax, eax
004014B5 0DC 74 0B                   jz      short loc_4014C2
004014B7 0DC 3D 00 00 00 80          cmp     eax, 80000000h
004014BC 0DC 0F 83 E8 01 00 00       jnb     LEXIT
Судя по параметрам, помещаемым в стек перед call dword ptr [ebp-10h], очень похоже на вызов функции для выделения памяти
Мы знаем, что хендл модуля у нас ntdll.dll 7C900000, стало быть, это будет ZwAllocateVirtualMemory
Адрес 7C90D4DE и хэш 940959B9 смотрим в таблицу и видим там 82DAFACFh совсем другой хеш
Вследствие чего функция CalcHash считает другой хэш и не найдя соответствия при сравнении в GetProcAddressByHash возвращается 0 и сразу падаем...
Значит у нас вся таблица хэшей "неправильная" придецца ее восстанавливать вручную методом анализа параметров и т.д...
Но об этом уже в следующий раз (обещать не буду, так как все зависит от обстоятельств и желания автора)

Вспомнив, что автор просил адский реверс, я решил быть немного дотошным и.. и...
Судя по коду, написан сабж на MASM32, и если посмотреть на функции GetProcAddressByHash и CalcHash можно предположить что это не копипаст и автор сам их че-то там..
Возникает потребность проверить его на наличие знаний PE-формата (импорт/экспорт)
Возьмем и сделаем рип функций GetProcAddressByHash и CalcHash и создадим асм-файл
Код:
.686
.model flat, stdcall
option casemap:none

include c:\masm32\include\windows.inc

.code
start:
;=======================================
option prologue:none

CalcHash proc szName:DWORD
push ebp
mov ebp, esp
push edx
push esi
xor edx, edx
mov esi, dword ptr [ebp+8]
loc_40103A:
lodsb
test al, al
jz short loc_401048
or al, 21h
xor dl, al
rol edx, 0Bh
jmp short loc_40103A
loc_401048:
mov eax, edx
pop esi
pop edx
leave
retn 4
CalcHash endp

GetProcAddressByHash proc hModule:DWORD, dwHash:DWORD 
push ebp
mov ebp, esp
add esp, 0FFFFFFFCh
push ebx
push esi
mov ebx, [ebp+8]
mov eax, dword ptr [ebx+3Ch]
lea eax, [ebx+eax+18h]
lea eax, [eax+60h]
mov eax, [eax]
test eax, eax
jz short loc_4010B7
add eax, ebx
mov [ebp-4], eax
mov esi, [eax+20h]
add esi, ebx
mov ecx, [eax+18h]
test ecx, ecx
jnz short loc_401080
xor eax, eax
jmp short loc_4010B7
loc_401080:
lodsd
add eax, ebx
push eax
call CalcHash
cmp eax, [ebp+0Ch]
jz short loc_401094
loop loc_401080
xor eax, eax
jmp short loc_4010B7
loc_401094:
sub esi, 4
mov eax, [ebp-4]
sub esi, [eax+20h]
sub esi, ebx
shr esi, 1
add esi, ebx
add esi, [eax+24h]
movzx esi, word ptr [esi]
shl esi, 2
add esi, ebx
add esi, [eax+1Ch]
mov esi, [esi]
add esi, ebx
mov eax, esi
loc_4010B7:
pop esi
pop ebx
leave
retn 8
GetProcAddressByHash endp
;=======================================
end start
Теперь создадим в студии (Microsoft Visual Studio) проект и прямо в него добавляем наш код выше (асм-файл)
Если кто не знал - да-да студия позволяет в C++ проекте компилить ASM код
Это как раз и может являться решающим факторм для начинающих, которые не могут определиться, на чем кодить на FASM или MASM32
А я даже считаю, что вот эта элита подсевших на FASM и похоронила ASM как базовый стержень кодинга и всех основ (ИМХО), но да ладно не будем о холиваре и продолжим
В студии на папке проекта жмем правую кнопку мыши и выбираем в появившемся контекстном меню пункт Custom Build Rules...
И в появившемся окне Visual C++ Custom Build Rule Files нужно создать новое правило и выбрать файл masm.rules
Короче обзор не об этом, так что читаем MSDN, там полностью описано как настроить MASM32
Далее создадим cpp-файл и добавим в него такой код:
Код:
#include <windows.h>
#pragma comment(linker, "/entry:main")

extern "C" DWORD GetProcAddressByHash(IN HMODULE hModule, IN DWORD dwHash);

void __cdecl main()
{
  //71AB249A AcceptEx 4AC8B966
  HMODULE hWsock32 = LoadLibrary("wsock32.dll");
  GetProcAddressByHash(hWsock32, 0x4AC8B966);
  GetProcAddress(hWsock32, "AcceptEx");
  return;
}// end « main »
Код:
extern "C" DWORD GetProcAddressByHash(IN HMODULE hModule, IN DWORD dwHash);
Эта строчка определяет прототип нашей функции из асм-файла для того чтобы мы могли ее заюзать в cpp-коде
В результате выполнения данного кода будет возвращен указатель 71AB286E на строку MSWSOCK.AcceptEx, вследствие чего, если попытаться вызвать эту функцию, произойдет падение..
И тут же смотрим, что возвращает GetProcAddress и видим, что 71A378A4 - явно есть различия и стоит подумать над тем, почему такой "косячок" выскакивает...

Для тех, кто НЕ умеет вступать и компилировать, прилагаю для ознакомления трейс-лог:
Код:
EAX=00000000 ECX=0013FFB0 EDX=7C90EB94 IMPORT "ntdll.KiFastSystemCallRet" EBX=7FFDF000 EBP=0013FFF0 ESI=FFFFFFFF EDI=7C910738 
C:\Templates\MyProject\release\MyProject.exe 
004010E3  56                    PUSH ESI
004010E4  68 18204000          	PUSH 00402018                        ASCII "wsock32.dll"
004010E9  FF15 04204000        	CALL DWORD PTR DS:[<&KERNEL32.LoadLibraryA>]  DS:[00402004]=7C801D77 (kernel32.LoadLibraryA)
EBX=00000000 EBP=0013F9B4 ESI=00000000 EDI=00000000 
C:\WINDOWS\system32\ntdll.dll 
7C90EB94  C3                    RETN
EAX=71AB0000 IMPORT "wsock32.#1139" ECX=7C801BF6 EDX=001A0608 EBX=7FFDF000 EBP=0013FFF0 ESI=FFFFFFFF EDI=7C910738 
C:\Templates\MyProject\release\MyProject.exe 
004010EF  8BF0                  MOV ESI,EAX
ESI=71AB0000 IMPORT "wsock32.#1139" 
004010F1  68 66B9C84A          	PUSH 4AC8B966
004010F6  56                    PUSH ESI
004010F7  E8 7AFFFFFF          	CALL 00401076
00401076  55                    PUSH EBP
00401077  8BEC                  MOV EBP,ESP
EBP=0013FFB0 
00401079  83C4 FC              	ADD ESP,-4
0040107C  53                    PUSH EBX
0040107D  56                    PUSH ESI
0040107E  8B5D 08              	MOV EBX,DWORD PTR SS:[EBP+8]
EBX=71AB0000 IMPORT "wsock32.#1139" 
00401081  8B43 3C              	MOV EAX,DWORD PTR DS:[EBX+3C]
EAX=000000E0 
00401084  8D4418 18            	LEA EAX,DWORD PTR DS:[EAX+EBX+18]
EAX=71AB00F8 
00401088  8D40 60              	LEA EAX,DWORD PTR DS:[EAX+60]
EAX=71AB0158 
0040108B  8B00                  MOV EAX,DWORD PTR DS:[EAX]
EAX=000010CC 
0040108D  85C0                  TEST EAX,EAX
0040108F  74 4C                	JE SHORT 004010DD
00401091  03C3                  ADD EAX,EBX
EAX=71AB10CC 
00401093  8945 FC              	MOV DWORD PTR SS:[EBP-4],EAX        	Stack SS:[0013FFAC]=FFFFFFFF
00401096  8B70 20              	MOV ESI,DWORD PTR DS:[EAX+20]
ESI=000022CC 
00401099  03F3                  ADD ESI,EBX
ESI=71AB22CC 
0040109B  8B48 18              	MOV ECX,DWORD PTR DS:[EAX+18]
ECX=0000004B 
0040109E  85C9                  TEST ECX,ECX
004010A0  75 04                	JNZ SHORT 004010A6
004010A6  AD                    LODS DWORD PTR DS:[ESI]              DS:[ESI]=[71AB22CC]=0000249A
EAX=0000249A ESI=71AB22D0 
004010A7  03C3                  ADD EAX,EBX
EAX=71AB249A ASCII "AcceptEx" 
004010A9  50                    PUSH EAX
004010AA  E8 A7FFFFFF          	CALL 00401056
00401056  55                    PUSH EBP
00401057  8BEC                  MOV EBP,ESP
EBP=0013FF98 
00401059  52                    PUSH EDX
0040105A  56                    PUSH ESI
0040105B  33D2                  XOR EDX,EDX
EDX=00000000 
0040105D  8B75 08              	MOV ESI,DWORD PTR SS:[EBP+8]
ESI=71AB249A ASCII "AcceptEx" 
00401060  AC                    LODS BYTE PTR DS:[ESI]              	DS:[ESI]=[71AB249A]=41 ('A')
EAX=71AB2441 ESI=71AB249B ASCII "cceptEx" 
00401061  84C0                  TEST AL,AL
00401063  74 09                	JE SHORT 0040106E
00401065  0C 21                	OR AL,21
EAX=71AB2461 
00401067  32D0                  XOR DL,AL
EDX=00000061 
00401069  C1C2 0B              	ROL EDX,0B
EDX=00030800 
0040106C  EB F2                	JMP SHORT 00401060
00401060  AC                    LODS BYTE PTR DS:[ESI]              	DS:[ESI]=[71AB249B]=63 ('c')
EAX=71AB2463 ESI=71AB249C ASCII "ceptEx" 
00401061  84C0                  TEST AL,AL
00401063  74 09                	JE SHORT 0040106E
00401065  0C 21                	OR AL,21
EAX=71AB2400 EDX=4AC8B966 ESI=71AB24A3 ASCII "EnumProtocolsA" 
0040106E  8BC2                  MOV EAX,EDX
EAX=4AC8B966 
00401070  5E                    POP ESI
ESI=71AB22D0 
00401071  5A                    POP EDX
EDX=001A0608 
00401072  C9                    LEAVE
EBP=0013FFB0 
00401073  C2 0400              	RETN 4
004010AF  3B45 0C              	CMP EAX,DWORD PTR SS:[EBP+C]
004010B2  74 06                	JE SHORT 004010BA
004010BA  83EE 04              	SUB ESI,4
ESI=71AB22CC 
004010BD  8B45 FC              	MOV EAX,DWORD PTR SS:[EBP-4]
EAX=71AB10CC 
004010C0  2B70 20              	SUB ESI,DWORD PTR DS:[EAX+20]
ESI=71AB0000 IMPORT "wsock32.#1139" 
004010C3  2BF3                  SUB ESI,EBX
ESI=00000000 
004010C5  D1EE                  SHR ESI,1
004010C7  03F3                  ADD ESI,EBX
ESI=71AB0000 IMPORT "wsock32.#1139" 
004010C9  0370 24              	ADD ESI,DWORD PTR DS:[EAX+24]
ESI=71AB23F8 
004010CC  0FB736                MOVZX ESI,WORD PTR DS:[ESI]
ESI=00000474 
004010CF  C1E6 02              	SHL ESI,2
ESI=000011D0 
004010D2  03F3                  ADD ESI,EBX
ESI=71AB11D0 
004010D4  0370 1C              	ADD ESI,DWORD PTR DS:[EAX+1C]
ESI=71AB22C4 ASCII "n(" 
004010D7  8B36                  MOV ESI,DWORD PTR DS:[ESI]
ESI=0000286E 
004010D9  03F3                  ADD ESI,EBX
ESI=71AB286E ASCII "MSWSOCK.AcceptEx" 
004010DB  8BC6                  MOV EAX,ESI
EAX=71AB286E ASCII "MSWSOCK.AcceptEx" 
004010DD  5E                    POP ESI
ESI=71AB0000 IMPORT "wsock32.#1139" 
004010DE  5B                    POP EBX
EBX=7FFDF000 
004010DF  C9                    LEAVE
EBP=0013FFF0 
004010E0  C2 0800              	RETN 8
===================================================================================
004010FC  68 0C204000          	PUSH 0040200C                        ASCII "AcceptEx"
00401101  56                    PUSH ESI
00401102  FF15 00204000        	CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>]  DS:[00402000]=7C80AC28 (kernel32.GetProcAddress)

C:\WINDOWS\system32\kernel32.dll 
7C80AC28  8BFF                  MOV EDI,EDI
7C80AC2A  55                    PUSH EBP
7C80AC2B  8BEC                  MOV EBP,ESP
EBP=0013FFB0 
7C80AC2D  51                    PUSH ECX
7C80AC2E  51                    PUSH ECX
7C80AC2F  53                    PUSH EBX
7C80AC30  57                    PUSH EDI
7C80AC31  8B7D 0C              	MOV EDI,DWORD PTR SS:[EBP+C]
EDI=0040200C ASCII "AcceptEx" 
7C80AC34  BB FFFF0000          	MOV EBX,0FFFF
EBX=0000FFFF 
7C80AC39  3BFB                  CMP EDI,EBX
7C80AC3B  0F86 571C0000        	JBE 7C80C898
7C80AC41  57                    PUSH EDI
7C80AC42  8D45 F8              	LEA EAX,DWORD PTR SS:[EBP-8]
EAX=0013FFA8 
7C80AC45  50                    PUSH EAX
7C80AC46  FF15 8812807C        	CALL DWORD PTR DS:[<&ntdll.RtlInitString>]  DS:[7C801288]=7C90125C (ntdll.RtlInitString)
EAX=00000000 ECX=00000008 EDX=0013FFA8 
7C80AC4C  8D45 0C              	LEA EAX,DWORD PTR SS:[EBP+C]
EAX=0013FFBC 
7C80AC4F  50                    PUSH EAX
7C80AC50  6A 00                	PUSH 0
7C80AC52  8D45 F8              	LEA EAX,DWORD PTR SS:[EBP-8]
EAX=0013FFA8 
7C80AC55  50                    PUSH EAX
7C80AC56  6A 00                	PUSH 0
7C80AC58  FF75 08              	PUSH DWORD PTR SS:[EBP+8]            Stack SS:[0013FFB8]=71AB0000 (wsock32.#1139)
7C80AC5B  E8 C2ECFFFF          	CALL 7C809922
EAX=71AB0000 IMPORT "wsock32.#1139" 
7C80AC60  50                    PUSH EAX
7C80AC61  E8 B7FFFFFF          	CALL <JMP.&ntdll.LdrGetProcedureAddress>
EBX=00000000 EBP=0013FB8C ESI=00000000 EDI=00000000 
C:\WINDOWS\system32\ntdll.dll 
7C90EB94  C3                    RETN
EAX=00000000 ECX=7C919AEB EDX=7C97C0D8 EBX=0000FFFF EBP=0013FFB0 ESI=71AB0000 IMPORT "wsock32.#1139" EDI=0040200C ASCII "AcceptEx" 
C:\WINDOWS\system32\kernel32.dll 
7C80AC66  85C0                  TEST EAX,EAX
7C80AC68  0F8C DE830000        	JL 7C81304C
7C80AC6E  6A 00                	PUSH 0
7C80AC70  FF75 08              	PUSH DWORD PTR SS:[EBP+8]            Stack SS:[0013FFB8]=71AB0000 (wsock32.#1139)
7C80AC73  E8 AAECFFFF          	CALL 7C809922
EAX=71AB0000 IMPORT "wsock32.#1139" 
7C80AC78  3945 0C              	CMP DWORD PTR SS:[EBP+C],EAX        	Stack SS:[0013FFBC]=71A378A4
7C80AC7B  0F84 12600300        	JE 7C840C93
7C80AC81  8B45 0C              	MOV EAX,DWORD PTR SS:[EBP+C]
EAX=71A378A4 
7C80AC84  5F                    POP EDI
EDI=7C910738 
7C80AC85  5B                    POP EBX
EBX=7FFDF000 
7C80AC86  C9                    LEAVE
EBP=0013FFF0 
7C80AC87  C2 0800              	RETN 8

C:\Templates\MyProject\release\MyProject.exe 
00401108  33C0                  XOR EAX,EAX
EAX=00000000 
0040110A  5E                    POP ESI
ESI=FFFFFFFF 
0040110B  C3                    RETN
ЗЫ: Вообщем потом когда время появится, попробую его "оживить" :)
 
Я не понял, хеши изначально битые или после распаковки?

По поводу асмирования в студии вот годных видео пак. Все разжевано на столько, что даже английский знать не требуется.

P.S. Формат "реверс-онлайн" мне больше нравится. Все последовательно, как есть.
 
http://msdn.microsoft.com/en-us/library/wi...4(v=vs.85).aspx

Note The function pointer for the AcceptEx function must be obtained at run time by making a call to the WSAIoctl function with the SIO_GET_EXTENSION_FUNCTION_POINTER opcode specified. The input buffer passed to the WSAIoctl function must contain WSAID_ACCEPTEX, a globally unique identifier (GUID) whose value identifies the AcceptEx extension function. On success, the output returned by the WSAIoctl function contains a pointer to the AcceptEx function. The WSAID_ACCEPTEX GUID is defined in the Mswsock.h header file.

Код:
    // Load the AcceptEx function into memory using WSAIoctl.
    // The WSAIoctl function is an extension of the ioctlsocket()
    // function that can use overlapped I/O. The function's 3rd
    // through 6th parameters are input and output buffers where
    // we pass the pointer to our AcceptEx function. This is used
    // so that we can call the AcceptEx function directly, rather
    // than refer to the Mswsock.lib library.
    iResult = WSAIoctl(ListenSocket, SIO_GET_EXTENSION_FUNCTION_POINTER,
             &GuidAcceptEx, sizeof (GuidAcceptEx), 
             &lpfnAcceptEx, sizeof (lpfnAcceptEx), 
             &dwBytes, NULL, NULL);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"WSAIoctl failed with error: %u\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

к тому же, функция поиска ашпишек не учитывает форварды
 
Изначально читая обзор показалось что автор бота сделал защиту от реверса и антиэмуль в одном флаконе, т.е. если снять upx то идет порверка и в случае снятия подсовывается левая таблица хэшей, но оказалось собственная функа получения адреса апи по её хэшу криво реализованна.

p.s. В одном из журналов группы 29A видел функцию GetAddressByHash нормальную, возможно её стоит заменить вместо той что сейчас...
 
Вау, оперативно, только я вроде нормальный билд давал т.е. с ровными хешами, хотя могу ошибаться, накануне какраз менял хеш функцию, возможно где-то и накосячил. в пм, я заменю. Насчет ebx да, по моей задумке это будет обламывать эмуляторы, но как оказалось на практике обламвает только не опытных криптовщиков, но в большинстве своем они справляются.
 
E.N.G.Land пишет:
Я не понял, хеши изначально
Ну да, выходит что так...

demien пишет:
но оказалось собственная функа получения адреса апи по её хэшу криво реализованна.
Да нет, тут функа получения адреса апи по её хэшу - нормальная, он видно когда:
waahoo пишет:
накануне какраз менял хеш функцию, возможно где-то и накосячил.
менял, забыл изменить таблицу хэшей (или если хэши генерируются статически, то тогда функцию, генерирующую эти хэши) - отсюда соответственно и нерабочий кхе-кхе получаем
эт в принципе мелочи (такое бывает, я обычно, перед тем как... всегда делаю тест), важным для всего ПО является сам факт поддержки и при обнаружении бага, своевременный и быстрый фикс, без всяких "там вышла новая версия - обновления платные"

waahoo пишет:
я вроде нормальный билд давал т.е. с ровными хешами
Ну, мне какбэ нет смысла пиздеть, у меня вроде есть сервис и если я тут даже по-минимуму облажаюсь - это удар по моей репе, падение заказов и т.д., и тем более проверить это элементарно...
Да и вообще я чет не понял, а зачем надо было просить сделать обзор, когда вроде есть же уже!?
Я вот только сейчас увидел (ппц), правда я специально не стал читать что там el- нареверсил, но зачем нужен второй обзор - мне непонятно, я врятли что-то новое напишу, тем более у меня не так много опыта как у el-
 
Да и вообще я чет не понял, а зачем надо было просить сделать обзор, когда вроде есть же уже!?
Я вот только сейчас увидел (ппц), правда я специально не стал читать что там el- нареверсил, но зачем нужен второй обзор - мне непонятно, я врятли что-то новое напишу, тем более у меня не так много опыта как у el-
практически весь код был переписан с момента реверса от эля. цель повторного реверса в том, чтобы появилось другое мнение от компетентного специалиста, я же не просил просто выложить листинги кода с ольги, типа "вот вам листинг, смотрите сами". в данном случае интересно именно твое мнение, замечания и критика.
 
waahoo пишет:
в данном случае интересно именно твое мнение, замечания и критика.
Ну если уж сравнивать с длоадером (скажем так, с него все и началось), то там сразу воняет копипастому и вот даже как-то имею большие подозрения что он за год ничего особо нового там и не сделал, у тебя сразу чувствуется живой код. (не знаю правда че там дальше будет, пока еще не смотрел)
У меня ведь тоже есть свой лоадер, но только у меня все кардинально отличается от остального подобного софта (ИМХО)
Допустим у меня нет админки вообще, все команды и модули получает лоадер из
иконок favicon.ico, которые залиты на похеканые сайты или из аватарок залитых на различных форумах
Эт конечно трудно будет осознать вот так сразу, но...
 
Чет в глазах уже рябит от этого говно-кода:
Код:
00401674 0DC 85 C0                   test    eax, eax
00401676 0DC 74 07                   jz      short loc_40167F
00401678 0DC 3D 00 00 00 80          cmp     eax, 80000000h
0040167D 0DC 73 2B                   jnb     short loc_4016AA
Не проще ли заменить на такой:
Код:
85C0                   test eax,eax
7C 2B                  jl short loc_4016AA
Или на такой:
Код:
85 C0                   test    eax, eax
75 2B                   jnz      short loc_4016AA
ЗЫ: Ну, это так - мысли вслух :)

waahoo пишет:
практически весь код был переписан с момента реверса от эля.
Сейчас почитал че там el- написал, ну так слету ниче нового - начало такое же, если не придираться к мелочам типа: (я правда дальше "инжекта" еще не смотрел)
el- пишет:
И так, все начинается с проверки является ли данная ось 64 разрядной по средством вызова IsWow64Process из импорта, и если нет, то все завершается, тут сразу два минуса, первый это..., а вторая то что апиха дергается из импорта, а если верить msdn Minimum supported client: Windows Vista, Windows XP with SP2, бинарник просто не запустится на осях ниже, в самом msdn советуют дергать её динамически.
waahoo пишет:
пофиксил, апи теперь дергается динамически.
Все в конце пришло к своему логическому завершению, а именно ZwQueryInformationProcess и ProcessWow64Information
Достаточно было посмотреть на код функции IsWow64Process и сделать "также"

00401637 FF55 FC CALL DWORD PTR SS:[EBP-4] kernel32.CreateProcessA
Тут после CreateProcess нужен Sleep (100-500). Бывает, что система немного загружена (особенно при пробиве хрома, эт когда юзается уязвимость и сразу происходит инжект..) и возникает необходимость передачи управления системе, иначе процесс имеет шанс не успеть быть "инициализированным" и андромеда не "проинсталицца", а это какбэ потеря траффа..
Вообще не надо стесняться юзать Sleep - это очень мощная штука!

На счет ZwAllocateVirtualMemory и ZwFreeVirtualMemory что выделяет и убивает память для строки C:\WINDOWS\system32\wuauclt.exe...
Их можно вообще убрать, просто для этой строки выделить память в секции для НЕ инициализированных данных (BBS) - фактически в файле место занимать не будет, а система потом сама при мапинге выделит память ну и код естественно станет на "пару сотен" байт меньше
Я так заметил, размер лоадера тебя не сильно волнует, но там есть еще, где можно уменьшить размер - ИМХО
Вообщем я бы на твоем месте подумал над уменьшением размера, мой, к примеру (не упакованный), весит 8kb
Я, к примеру, лоадер сразу вешаю на уязвимости (зашиваю в шелл) и поэтому размер для меня, к примеру, имеет актуальность...

Пока все, потом позже еще сделаю реверс более основательно, просто сейчас времени катастрофически не хватает
ЗЫЫ: Все-таки завидую тем, кто вот так просто жгет свое время почем зря, сидя в кон...

higaru пишет:
поставили бы хайд чуть меньше
Да итак меньше уже некуда, я вообще хотел 100 ставить, но потом глянул, а у waahoo - 50
Да и там ничего особо-то ценного и нет, просто скрыл от глаз аверов...
 
Чет в глазах уже рябит от этого говно-кода:
Код|Code

00401674 0DC 85 C0 test eax, eax
00401676 0DC 74 07 jz short loc_40167F
00401678 0DC 3D 00 00 00 80 cmp eax, 80000000h
0040167D 0DC 73 2B jnb short loc_4016AA

Не проще ли заменить на такой:
Код|Code

85C0 test eax,eax
7C 2B jl short loc_4016AA

Или на такой:
Код|Code

85 C0 test eax, eax
75 2B jnz short loc_4016AA

ЗЫ: Ну, это так - мысли вслух
я так понимаю что это макросы наделали



Вообще не надо стесняться юзать Sleep - это очень мощная штука!
но это ведь непохек. а вдруг "системе" понадобится не 100мс а 101 ? нужно искать правильные подходы.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вообще не надо стесняться юзать Sleep - это очень мощная штука!
Если я не ошибаюсь, waahoo постоянно вместо этой функи использует нативную NtDelayExecution (вроде верно написал), т.к. на каком-то сервиспаке слип давал глюки.
ЗЫЫ: Все-таки завидую тем, кто вот так просто жгет свое время почем зря, сидя в кон...
Конфа это не только треп, но и оперативная помощь по кодингу. Бывает иногда что-то срочно надо спросить,мелочь какую-то, но сам не решаешь. Сразу открыл конфу и спросил. А флудить в конфе никто не принуждает, большинство тупо сидят целый день онлайн, занимаясь своими вопросами.
 
Да итак меньше уже некуда, я вообще хотел 100 ставить, но потом глянул, а у waahoo - 50
Да и там ничего особо-то ценного и нет, просто скрыл от глаз аверов...
просто форум не настолько живой, и у многих норм. юзеров довольно мало сообщений (хыхы, я не только про себя).
 
Чет в глазах уже рябит от этого говно-кода:
Код|Code

00401674 0DC 85 C0                  test    eax, eax
00401676 0DC 74 07                  jz      short loc_40167F
00401678 0DC 3D 00 00 00 80          cmp    eax, 80000000h
0040167D 0DC 73 2B                  jnb    short loc_4016AA
этот говнокод на самом деле делает макрос и сделано это не просто так, иногда NativeApi возвращает не ERROR_SUCCESS тем не менее нормально отработав, так вот коды ниже 80000000h это всего лишь уведомления о каких то неточностях, а вот выше уже ошибка. можешь посмотреть на примере NtMapViewOfSection когда смапить ты пытаешься секцию созданную из PE файла с флагом SEC_IMAGE, а т.к. мне не известны все возможные варианты развития событий на всевозможных сервиспаках сделано именно так.
00401637 FF55 FC CALL DWORD PTR SS:[EBP-4] kernel32.CreateProcessA
Тут после CreateProcess нужен Sleep (100-500). Бывает, что система немного загружена (особенно при пробиве хрома, эт когда юзается уязвимость и сразу происходит инжект..) и возникает необходимость передачи управления системе, иначе процесс имеет шанс не успеть быть "инициализированным" и андромеда не "проинсталицца", а это какбэ потеря траффа..
Вообще не надо стесняться юзать Sleep - это очень мощная штука!
учту в будущем.
насчет размера, можно сократить, до 10-12кб, у меня полезная нагрузка "разбавлена" для нормализации энтропии, просто иногда я сам для себя делаю FUD билды чтобы не прибегать к услугам крипторов и получать максимальное время жизни не зависящее от криптора.
 
accwranadm
NtMapViewOfSection когда смапить ты пытаешься секцию созданную из PE файла с флагом SEC_IMAGE
Это наверно STATUS_IMAGE_NOT_AT_BASE - 0x40000003. С Fs-апи такие проверки нужны. Но на Ps/Se/Mm/Ob.. достаточно проверить что !STATUS_SUCCESS. Вот формат кода:
Код:
//  Values are 32 bit values layed out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +---+-+-+-----------------------+-------------------------------+
//  |Sev|C|R|     Facility          |               Code            |
//  +---+-+-+-----------------------+-------------------------------+
//
//  where
//
//      Sev - is the severity code
//
//          00 - Success
//          01 - Informational
//          10 - Warning
//          11 - Error
//
//      C - is the Customer code flag
//
//      R - is a reserved bit
//
//      Facility - is the facility code
//
//      Code - is the facility's status code
//
//
// Define the facility codes
//
#define FACILITY_USB_ERROR_CODE          0x10
#define FACILITY_TRANSACTION             0x19
#define FACILITY_TERMINAL_SERVER         0xA
#define FACILITY_SXS_ERROR_CODE          0x15
#define FACILITY_RPC_STUBS               0x3
#define FACILITY_RPC_RUNTIME             0x2
#define FACILITY_IO_ERROR_CODE           0x4
#define FACILITY_HID_ERROR_CODE          0x11
#define FACILITY_FIREWIRE_ERROR_CODE     0x12
#define FACILITY_DEBUGGER                0x1
#define FACILITY_COMMONLOG_ERROR_CODE    0x1A
#define FACILITY_CLUSTER_ERROR_CODE      0x13
#define FACILITY_ACPI_ERROR_CODE         0x14


//
// Define the severity codes
//
#define STATUS_SEVERITY_WARNING          0x2
#define STATUS_SEVERITY_SUCCESS          0x0
#define STATUS_SEVERITY_INFORMATIONAL    0x1
#define STATUS_SEVERITY_ERROR            0x3
STATUS_SEVERITY_SUCCESS - для этого и ветвление Jl.

Асинхронное ожидание окончания инит процесса это изврат. Синхронизировать нужно, к примеру мб фаер вывел запрос на действие - таймаут будет.
 
waahoo пишет:
этот говнокод на самом деле делает макрос и сделано это не просто так, иногда NativeApi возвращает не ERROR_SUCCESS тем не менее нормально отработав, так вот коды ниже 80000000h это всего лишь уведомления о каких то неточностях, а вот выше уже ошибка.
Ага, а я оказываецца и не знал %)))))
Ну какбэ, если мне память не изменяет, то:
Код:
85C0                  test eax,eax
7C 2B                  jl short loc_4016AA
jl это как раз и есть эквивалент твоему макросу :)
ЗЫ: Ладно, я так понял тебя вообще нах не интересует критика по асм-коду

DeusEx пишет:
а вдруг "системе" понадобится не 100мс а 101 ?
Ну сталобыть какбэ, ставь 500 %)))

DeusEx пишет:
но это ведь непохек. [...] нужно искать правильные подходы.
А у мну иммунитет от трупохека %)))
Ну, давай поищем "правильные подходы"
Создадим примитивную условную ситуацию, допустим наш лоадер успешно заинсталился на комп, но там за компом сидит немного продвинутый юзер
Назовем его условно "сниффающий мальчег", он там сидит за Wireshark и пасет за.., ну скажем за пакетами онлайн игрушки и еще у него установлена какая-нибудь адская стена
Возьмем за основу процесс, который юзается в андромеде wuauclt.exe - обновление ведра
Теперь делаем фэйковый стук на сайт microsoft`а
У юзера на компе выскочит мессага предупреждающая, что процесс wuauclt ломится в инет, юзер будет смотреть и думать разрешать доступ или нет
Тут сработает СИ - юзер увидит, что это процесс обновления виндовс и что он стучится на сайт microsoft`а
Существует очень большой шанс, что юзер даст добро на доступ к инету, тем более, если учесть, что по моей статистике у большинства юзерей установлено что-то подобное:
Код:
Исправление для Windows XP (KB889320-v2)
Обновление для Windows XP (KB898461)
Базовый пакет поставщика службы криптографии смарт-карт (Microsoft)
Исправление для Windows XP (KB922120-v6)
Исправление для Windows XP (KB932716-v2)
Обновление безопасности для Windows Internet Explorer 7 (KB938127-v2)
Обновление безопасности для Windows XP (KB938464)
Исправление для Windows Media Format 11 SDK (KB939209)
Исправление для проигрывателя Windows Media 11 - (KB939683)
Исправление для Windows Media Player 11 (KB941282)
Обновление безопасности для Windows XP - (KB941569)
Исправление для Windows XP (KB942288-v3)
Обновление для Windows XP (KB943729)
Исправление для Windows XP (KB944043-v3)
Обновление безопасности для Windows XP (KB946648)
Обновление безопасности для Windows XP (KB950582)
Обновление безопасности для Windows XP (KB950762)
Обновление безопасности для Windows XP (KB950974)
Обновление безопасности для Windows XP (KB951066)
Обновление безопасности для Windows XP (KB951376-v2)
Обновление для Windows XP (KB951618-v2)
Обновление безопасности для Windows XP (KB951698)
Обновление безопасности для Windows XP (KB951748)
Исправление для Windows XP (KB951830)
Обновление для Windows XP (KB951978)
Исправление для Windows XP (KB952287)
Обновление безопасности для Windows XP (KB952954)
Обновление безопасности для Windows XP (KB953155)
Обновление безопасности для Windows XP (KB954211)
Обновление безопасности для Windows XP (KB954459)
Обновление безопасности для Windows XP (KB954600)
Исправление для Windows XP (KB954708)
Обновление для Windows XP (KB954920-v2)
Обновление безопасности для Windows XP (KB955069)
Обновление безопасности для Windows XP (KB955417)
Обновление для Windows XP (KB955839)
Обновление безопасности для Windows XP (KB956391)
Обновление безопасности для Windows XP (KB956802)
Обновление безопасности для Windows XP (KB956841)
Обновление безопасности для Windows XP (KB957095)
Обновление безопасности для Windows XP (KB957097)
Обновление безопасности для Windows Internet Explorer 7 (KB958215)
Обновление безопасности для Windows XP (KB958644)
Обновление для Windows XP (KB958655)
Обновление для Windows XP (KB958752)
Использование СИ в андромеде - это несомненный плюс андромеды по отношению к длоадеру, если их сравнивать
я там точно НЕ помню (а лезть смотреть чет нет вообще никого желания), но в длоадер по-моему и процесс другой svchost.exe и фэйкого стука нет и нет детекта IsWow64 и т.д. (ну эт та версия которую я смотрел, может в другой что и получше уже сделано)
Теперь пока юзер думает давать или нет доступ к инету, нам нужно сделать задержку, потому как если мы убьем коннект и сразу сделаем другой (к адменке), можем резко "обосраться"...
Выставим задержку (Sleep) в 15-20 секунд и потом пробздимся по процессам на поиск wireshark.exe и если он запущен, то делаем паузу (Sleep) на 10-30 минут и делаем повтор...
Детект wireshark.exe нужен для того чтобы сниффающий мальчег случайно не спалил наши "подозрительные" пакеты, при анализе пакетов от онлайн игрушки...
Сталобыть что за нахЪ трувелосипед тут нужно придумывать вместо непохека Sleep.. и че за "правильные подходы"... %)))
ЗЫЫ: давай ближе к теме - есть опыт поделись, нет - мимо...

P. S.
Чуть позже еще отпишусь, чет пара мыслей еще появилась...
 
KraZz
давай ближе к теме - есть опыт поделись, нет - мимо...
Опыт в чём, ковыряния в дизасме какойто очередной поделки ?

Зачем оно нужно, Sleep() и прочая ересь. Взял бы сурс выложил, ну или надыбал где.
 
jl это как раз и есть эквивалент твоему макросу smile.gif
да, пардон, запарил, что JL и JB разные вещи. и на самом деле ветвление JL в данном случае будет более оптимальным и уместным. :blush:
 
Сталобыть что за нахЪ трувелосипед тут нужно придумывать вместо непохека Sleep.. и че за "правильные подходы"... %)))
когда нужно сделать паузу, возражений нет, Sleep для этого и сделан.
но вы ведь предлогале использовать Sleep после CreateProcess чтобы "подождать" пока процесс проинициализируется. а если система не немного нагружено а достаточно сильно ? как рассчитать время для Sleep ?
для того чтобы посоветовать "правильный подход" нужно хотябы взглянуть на код, что там делается после createprocess ? мешают хайды, а телепатировать не так просто.
 
Вообще не надо стесняться юзать Sleep - это очень мощная штука!
DeusEx пишет:
когда нужно сделать паузу, возражений нет, Sleep для этого и сделан.

DeusEx пишет:
но вы ведь предлогале использовать Sleep после CreateProcess чтобы "подождать" пока процесс проинициализируется.
Indy пишет:
Асинхронное ожидание окончания инит процесса это изврат.
Бывает, что система немного загружена […] и возникает необходимость передачи управления системе...
Ожидание или "подождать" - это совсем не эквивалент фразе «передачи управления системе»
Sleep нужен НЕ для того чтобы ждать, а для того чтобы ПЕРЕДАТЬ.. Не надо придумывать или додумывать того чего нет...
Просьба читать внимательнее или даже по возможности перечитывать то, что написано!
Иначе топик превратится в чтение матчасти и вообще перестанет быть похожим на "реверс-онлайн"

Indy пишет:
Опыт в чём, ковыряния в дизасме
Да опыта, наверное, никакого и нет, смысл тут прост и очевиден
Ar3s пишет:
интересно было бы узнать твое мнение о andromeda loader. несмотря на то, что он написан нашим модером - критика всегда приветствовалась.
waahoo пишет:
цель повторного реверса в том, чтобы появилось другое мнение от компетентного специалиста, я же не просил просто выложить листинги кода с ольги, типа "вот вам листинг, смотрите сами". в данном случае интересно именно твое мнение, замечания и критика.
Не знаю правда как там у меня получается, со стороны виднее так-то
И мну, нихера ни разу НЕ специалист, но решил вот так компенсировать свое отсутствие в конфе и немного оживить форум. короче.. как-нибудь прорвемся %)))))

Indy пишет:
очередной поделки
Гы-гы, ну ты вначале попробуй написать такую "поделку" (ты только и можешь что я-я, джастишь-фонтастишь и ппц), я вот от тебя, кроме "десяти" строк кода и флейма, ничего больше и не видел %)))
Ты вот напиши, а потом попробуй выдержать 1kk онлайн, когда смотришь на стату, а там счетчик в минус уходит как миллисекунды
Будет тебе просто нереально охуенный опыт, когда просто подумав одну минуту, ты можешь уже не досчитаться 10k и более... %)))))
ЗЫ: имеем то, что имеем и заканчиваем уже, зачем и почему, если дальше пойдет такой флейм я просто "закрою" топик и все...
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх