Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Исследование ASProtect 1.2

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Статью написал: Wersion <wcrkgroup2002@mail.ru>
Статья создана: 03.12.2002

Введение

Наконец-то появилось время написать статью про ASProtect новых версий. Я собрал всё лучшее, что читал про него и решил сделать нечто более-менее понятное.

Итак, что нам нужно:
Liatro Button Maker 2.2-наша цель.

Инструменты:
[LordPE] by Yoda
[IceDump] v 6.x. //он заменит нам ручку с бумагой
[SoftIce] 4.x.
[W32Dasm] v. 8.93
[ResHacker] v 3.2
[Hiew 32] v 6.55
[Super BPM]
[Import Reconstructor] v 1.42 & plugin(s)
[Microsoft Visual Studio*] v 6.0
точнее, нам понадобится его редактор ресурсов.
В оригинале сия программа занимает ~300 МБ, и т.к. немного неудобно всё это
покупать и/или устанавливать, то я в своё время сократил его до 1.5 МБ - это уже можно
скачать. Правда, на чужом компьютере я своё творение не испытывал, и тот, кто захочет
испробовать эту поистине замечательную вещь, может написать на wcrkgroup2002@mail.ru.
И если программа будет у вас отлично работать, то я выставлю её на http://k2wincrk.boom.ru.

Исследование

Приступим непосредственно к исследованию. Сначала посмотрим нашу прог-му в LordPE и ResHacker'е.
Налицо все признаки ASProtect'a. Т.е. точка входа 0x1000, характеристики секций C0000040 и повреждённые
ресурсы. Итак, что же нам надо сделать?
Узнать Original Entry Point, запустить программу,
остановить на OEP. Затем сдампить, подправить Exe-file, задать Original Entry Point.
Потом выкинуть куски ASProtect'a, оставшиеся в теле программы, подправить ресурсы и
вставить оригинальную таблицу импорта, которую тоже надо добыть.

Реализация:
1. Нахождение OEP.
Немного теории. Любая (практически) программа желает знать адрес, по которому она загружена.
Для этого используется:

HMODULE GetModuleHandle(

LPCTSTR lpModuleName // address of module name to return handle for

);

Соответственно, чтобы получить собственный Handle, в качестве параметра надо передать
NULL или по-нашему 0. Очевидно, все эти события происходят недалеко от OEP.
(Обычно в 1-м call-e). Следовательно, наша задача - поймать этот момент.
В SoftIce'е: bpx GetModuleHandleA if(*(esp+4)==0) //Не забудьте сделать FAULTS OFF.
Каждый раз, когда срабатывает наш брейкпоинт, смотрим на стек.(dd esp).
Когда увидите в памяти адреса, похожие на программные, снимайте брейкпоинт (bd *).
Жмём F12, пока не увидим следующее:

EAX=00000001 EBX=00660000 ECX=000003F8 EDX=00BE003C ESI=816C9018
EDI=00000000 EBP=0076FE38 ESP=0076FDC0 EIP=0042F278 o d I s z a p c
CS=016F DS=0177 SS=0177 ES=0177 FS=1F77 GS=0000

--------------------------------------------------dword-------------PROT---(0)--
0177:0076EB70 00434D12 00000000 816C9018 00434E6A .MC.......l.jNC. .
0177:0076EB80 0076FDB0 00660000 00000000 00000000 ..v...f......... .
0177:0076EB90 00000000 00000000 00000000 00000000 ................
0177:0076EBA0 00000000 00000000 00000000 00000000 ................
0177:0076EBB0 00000000 00000000 00000000 00000000 ................
0177:0076EBC0 00000000 00000000 00000000 00000000 ................ .
0177:0076EBD0 00000000 00000000 00000000 00000000 ................ .
-------------------------------------------------------------------------PROT32-
016F:0042F258 890D940E4D00 MOV [004D0E94],ECX .
016F:0042F25E C1E108 SHL ECX,08 .
016F:0042F261 03CA ADD ECX,EDX
016F:0042F263 890D900E4D00 MOV [004D0E90],ECX
016F:0042F269 C1E810 SHR EAX,10
016F:0042F26C A38C0E4D00 MOV [004D0E8C],EAX
016F:0042F271 6A01 PUSH 01
016F:0042F273 E8FF5B0000 CALL 00434E77
016F:0042F278 59 POP ECX (X)
016F:0042F279 85C0 TEST EAX,EAX
016F:0042F27B 7508 JNZ 0042F285
016F:0042F27D 6A1C PUSH 1C
016F:0042F27F E8C3000000 CALL 0042F347
016F:0042F284 59 POP ECX
016F:0042F285 E8B2350000 CALL 0043283C
016F:0042F28A 85C0 TEST EAX,EAX
016F:0042F28C 7508 JNZ 0042F296
016F:0042F28E 6A10 PUSH 10
016F:0042F290 E8B2000000 CALL 0042F347
016F:0042F295 59 POP ECX .
016F:0042F296 33F6 XOR ESI,ESI . . .
------------------------------------PACKEDLBMAKER!+0002E258---------------------
:dd esp
:bd *
:/screendump C:\dump1.dos

