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

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


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

Реанимирование Advanced Serial Port Monitor 3.0.2

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

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: DFC <to_dfc@mail15.com>

Данный продукт можно скачать с сайта разработчика - http://www.aggsoft.com/

Препараты, использованные для реанимации:

SoftICE из состава DS 2.7
IceExt
Stripper v2.11 rc2
Loader 2.0 by syd
PEiD v0.92
HIEW

Вступление

В этой небольшой статье я не касаюсь вопроса распаковки этой программы, мы займемся оживлением дампа после распаковки. Итак, PEiD сказал нам - ASProtect 1.23 RC4 Registered -> Alexey Solodovnikov [Overlay]...Ну что же, натравим на эту прогу замечательную тулзу stripper v2.11 rc2 by syd, за что ему отдельное спасибо :)...Распаковали, запускаем, и что же мы видим…на какое-то мгновение появляется основное окно программы и затем закрывается. Хе-хе, приехали… похоже встроены проверки на наличие ASPr’а…не все белое и пушистое, да vdv ? :)…на то он и ASPr.

Реанимирование

Я пошел по пути трейсинга, и сравнения как ведет себя программа в упакованном варианте и как в дампе, и пользовался айсом, думаю и в Olly также можно все посмотреть…Активируем айс, чтобы не было проблем с обнаружением отладчика – активируем IceExt, в айсе сначала дадим команду !protect on, затем в нем даем команду I3HERE on, и по F5 закрываем его. Теперь запускаем Loader 2.0 by syd, используя кнопочку ‘open’ грузим в него упакованный вариант и жмем в Loader’е ‘break on OEP’, всплыл айс…Бряк bpm esp-4 здесь не катит, зато катит bpm esp-24, вот его и ставим, теперь 24 нажатия F5 и затем одно нажатие F12, попадем в процедуру затирания кода распаковщика, немного потрейсим по F10 до выхода, далее попадем на переходник GetModuleHandleA, ну и поехали…В упакованном варианте основное окно проявляется после выполнения call 0045EC60, это в этом куске кода:

 :005B7C57 68717C5B00        push 005B7C71
 :005B7C5C 64FF30            push dword ptr fs:[eax]
 :005B7C5F 648920            mov dword ptr fs:[eax], esp
 :005B7C62 E8F96FEAFF        call 0045EC60 // проявляет основное окно
 :005B7C67 33C0              xor eax, eax

А в дампе мы не доходим до этой процедуры, у нас раньше происходит ExitProcess, смотрим выше где это место, ага вот тут:

 :005B7C1D 648920            mov dword ptr fs:[eax], esp
 :005B7C20 E86B72EAFF        call 0045EE90
 :005B7C25 E8E672EAFF        call 0045EF10
 :005B7C2A E80973EAFF        call 0045EF38 // здесь прога закрывается
 :005B7C2F E84C73EAFF        call 0045EF80 // здесь сработает эксепшен
 :005B7C34 33C0              xor eax, eax

По адресу 005B7C2A у нас процедура call 0045EF38 и при ее выполнении у нас происходит ExitProcess, а в упакованном варианте все проходит нормально, лезем в эту процедуру и смотрим что у нас там, вот интересное место:

 :0045EF4B 8B35DC045C00      mov esi, dword ptr [005C04DC] // здесь лежит ImageBase (00400000)
 :0045EF51 8B463C            mov eax, dword ptr [esi+3C] // Offset to PE signature
 :0045EF54 8B440628          mov eax, dword ptr [esi+eax+28] // [PE+28h] здесь лежит EP
 :0045EF58 663D0010          cmp ax, 1000 // проверка адреса точки входа
 :0045EF5C 7404              je 0045EF62
 :0045EF5E 804DFF01          or byte ptr [ebp-01], 01
 :0045EF62 5E               pop esi
 :0045EF63 807DFF00          cmp byte ptr [ebp-01], 00
 :0045EF67 7413              je 0045EF7C
 :0045EF69 33C9              xor ecx, ecx
 :0045EF6B B201              mov dl, 01
 :0045EF6D A1A08C4000        mov eax, dword ptr [00408CA0]
 :0045EF72 E871E3FAFF        call 0040D2E8
 :0045EF77 E89C4AFAFF        call 00403A18

