Распаковка xtreamlok by Spiteful

 

Как-то прослушивая музончик блэковой Dimmu Borgir, я задался вопросом, а что же такое они там ревут… вроде б по-английски, но как-то неразборчиво %) и тут решил я опробовать программку LyricsGrabber, которая неожиданно оказалась shareware.  Peid показал Softwrap (encrypted) main stub / Xlok. Информации по данной штуке в сети оказалось мало, поэтому я решил написать маленький туториал по отковыриванию этого чуда. J

 

Инструменты:

OllyDbg

LordPE

Hiew

Imprec

 

Как видно при запуске программы, она защищена продуктом фирмы Softwrap, и триальное окошко предлагает Try ,Buy, Reinstall… чтобы не очень трепать себе нервы с реализованным в этом продукте антитрейсом, проще всего приаттачить Olly к процессу как раз когда появляется это триальное окошко. После того как olly подключится к процессу надо поставить в Memory Window бряк на доступ к секции .text, так можно довольно быстро отловить прыжок на OEP, ну и нажать кнопу Try. У меня Olly останавливается на инструкции UD2, но это вообще-то не важно, Shift+F9 и оказываемся на таком коде:

 

00443E1B    XOR AL,BYTE PTR DS:[ESI]

00443E1D    MOV BL,AL

00443E1F    SHR EAX,8

00443E22    XOR EAX,DWORD PTR DS:[EBX*4+E10000]

00443E29    INC ESI

00443E2A   DEC DWORD PTR SS:[ESP+10]

00443E2E    JNZ SHORT LyricsGr.00443E19

00443E30    POP ESI

00443E31    POP EBX

00443E32    ADD DWORD PTR SS:[ESP],8

00443E36    RETN 8

 

Ставим брикпоинт на 443E36, т.к. особо интересного в этом подсчете CRC32 от секции кода нет. Остановившись на бряке надо опять поставить бряк на секцию .text, после F9 и мы снова окажемся на этом коде… повторим операцию с установкой бряка на секцию J

(во вкладке Options->Debugging Options ->Exceptions надо чтоб стояла галка напротив Single-Step Event), чтоб не отвлекаться на всякую ерунду…

И мы попадаем на код :

 

00441F3F    MOV EDX,DWORD PTR DS:[EAX]

00441F41    JNS SHORT LyricsGr.00441F51

00441F43    PUSH EAX

 

Если посмотреть содержимое EAX, то там как раз лежит OEP нашей программы. Можно поставить или HW бряк на выполнение кода по этому адресу, либо еще раз бряк на секцию .text J(в последнем случае надо пройти инструкцию по адресу 441F3F). Отпускаем программу и оказываемся

 

004023EC    PUSH LyricsGr.0040B7D4                   ; ASCII "VB5!6&*"

004023F1    CALL LyricsGr.004023E4

 

Прекрасно… программа написана на бейсике, что-ж можно смело делать дамп программы.

 

  А теперь самое интересное, это xtreamlok использует замангленый импорт, чтобы обойти это сделаем следующее, посмотрим куда ведет CALL по 4023E4 то увидим

004023E4    CALL DWORD PTR DS:[441298] и до этого идет очень много аналогичных вызовов. Зайдем и в этот CALL, видим следующее:

00443E39     PUSHFD

00443E3A    PUSH EAX

00443E3B    PUSH EBX

00443E3C    MOV EBX,DWORD PTR SS:[ESP+C]

00443E40    PUSH EBX

00443E41    SUB EBX,6

00443E44    PUSH 2711

00443E49    PUSH 0E40000

00443E4E    C3              RETN

===================================================================

00443E5F    PUSH 0

00443E61    PUSHFD

00443E62    PUSH EAX

00443E63    PUSH EBX

00443E64    MOV EBX,DWORD PTR SS:[ESP+10]

00443E68    PUSH EBX

00443E69    SUB EBX,6

00443E6C    PUSH 26E9

00443E71    PUSH 0E40000

00443E76    RETN

 

Выделенные адреса могут отличатся, протрассируем что же за процедура расположена по этом адресу

 

00E40000    PUSH EBP

00E40001    PUSH ESI

00E40002    PUSH EDI

00E40003    PUSH ECX

00E40004    PUSH EDX

00E40005    PUSH EAX

00E40006    MOV EBP,441766

00E4000B    ADD DWORD PTR SS:[ESP+18],EBP

00E4000F    SUB EBX,DWORD PTR SS:[EBP+2A96]

