Распаковка 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.
Так же необходимо чтобы загрузчик подгрузил нам бейсиковскую библиотеку к процессу, для чего в imprec’e вводим в окно 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