Смотрите, по адресу 0045EF58 у нас сравнивается значение ax с 1000, и если они равны, то переход по адресу 0045EF5C осуществляется, далее осуществится второй переход по адресу 0045EF67, т.к. в [ebp-01] нулевое значение, и затем выход из процедуры. Дак вот в упакованном варианте у нас в ax как раз 1000 и все переходы работают…догадываетесь, что это за проверка?...да Mario555, ты абсолютно прав :)…это проверка на упакованность программы ASPr’ом…по адресу 005C04DC лежит ImageBase и далее в eax загрузится EP проги, т.е. проверяется адрес точки входа, и в упакованных ASPr’ом прогах это значение обычно 1000h, но у нас дамп, и в ax будет уже совсем другое значение. Переход по адресу 0045EF5C не сработает и в [ebp-01] запишется 1-ка, соответственно при второй проверке переход по адресу 0045EF67 не состоится и далее ExitProcess. Чтобы нам это дело направить по нужной ветви, как в упакованном варианте, пропатчим условный переход по адресу 0045EF5C на безусловный. При трейсинге в айсе, можно просто, дойдя до этого перехода установить флаг нуля, чтобы переход состоялся, я надеюсь, вы знаете, как это сделать – клацаем мышкой в айсе по флагу z и затем клавишей Insert устанавливаем флаг, затем обратно кликнем мышкой по окну с кодом…прошли. Но как только выполним следующую процедуру call 0045EF80 по адресу 005B7C2F, смотрите выше в приведенном коде, то по exception вывалимся. Заглянем внутрь ее:

 :0045EF85 8B05327A4000      mov eax, dword ptr [00407A32]
 :0045EF8B 8B18              mov ebx, dword ptr [eax]
 :0045EF8D FF33              push dword ptr [ebx]
 :0045EF8F 895DFC            mov dword ptr [ebp-04], ebx
 :0045EF92 8F03              pop dword ptr [ebx] // здесь сработает эксепшен
 :0045EF94 8B45FC            mov eax, dword ptr [ebp-04]

Если посмотреть на код этой процедуры, то на первый взгляд можно сказать – да вроде бы как она ничего и не делает. Сохраняет в стеке 4 байта из памяти, по адресу, содержащемуся в ebx, и тут же их обратно восстанавливает, другими словами, просто их перезаписывает…но это не совсем так. Давайте посмотрим, что у нас за адрес фигурирует в ebx…Когда мы запускаем упакованный вариант, то там у нас наблюдается адрес ASPr’а (00B91500), теперь посмотрим, что будет при запуске дампа…ууупс, а там у нас в ebx грузится 77E7AD86 – адрес системной dll. Хех, давайте в сайсе дадим такую команду: u 77E7AD86 (Enter). И что мы видим – этот адрес относится к GetModuleHandleA. Догадываетесь теперь, что у нас за адрес в ebx (00B91500), когда мы запускаем упакованный вариант?...все верно, это начальный адрес эмулируемой ASPr’ом API – GetModuleHandleA. И, что же у нас в конечном счете получается?...да все просто, когда запускаем упакованный вариант, то 4 байтика спокойно себе перезаписываются в памяти, а как только запустим дамп, то при попытке записи в системную dll вывалимся по exception...Скромненькая такая проверочка на присутствие ASPr’а, но со вкусом :)…Мне уже встречался подобный код, например в Digital Patrol…Чтобы нам избежать этой неприятности - поставим на процедуру call 0045EF80 заглушку, т.е. по адресу 0045EF80 вместо push ebp вколотим ret. Но пока, если еще не пропатчили, то в отладчике перепрыгнем через эту процедуру, т.е. в айсе, дойдя до нее, дадим команду r eip eip+5 (Enter). Так, эти 2 фичи обошли, двигаемся дальше, добрались до процедуры call 0045EC60, о которой я писал в самом начале, проявилось основное окно проги, трейсим дальше…Чуть отвлекусь, я ставил бряки на эти процедуры и естественно все переходы и обходы выполнял в отладчике, не пропатчивая пока файл…
Окно проявилось, трейсим и выходим в таком месте:

 :005B8335 A190F55B00        mov eax, dword ptr [005BF590] // здесь мы выйдем
 :005B833A 8B00              mov eax, dword ptr [eax]
 :005B833C E86355EAFF        call 0045D8A4
 :005B8341 E8CABAE4FF        call 00403E10

