Автор: pablov <pablov@km.ru>
Эта статья у меня первая, прошу строго не судить и предназначена в основном для начинающих Огромное спасибо всем кто пишет туториалы, без них тяжело было бы постигать премудрости крека.Наша цель будет Offline Explorer Enterprise 2.9 1302 SR 1. "Эта программа позволяет быстро копировать узлы Интернет и просматривать их в режиме оффлайн с помощью встроенного или внешнего браузера" - цитата из окна About самой программы. На мой взгляд самый лучший выкачиватель сайтов. Взять можно http://www.metaproducts.com На сайте выложены три варианта: просто Offline Explorer - по моему бесплатная, второй Offline Explorer Pro 2.9 стоит 50$ и Offline Explorer Enterprise 2.9 стоит уже аж 350$. Мы таких денег сроду не видели, так что попробуем заставить ее работать на нас бесплатно до скончания веков, а не 30 дней (Забегая вперед скажу, что механизм защиты у обоих платных программ построен одинаково, только адреса разные)
PEiD (утилита для определения на каком языке написана прога, или чем упакована) AspackDie 1.4 или другой распаковщик ASPack SoftICE (ну куды ж мы без него?) W32Dasm Patch 3 (взять можно http://www.mycgiserver.com/~bratalarm/programs/w32dsmpatch/brat_w32dsmpatch3.zip ) Это видоизмененный W32Dasm в котором можно патчить прямо из него самого, не используя hex-редактор и мы не будем, это сократит наше время. ВНИМАНИЕ и ТЕРПЕНИЕ тоже не маловажные инструменты при исследовании программ.
:006BD344 8B45FC mov eax, dword ptr [ebp-04] :006BD347 80B8AC07000000 cmp byte ptr [eax+000007AC], 00 ; Сравнение, если в [eax+000007AC] ноль :006BD34E 7527 jne 006BD377 ; получаем [ Not Registered ] :006BD350 8B45FC mov eax, dword ptr [ebp-04] :006BD353 8B90A4080000 mov edx, dword ptr [eax+000008A4] :006BD359 8D85A8FEFFFF lea eax, dword ptr [ebp+FFFFFEA8] * Possible StringData Ref from Code Obj ->" - [ Not Registered ]" :006BD35F B974F46B00 mov ecx, 006BF474 :006BD364 E80B72D4FF call 00404574 :006BD369 8B95A8FEFFFF mov edx, dword ptr [ebp+FFFFFEA8] :006BD36F 8B45FC mov eax, dword ptr [ebp-04] :006BD372 E899D3D7FF call 0043A710 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:006BD34E(C) | :006BD377 E87445FDFF call 006918F0 :006BD37C 33D2 xor edx, edx :006BD37E 8B45FC mov eax, dword ptr [ebp-04] :006BD381 E80A280100 call 006CFB90По адресу :006BD347 происходит сравнение байта в памяти по адресу [eax+000007AC] с нулем. Если этот байт равен 00 то прыжка не будет и получаем - [ Not Registered ], а если нет..? Давайте проверим.
:006BD347 80B8AC07000000 cmp byte ptr [eax+000007AC], 00 <-- мы тут :006BD34E 7527 jne 006BD377Посмотрим, что у нас творится в памяти по адресу [eax+000007AC]. Для этого наберем
0030:00F16518 00 00 00 00 00 00 00 00-F0 57 F5 00 00 00 00 00 ........W.......и значит перехода по адресу :006BD34E не будет и как следствие - [ Not Registered ] :( Попробуем изменить значение байта по адресу :00F16518 на 01, для этого перейдем в окно данных (Alt+D) и поменяем первые два нуля на 01 Должно получится следующее:
0030:00F16518 01 00 00 00 00 00 00 00-F0 57 F5 00 00 00 00 00 ........W.......Кстати, адреса в памяти у вас будут другие, (они будут соответствовать сумме eax+000007AC) Теперь поставим точку прерывания на чтение/запись поэтому адресу памяти
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00624241(C) | :006242A7 A1B0CC6E00 mov eax, dword ptr [006ECCB0] :006242AC 8B00 mov eax, dword ptr [eax] :006242AE C680AC07000001 mov byte ptr [eax+000007AC], 01 Сюда мы никогда не попадем, потому как не знаем Registration key :( Второе: :006BBA58 8B45FC mov eax, dword ptr [ebp-04] :006BBA5B C680AC07000000 mov byte ptr [eax+000007AC], 00 Третье: :006BD1BD E8A666FFFF call 006B3868 :006BD1C2 8BD8 mov ebx, eax :006BD1C4 8B45FC mov eax, dword ptr [ebp-04] :006BD1C7 8898AC070000 mov byte ptr [eax+000007AC], blВо второе и треть место мы строго попадаем при загрузке проги, причем в третьем случае в bl всегда будет ноль.
:006B3868 55 push ebp :006B3869 8BEC mov ebp, esp :006B386B 83C4F8 add esp, FFFFFFF8 :006B386E 53 push ebx :006B386F 33DB xor ebx, ebx :006B3871 895DF8 mov dword ptr [ebp-08], ebx :006B3874 8BD8 mov ebx, eax :006B3876 33C0 xor eax, eax :006B3878 55 push ebp :006B3879 68D7386B00 push 006B38D7 :006B387E 64FF30 push dword ptr fs:[eax] :006B3881 648920 mov dword ptr fs:[eax], esp :006B3884 8BC2 mov eax, edx :006B3886 8BD1 mov edx, ecx :006B3888 8B4D08 mov ecx, dword ptr [ebp+08] :006B388B E828F0FFFF call 006B28B8 :006B3890 8845FF mov byte ptr [ebp-01], al ; здесь значение из al заносится в переменную [ebp-01] :006B3893 8B8320030000 mov eax, dword ptr [ebx+00000320] :006B3899 80783800 cmp byte ptr [eax+38], 00 :006B389D 7422 je 006B38C1 :006B38CE 8D45F8 lea eax, dword ptr [ebp-08] --------------- убран лишний код --------------- :006B38D1 E8C209D5FF call 00404298 :006B38D6 C3 ret ; после ret мы попадаем на адрес :006B38DE :006B38D7 E9F402D5FF jmp 00403BD0 :006B38DC EBF0 jmp 006B38CE :006B38DE 8A45FF mov al, byte ptr [ebp-01] ; а здесь из переменной [ebp-01] передается в al ----------------------------------------------------------- :006B38E1 5B pop ebx :006B38E2 59 pop ecx :006B38E3 59 pop ecx :006B38E4 5D pop ebp :006B38E5 C20400 ret 0004Нам нужно, чтобы в al всегда была единица, что бы потом плавно перепорхнуть в bl, значит будем править по адресу :006B38DE
:006B38DE B001 mov al, 01 :006B38E0 90 nopКоманда mov al, byte ptr [ebp-01] занимает три байта, а команда mov al,01 только два поэтому, чтобы не нарушить целостность программы добавим команду nop ее код 90 Давим кнопку Apply и закрываем окно.
:005B1B3C 807B5100 cmp byte ptr [ebx+51], 00 :005B1B40 7532 jne 005B1B74 :005B1B42 83FE07 cmp esi, 00000007 :005B1B45 751C jne 005B1B63 :005B1B47 80BBA202000000 cmp byte ptr [ebx+000002A2], 00 :005B1B4E 7413 je 005B1B63 :005B1B50 B902000000 mov ecx, 00000002 * Possible StringData Ref from Code Obj ->"Suspended." ; "Приостановлено" | :005B1B55 BAB41B5B00 mov edx, 005B1BB4 :005B1B5A 8BC3 mov eax, ebx :005B1B5C E887C3FEFF call 0059DEE8 :005B1B61 EB11 jmp 005B1B74 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:005B1B45(C), :005B1B4E(C) | :005B1B63 B902000000 mov ecx, 00000002 * Possible StringData Ref from Code Obj ->"Aborted." ; "Прервано" | :005B1B68 BAC81B5B00 mov edx, 005B1BC8 :005B1B6D 8BC3 mov eax, ebx :005B1B6F E874C3FEFF call 0059DEE8Т.е. если выполняются переходы по адресам :005B1B45 и :005B1B4E то мы аккурат попадаем на эту самую "Aborted." Поначалу я хотел сходу поправить это безобразие, чтобы не было никаких абортов, потом подумал сам себе, а ведь остановить закачку могу я и сам. А если поменять переходы по этим адресам тогда хрен закачку остановишь. Только прогу глушить. Значит надо смотреть откуда лезет Aborted при закачке. Поднимемся в W32Dasm-е повыше строк на 60
:005B1A88 83C410 add esp, 00000010 :005B1A8B 5B pop ebx :005B1A8C C3 ret ---------------------------------------------------------------- :005B1A8D 8D4000 lea eax, dword ptr [eax+00] * Referenced by a CALL at Addresses: |:005B1A0C , :005B1A19 | :005B1A90 53 push ebx :005B1A91 56 push esiВидно, что приостановки и прерывания закачки идут с двух адресов. Вот тут понадобится одно ТЕРПЕНИЕ если хотим доломать эту прогу. ВНИМАНИЕ мы уже использовали. В дело снова пойдет SoftICE После всех предыдущих преобразований у нас получился пропатченый файл unpacked_BAK.EXE. Предлагаю переименовать его как ни будь покороче, например OE1.exe. Переименовали? Запустим его. Зайдем в SoftISE и в строке команд напишем
:005B1A11 C3 ret :005B1A12 8BC0 mov eax, eax * Referenced by a CALL at Addresses: |:00579A6C, :00579AC0, :00579AD7, :00579B20, :00579B7A |:00579B97, :00579EC0, :00579F82, :00579FF4, :0058C841 |:0058CCD8, :0058EA4B, :006D1CBD, :006D1E89 | :005B1A14 BA03000000 mov edx, 00000003 :005B1A19 E872000000 call 005B1A90 ; процедура, которая вызвала наш аборт :005B1A1E C3 retОГО, аж 14 ссылок.
* Referenced by a CALL at Addresses: |:0057B36D, :0057BB96, :0058E079, :0059517E, :0066E5F0 |:0066E7D8, :006B56F0, :006B5801, :006B5873, :006C042E |:006C072F, :006C4F7B, :006C5091, :006C7040 | :0058CC34 55 push ebp :0058CC35 8BEC mov ebp, esp :0058CC37 83C4E0 add esp, FFFFFFE0 Здесь я убрал лишний код :0058CC84 8B4730 mov eax, dword ptr [edi+30] :0058CC87 3B45FC cmp eax, dword ptr [ebp-04] :0058CC8A 757A jne 0058CD06 :0058CC8C 807F2800 cmp byte ptr [edi+28], 00 :0058CC90 744D je 0058CCDF :0058CC92 807DFB00 cmp byte ptr [ebp-05], 00 :0058CC96 7427 je 0058CCBF :0058CC98 8B4724 mov eax, dword ptr [edi+24] :0058CC9B 8B800C010000 mov eax, dword ptr [eax+0000010C] :0058CCA1 83C0FC add eax, FFFFFFFC :0058CCA4 83E802 sub eax, 00000002 :0058CCA7 7316 jnb 0058CCBF :0058CCA9 8B4724 mov eax, dword ptr [edi+24] :0058CCAC 83B80C02000000 cmp dword ptr [eax+0000020C], 00000000 :0058CCB3 760A jbe 0058CCBF :0058CCB5 8B4724 mov eax, dword ptr [edi+24] :0058CCB8 E8634D0200 call 005B1A20 :0058CCBD EB48 jmp 0058CD07 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:0058CC96(C), :0058CCA7(C), :0058CCB3(C) | :0058CCBF 8B45FC mov eax, dword ptr [ebp-04] :0058CCC2 80B83A02000000 cmp byte ptr [eax+0000023A], 00 :0058CCC9 740A je 0058CCD5 :0058CCCB 8B4724 mov eax, dword ptr [edi+24] :0058CCCE E84D4D0200 call 005B1A20 :0058CCD3 EB32 jmp 0058CD07 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0058CCC9(C) | :0058CCD5 8B4724 mov eax, dword ptr [edi+24] :0058CCD8 E8374D0200 call 005B1A14 ; процедура, которая вызвала аборт :0058CCDD EB28 jmp 0058CD07Здесь много всяких переходов и условных и безусловных, но поэкспериментировав с ними скажу вам что это все не то (чем сэкономлю ваше время и деньги потому как надо постоянно лазить в интернет) Надо копать глубже. Глубже это куда? спросите вы. А выше (тьфу глубже, выше - маразм какой-то) Смотрим по коду выше всех переходов и видим еще 14 ссылок, откуда может быть вызван аборт. Вы, наверное, устали уже. Отдохните, попейте кофейку и т.д. Мне тоже было нелегко когда я исследовал эту программу.
*******Сынок, не качайся на папе, он не для того повесился :)************ ШуткаОтдохнули? И я тоже. Тогда в бой; Конец уже близок Итак, мы имеем еще 14 ссылок, откуда может быть вызван аборт приведу их снова
|:0057B36D, :0057BB96, :0058E079, :0059517E, :0066E5F0 |:0066E7D8, :006B56F0, :006B5801, :006B5873, :006C042E |:006C072F, :006C4F7B, :006C5091, :006C7040Еще раз повторяем операцию с установкой брейкпойнтов, удалив все предыдущие (это последний раз так много бряков) и окажемся в SoftISE по адресу :0059517E вот тут
:0059515E 833DC0046F0000 cmp dword ptr [006F04C0], 00000000 :00595165 7E3C jle 005951A3 :00595167 8B8380000000 mov eax, dword ptr [ebx+00000080] :0059516D 3B05C0046F00 cmp eax, dword ptr [006F04C0] ; обратим внимание :00595173 7C2E jl 005951A3 :00595175 B101 mov cl, 01 :00595177 8BD3 mov edx, ebx :00595179 A1C4046F00 mov eax, dword ptr [006F04C4] :0059517E E8B17AFFFF call 0058CC34 ; процедура, которая вызвала аборт :00595183 6A00 push 00000000 :00595185 6A00 push 00000000Чуть выше нашей процедуры по адресу :0059516D происходит сравнение регистра eax со значением которое лежит в памяти по адресу [006F04C0] Поставим 1 (один!, а не 14) брейкпойнт на адрес где происходит сравнение
Материалы находятся на сайте http://cracklab.narod.ru/doc/