00E40015    MOV EDI,DWORD PTR SS:[EBP+2ADE]

00E4001B    MOV ECX,DWORD PTR SS:[EBP+2ADA]

00E40021    MOV EAX,EBX

00E40023    SUB EAX,DWORD PTR SS:[EBP+2AD2]

00E40029    SHR EAX,CL

00E4002B    MOV EAX,DWORD PTR DS:[EDI+EAX*4]

00E4002E    MOV ESI,EAX

00E40030    AND ESI,0FFFF

00E40036    SHR EAX,10

00E40039    MOV EDI,EAX

00E4003B    LEA EAX,DWORD PTR DS:[ESI+EDI]

00E4003E    MOV EDX,2D8774B2

00E40043    SHR EAX,1

00E40045    MOV ECX,EAX

00E40047    IMUL ECX,ECX,44DA6684

00E4004D    SUB EDX,ECX

00E4004F    MOV ECX,DWORD PTR SS:[EBP+2AFA]

00E40055    PUSH ECX

00E40056    MOV ECX,DWORD PTR DS:[ECX+EAX*8]

00E40059    XOR ECX,EDX

00E4005B    CMP ECX,EBX

00E4005D    POP ECX

00E4005E    JE SHORT 00E4006C

00E40060    JA SHORT 00E40067

00E40062    LEA EDI,DWORD PTR DS:[EAX+1]

00E40065    JMP SHORT 00E4003B

00E40067    LEA ESI,DWORD PTR DS:[EAX-1]

00E4006A   JMP SHORT 00E4003B

00E4006C    MOV EBX,DWORD PTR SS:[ESP+1C]

00E40070    XOR EDX,DWORD PTR DS:[ECX+EAX*8+4]

00E40074    MOVZX EBX,BYTE PTR DS:[EBX]

00E40077    SUB EDX,EBX

00E40079    MOV ESI,DWORD PTR SS:[EBP+2AEA]

 

Следует обратить внимание на выделенные строки , точнее посмотреть, что содержится в памяти

[EBP+2ADE]=[00444244]=00E60000

[EBP+2AEA]=[00444250]=00E30000

Судя по всему указатели на динамически выделенные участки памяти.

(значения в памяти могут отличаться)

С помощью LordPE делаем последовательный Dump Regions адресов 00E40000, 00E60000,00E30000, назовем файлы mang1,mang2,mang3.

 

Теперь в том же LordPE приклеим эти файлы как новые секции к дампу, load section from disk… Запоминаем (записываем ) Voffset этих секций 4C000, 4D000, 89000.

Так же необходимо чтобы загрузчик подгрузил нам бейсиковскую библиотеку к процессу, для чего в imprece вводим в окно RVA 000447AC и size 00000004 (можно в том же Peid подглядеть, где у оригинального exe msvbvm60.dll прописано), будет найдена одна функция чего нам вполне достаточно J

Только при добавлении импорта не забудьте указать OEP = 23EC

 

Осталось чуть-чуть – подправить ячейки где хранятся указатели на те адреса 0E40000, 00E60000…

А хранятся они по адресам 444244, 444250, 00443E4A, 00443E72 последние два адреса взяты как адреса инструкций (PUSH 0E40000) + 1. В Hiew меняем значения следующим образом

[444244]=44D000

[444250]=489000

[443E4A]=44C000

[443E72]=44C000 , т.е. к Voffset добаленых секций прибавили ImageBase модуля

После внесенных изменений попробуем запустить программу( под Olly ;) )…загружается и… Access violation по [0E40000], если глянуть EIP то он как раз указывает на этот самый адрес. Видимо в программе есть еще места где используется комбинация

push 0e40000

ret

Поищем эти команды в той же секции где располагались предыдущие - .xlok

В olly Search for -> Sequence of commands, вводим интересующие нас команды и обнаруживаем следующие адреса

004437AE    68 0000E400     PUSH 0E40000

004437B3    C3              RETN

 

004437C6    68 0000E400     PUSH 0E40000

004437CB    C3              RETN

 

Опять же в hiew правим

[4437AF]=44C000, [4437C7]=44C000

 

Запускаем программу… вроде работает J

 

P.S. если вам не понравился туториал или вы можете сделать лучше, то меня это совершенно не волнует J

 

Greets fly out to TSRh, ICU, SnD, Gelios, Noble Ghost, gloom, AvAtAr и всем кто меня знает J