После того как мы выполним call 0045D8A4 мы опять вывалимся в процедуру call 0045EF38, но там мы уже знаем, что переходы должны состояться, проходим их и выходим в таком месте:

 :005B39BF 8D45F0            lea eax, dword ptr [ebp-10] // здесь мы выйдем
 :005B39C2 E85DB3EAFF        call 0045ED24
 :005B39C7 837DF000          cmp dword ptr [ebp-10], 00000000
 :005B39CB 7507              jne 005B39D4 // переход состоится
 :005B39CD 6A00              push 00000000
 :005B39CF E90062FFFF        jmp 005A9BD4
 :005B39D4 E8A7B5EAFF        call 0045EF80 // уже знакомая процедура
 :005B39D9 E83AA9FFFF        call 005AE318 // здесь сработает эксепшен
 :005B39DE 84C0              test al, al // в al будет 0
 :005B39E0 7536              jne 005B3A18
 :005B39E2 53                push ebx
 :005B39E3 68A4375B00        push 005B37A4
 :005B39E8 33C9              xor ecx, ecx
 :005B39EA B201              mov dl, 01
 :005B39EC A1749B5A00        mov eax, dword ptr [005A9B74]
 :005B39F1 E83E62FFFF        call 005A9C34

Дальше у нас произойдет переход на адрес 005B39D4, а там нам тоже уже известная процедура по проверке ASPr’а, обходим ее и если теперь выполним call 005AE318, то опять вывалимся по exception…идем внутрь ее и видим такое место:

 :005AE346 837DF800          cmp dword ptr [ebp-08], 00000000
 :005AE34A 7507              jne 005AE353 // переход состоится
 :005AE34C 6A00              push 00000000
 :005AE34E E981B8FFFF        jmp 005A9BD4
 :005AE353 E8280CEBFF        call 0045EF80 // уже знакомая процедура
 :005AE358 E8A3FFFFFF        call 005AE300 // здесь сработает эксепшен
 :005AE35D C605FCE85B0000    mov byte ptr [005BE8FC], 00

По адресу 005AE34A у нас состоится переход опять на знакомую процедуру :)…обходим ее, и если теперь выполним call 005AE300, то вылетим, смотрим ее:

 :005AE300 A104E95B00         mov eax, dword ptr [005BE904]
 :005AE305 83C002             add eax, 00000002
 :005AE308 8B00               mov eax, dword ptr [eax]
 :005AE30A 8B00               mov eax, dword ptr [eax]
 :005AE30C 8BC8               mov ecx, eax
 :005AE30E 668B11             mov dx, word ptr [ecx]
 :005AE311 668911             mov word ptr [ecx], dx // здесь сработает эксепшен
 :005AE314 C3                 ret