Packedlb
Для проверки того, что это действительно начало программы, можно ещё раз нажать F12,
произойдёт обычный её запуск. Потом опять доберитесь до этого места.
Пролистайте вверх, пока не увидите:

016F:0042F21A 55 PUSH EBP (1)
016F:0042F21B 8BEC MOV EBP,ESP
016F:0042F21D 6AFF PUSH FF
016F:0042F21F 68E04E4B00 PUSH 004B4EE0
016F:0042F224 68DC4E4300 PUSH 00434EDC
016F:0042F229 64A100000000 MOV EAX,FS:[00000000]
016F:0042F22F 50 PUSH EAX
016F:0042F230 64892500000000 MOV FS:[00000000],ESP
016F:0042F237 83EC58 SUB ESP,58
016F:0042F23A 53 PUSH EBX
016F:0042F23B 56 PUSH ESI
016F:0042F23C 57 PUSH EDI
016F:0042F23D 8965E8 MOV [EBP-18],ESP
016F:0042F240 FF1548B44A00 CALL [004AB448]

Видно, что (1) - это OEP.
Как снимается после этого что-нибудь простое, типа ASPack*** ?
Ставиться брейкпоинт на OEP, вписывается туда JMP EIP. Потом дампиться и в Entry Point ставиться OEP - Image Base, правиться в Hiew, ну и всё.
Но Alexey Solodovnikov не так-то прост. Во-первых, он выкинет все ваши брейкпоинты,
а если вам (как и мне) удасться их сохранить, то вам дадут Protection Error 15,
т.к. ASProtect в самый последний момент проверяет целостность кода.

И что же делать-то ?

Обратимся опять к теории. У каждого, кто занимается распаковкой и не лишен мозгов,
возникает вопрос: а почему, собственно, надо зацикливать программу?
Правда, его редко задают и этим самым ограничивают себя. А надо бы знать, что
программа при запуске много чего инициализирует в секции данных и даже кода. Соответственно, когда дамп пытается повторить сделанную им в "прошлой жизни" операцию,
у него ничего не выходит. Так получим же чистый, "ещё не работавший" файл.
Для этого перед исследованием запустим Super BPM(c флажком Erase), очутившись в позиции Х
поставим брейкпоинт: bpm 42F21A R //our OEP
Теперь каждый раз, попадая в SoftIce, делаем u 0x42F21A. Как только видим нормальный код,
зацикливаем программу, дампим с помощью Lord PE и убиваем её. Проследите, чтобы были включены
опции 1,2 и последняя в Task Viewer. Потом открываем файл в Visual Studio, сохраняем
ресурсы как один .res файл. Затем заходим в ResHacker, и делаем Update All Resources
нашему дампу. Теперь вычисляем и выставляем OEP и смело вырезаем код
ASProtect'a из программы(2 последние секции). Как это делается:
Truncate at section start & Wipe Section Header. Операцию начинать с конца.

Восстановление таблицы импорта.

Запускаем нашу программу. Запускаем Import Reconstructor. Пишем в OEP 2F21A.
Затем Iat Autosearch; Get Imports. Видим много неправильного. Прежде чем всё это исправлять,
посмотрим, нет ли здесь откровенного бреда. Вот и он:

FThunk: 000AB830 NbFunc: 0000000D
0 000AB830 ? 0000 00401360(1)
0 000AB834 ? 0000 00401210
0 000AB838 ? 0000 004011E0
0 000AB83C ? 0000 00401190
0 000AB840 ? 0000 0041C0E0
0 000AB844 ? 0000 0041C0C0
0 000AB848 ? 0000 0041C0A0
0 000AB84C ? 0000 0041C040
0 000AB850 ? 0000 0041C020
0 000AB854 ? 0000 0041C000
0 000AB858 ? 0000 0042DCB0
0 000AB85C ? 0000 0042DCA0
0 000AB860 ? 0000 00401130(L)