Хе-хе, посмотрите, код этой процедуры чем то похож на код процедуры call 0045EF80, ну я имею ввиду - по своей сути, можно в какой то степени даже сказать – близнецы :)…только здесь у нас происходит перезапись всего 2-х байтов в памяти, по адресу, содержащемуся в ecx. Посмотрим, какой у нас адрес будет в ecx при запуске оригинала…наблюдаем там 00BA0824 - опять ASPr’овский, смотрим теперь что в дампе…а там у нас 77E75F93 – снова адрес системной dll. Выполнив в айсе: u 77E75F93, видим, что он относится к WaitForMultipleObjects. Вы уже теперь догадались, что в упаковке адрес 00BA0824 – начальный адрес эмулируемой ASPr’ом функции WaitForMultipleObjects. Ну и соответственно, при запуске оригинала байтики спокойно перезаписываются в памяти, а при запуске дампа и попытке записи в системную dll – вывалимся по exception, так сказать - еще одна скромненькая проверочка на ASPr…Надо поставить и на эту процедуру заглушку, но пока давайте обойдем ее, и выйдем из процедуры call 005AE318. Вышли, смотрите выше - в тексте приведен этот код, сразу попадаем на проверку значения в al - по адресу 005B39DE. Процедура call 005AE318 вернет нам в al нолик, и переход по адресу 005B39E0 не состоится, ну что же, отпустим прогу по F5...опаааа запустилась, вылез напоминающий наг, что это триал версия, за ним другой, закрываем их и видим основное окно проги…все работает :)
Теперь вернемся к триальному нагу. Основную роль здесь играет процедура call 005AE318, а точнее переход после нее по адресу 005B39E0, если он состоится, то нага не увидим и программа запустится без него. С процедурой call 005AE318 можно поступить 2-мя способами. Первый вариант - если ее более детально проанализировать, то можно прийти к выводу, что она ничего полезного не делает, кроме пакостей - по вызову call 005AE300, которая в свою очередь вызывает падение проги, и возвращения в al нолика, чтобы мы видели триальный наг. Поэтому можно ее заглушить, т.е. по адресу 005AE318 вместо push ebp вписать ret. Что у нас при этом будет, а будет вот что…до входа в эту процедуру у нас в al значение отличное от нуля и поэтому переход по адресу 005B39E0 состоится, при этом не появится триальный наг и программа запустится без него. Тут вы можете сказать – вот и хорошо, избавились от нага, но нафига тогда глушить call 005AE300, если она вызывается из call 005AE318?...Все просто, если вы дизассемблируете дамп, то увидите, что call 005AE300 вызывается еще и из других процедур и если ее не заглушить, то, например, у вас не будет работать в меню Options пункт Settings, а точнее прога будет падать. Поэтому, однозначно, ставим заглушку на call 005AE300, но так как при входе в нее у нас 5-ти байтовая команда, то сделаем вместо нее jmp на выход, т.е. jmp 005AE314. Но не факт, что до входа в процедуру call 005AE318 у нас всегда будет в al значение отличное от нуля. Поэтому есть второй вариант избавления от триального нага, скажем так, более надежный. Не ставить на нее заглушку, call 005AE300 мы итак заглушили, нам надо пропатчить ее таким образом, чтобы она всегда возвращала в al значение отличное от нуля, и чтобы всегда выполнялся переход по адресу 005B39E0, исключая тем самым появление триального нага. Исследовав эту процедуру, приходим к выводу, что нолик, который она нам возвращает, грузится по адресу 005AE35D, посмотрите выше в тексте этот код. Изменив по этому адресу код на mov byte ptr [005BE8FC], 01, т.е. загрузив вместо нуля единицу, мы обеспечим постоянный переход по адресу 005B39E0, исключив появление триального нага.

Подводя итоги нам надо пропатчить следующие адреса:

1. по адресу 0045EF5C сделать переход безусловным.
2. по адресу 0045EF80 поменять push ebp на ret.
3. по адресу 005AE300 сделать безусловный переход на адрес 005AE314.
4. по адресу 005AE35D изменить инструкцию на mov byte ptr [005BE8FC], 01.

Заключение

В заключение, отмечу, если дизассемблировать дамп, то можно увидеть, что к вышеперечисленным процедурам, в совокупности, идет 14 прямых обращений, но возможно их и больше, если вызовы идут и через другие процедуры.
Теперь в проге триал убит, можете попереводить системное время и убедиться в этом, от триального нага избавились, вам теперь осталось только вколотить в About свое имя или убрать надпись UNREGISTERED, ну и, если хотите, убрать из меню Help пункт о регистрации, думаю для вас это не составит сложности. Самое простое, навскидку, это открыть в редакторе ресурсов дамп, и в соответствующие Objects добавить – Visible = False, ну и т.д.
Напоследок хочется передать приветы следующим людям: syd, Mario555, nice, vdv, Bad_guy, модераторам форума CRACKL@B и многим, многим другим.

Good Luck,
DFC

Обсуждение статьи: Реанимирование Advanced Serial Port Monitor 3.0.2 >>>


Комментарии к статье: Реанимирование Advanced Serial Port Monitor 3.0.2

den54 21.12.2004 16:27:36
good!
worked
---

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



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


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