Адреса 1..L не принадлежат ни к чему, относящемуся к Import Table.
Поэтому убираем их через контекстное меню->Delete thunk(s).
Далее Show Invalid, Trace Level 1, ASProtect Plug-in. Найдутся все функции кроме одной.
Самый простой способ узнать её - посмотреть, чего здесь не хватает. Для этой цели я держу у
себя таблицы импортов нормальных программ (например "Блокнота"). Итак, наша функция
-GetProcAddress. Дважды щёлкаем и выбираем. Затем Fix Dump. Флажок Add New Section должен
стоять. В принципе, уже всё. Теперь в дело идёт PE Editor. Переименуйте секции по вкусу,
первой поставьте E0000020, чтобы можно было нормально дизассемблировать.
Далее Rebuild PE, в PE Rebuilder's Options выставьте всё, кроме того, что связано с Import Table
& Image Base
.

ОРИГИНАЛ ВОССТАНОВЛЕН!

Собственно взлом. В регистрационном диалоге вводим наши данные. В SoftIce'e:bpx hmemcpy
Жмём "Unlock", В SoftIce'e:bd *; F12 пока не увидим:

016F:00411EEB 6A01 PUSH 01
016F:00411EED E8F19C0600 CALL 0047BBE3
016F:00411EF2 8DBE98010000 LEA EDI,[ESI+00000198]
016F:00411EF8 8BCF MOV ECX,EDI
016F:00411EFA E818470600 CALL 00476617
016F:00411EFF 8BCF MOV ECX,EDI
016F:00411F01 E8C5460600 CALL 004765CB
016F:00411F06 8D9E9C010000 LEA EBX,[ESI+0000019C]

Ниже видим такой код:

016F:00411F50 51 PUSH ECX
. 016F:00411F51 52 PUSH EDX
016F:00411F52 B9A8ED4C00 MOV ECX,004CEDA8
016F:00411F57 E824030000 CALL 00412280 (1)
016F:00411F5C 85C0 TEST EAX,EAX
016F:00411F5E 7422 JZ 00411F82
016F:00411F60 6AFF PUSH FF
016F:00411F62 6A00 PUSH 00
016F:00411F64 68CD000000 PUSH 000000CD
016F:00411F69 E857410700 CALL 004860C5
016F:00411F6E 8B06 MOV EAX,[ESI]
016F:00411F70 8BCE MOV ECX,ESI
016F:00411F72 FF90C8000000 CALL [EAX+000000C8]
016F:00411F78 5F POP EDI
016F:00411F79 5E POP ESI
016F:00411F7A 5B POP EBX
016F:00411F7B 81C400020000 ADD ESP,00000200
016F:00411F81 C3 RET
. 016F:00411F82 6AFF PUSH FF

Нам надо, чтобы после (1) в EAX оказалось 1.
Зайдём туда.

* Referenced by a CALL at Addresses:
|:00408AC8 , :0040982B , :00409E18 , :0041199C , :00411F57
|:004126D0 , :00413E7A , :004151C0
|
:00412280 81ECB4000000 sub esp, 000000B4
:00412286 56 push esi
:00412287 8BF1 mov esi, ecx
:00412289 8B5604 mov edx, dword ptr [esi+04]
:0041228C 85D2 test edx, edx
:0041228E 750C jne 0041229C
:00412290 33C0 xor eax, eax
:00412292 5E pop esi
:00412293 81C4B4000000 add esp, 000000B4
:00412299 C20800 ret 0008

Внесём необходимые изменения с помощью Hiew.

:0041228C 33C0 xor eax, eax
:0041228E 40 inc eax
:00412290 909090 - NOP,NOP,NOP


ВСЁ! ПРОГРАММА ЗАРЕГИСТРИРОВАНА!

Кладите в архив и добавляйте *.nfo.

ПРИМЕЧАНИЯ.

Если ASProtect всё-таки умудрился отключить ваши брейкпоинты, сделайте в Softice:
be [номер брейкпоинта].




Обсуждение статьи: Исследование ASProtect 1.2 >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS