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

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


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

Исследование Offline Explorer Enterprise

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

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

Автор: 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 дней (Забегая вперед скажу, что механизм защиты у обоих платных программ построен одинаково, только адреса разные)

Tools

 PEiD (утилита для определения на каком языке написана прога, или чем упакована)
 AspackDie 1.4  или другой распаковщик ASPack
 SoftICE (ну куды ж мы без него?)
 W32Dasm Patch 3 (взять можно
 http://www.mycgiserver.com/~bratalarm/programs/w32dsmpatch/brat_w32dsmpatch3.zip )
 
 Это видоизмененный W32Dasm в котором можно патчить прямо из него самого,
 не используя hex-редактор и мы не будем, это сократит наше время.
 ВНИМАНИЕ и ТЕРПЕНИЕ тоже не маловажные инструменты при исследовании программ.
 

Поехали

Для начала, при помощи PEiD определим, чем упакована прога (а она упакована). Видим ACPack 2.11b -> Alexey Solodovnikov. Натравим на упакованную программу AspackDie 1.4 Появился новый файл Unpacked.ExE Его размер раза в 3 больше исходного, запустим его. Все ОК, значит распаковался. На всякий случай сделаем резервную копию.
Засунем распакованный Unpacked.ExE в W32Dasm и пока идет процесс осмотрим внимательно рабочее окно Offline Explorer Enterprise. Что мы наблюдаем: все вроде нормально, за одним исключением.
В заголовке окна начертано Meta Products Offline Explorer Enterprise 2.9 - [ NotRegistered ]. Угу, не зарегистрированы говоришь, ща посмотрим кто здесь не зарегистрирован.
К этому времени W32Dasm должен переварить распакованную прогу.
Попробуем найти в String Data References фразу [ Not Registered ]. Жмем на "Поиск", вписываем нашу фразу, ждем ....
и попадаем на такой участок кода:
 :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, закроем прогу, зайдем в SoftISE и поставим брйкпойнт на API функцию hmemcpy.
bpx hmemcpy
Выйдем из айса (F5) и запустим unpacked.ExE, попали в SoftISE, раз восемь жмем F12 пока не выберемся из системных dll и не окажемся в модуле unpacked. Удалим bpx hmemcpy (вс *) и поставим брйкпойнт на адрес, который мы запомнили
bpx :006BD347
Отпустим программу на выполнение (F5) и мы должны прерваться точнехонько на этом адресе
 :006BD347 80B8AC07000000            cmp byte ptr [eax+000007AC], 00                <-- мы тут
 :006BD34E 7527                                jne 006BD377
 
Посмотрим, что у нас творится в памяти по адресу [eax+000007AC]. Для этого наберем
d eax+000007AC
Видим, что по адресу :00F16518 нули:
 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) Теперь поставим точку прерывания на чтение/запись поэтому адресу памяти
bpmb :00F16518
то есть программа будет прерываться в моменты, когда производится считывание или запись байта по этому адресу.
А теперь отпустим программу на выполнение, т.е. нажмем F5
Программа прервется четыре раза по адресам :006C6180; :00614380; 00622E83; 00622F9C и потом постоянно будет прерываться по адресу :006C6180 По этому адресу, по таймеру происходит проверка на зарегленность программы во время ее работы.
и везде мы видим конструкцию
cmp byte ptr [eax+000007AC], 00
jne хххххххх
Т.е. в разных местах программы идет проверка байта в памяти по адресу [eax+000007AC] на 00. Теперь задисейблим все брейкпойнты, т.е. сделаем их неактивными
bd *
Программа перестала вылетать в SoftISE. Посмотрим на нее, то бишь на окно программы (Вы не забыли, что мы поменяли значение байта по адресу [eax+000007AC] на 01) Надпись в заголовке - [ Not Registered ] отсутствует, NAG окна нет и в помине. Заглянем в About. Там значится Registered to: т.е. впечатление, что прога полностью зарегистрирована. Делаем вывод: зарегистрированность программы зависит от значения байта в памяти по адресу [eax+000007AC] в моем случае [00F16518], если там единичка (или, что-то отличное от нуля) все ОК и наоборот.
Значит нам нужно сделать так, что бы при загрузке проги, в памяти в этом месте оказалась единица.
Давайте вернемся к W32Dasm-му. Встанем в начало кода, зададим в "Поиске" стоку [eax+000007AC] Мы найдем очень много мест, где встречается эта строка, но нас интересует, где присваивается значение байту по этому адресу
то есть что-то типа mov byte ptr [eax+000007AC],00 и найдем три таких места Первое
  * 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 всегда будет ноль.
Нужно это дело поправить.
Встанем в W32Dasm-е на строку с адресом :006BBA5B в пункте меню "Edit" выберем пункт Patch и поменяем седьмой байт с 00 на 01; должно получится C680AC07000001, что соответствует команде mov byte ptr [eax+000007AC], 01 Нажмем кнопочку Apply, нам скажут "Backupfile patced!" Закроем это окно. В каталоге с установленной программой появится новый файл unpacked_BAK.EXE это пропатченый файл
Так, один момент мы поправили, будем править второй.
По адресу :006BD1C7 в [eax+000007AC] засылается значение из младшего байта регистра ebx т.е. bl Напрямую засунуть 01 здесь не получится, т.к. команда mov byte ptr [eax+000007AC], 01 состоит из 7 байт, а мы имеем всего 6 8898AC070000 и если мы воткнем команду из 7 байт, то дальнейший ход программы поломается, а это чревато "Программа выполнила недопустимую ошибку и т.д."
Поэтому будем смотреть откуда берется значение в bl , а берется оно чуть выше из eax, a eax из процедуры по адресу :006BD1BD call 006B3868 Заглянем туда
 :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
В W32Dasm-е встаем на строку по адресу :006B38DE и вместо кода 8A45FF пишем B00190 Должно получится
 :006B38DE B001                      mov al, 01
 :006B38E0 90                           nop
 
Команда mov al, byte ptr [ebp-01] занимает три байта, а команда mov al,01 только два поэтому, чтобы не нарушить целостность программы добавим команду nop ее код 90 Давим кнопку Apply и закрываем окно.
Запустим файл unpacked_BAK.EXE (это тот файл, который получился после всех наших изменений) И наблюдаем приятную картину: никаких NAG-ов и угрожающих надписей, прога не реагирует на 30-ти дневный испытательный период (незарегистрированная после 30-ти дней, напрочь не хо- чет трудиться) казалось бы радуйся, беги, делись с друзьями и т.д. НО! Дня через два друзья вполне могут и морду набить . Почему? Да потому, что прога сломана не до конца. Многие креки так и сделаны, т.е. убрал исследователь NAG-экраны,убрал триал и все атрибуты незарегистрированности и тут же засылает патч в интернет - нате ребята, пользуйтесь. А у ребят после таких патчей маты одни.
Помните в начале статьи я говорил, что кроме всего прочего из инструментов нам понадобятся ВНИМАНИЕ и ТЕРПЕНИЕ. Поэтому никуда не побежим , а давайте-ка еще раз запустим прогу и заставим ее заняться тем чем и положено, а именно закачкой сайтов. Для начала, что бы приблизиться к боевым условиям переведем часы на компе на 30 дней вперед. Загрузим какой-нибудь URL, зададим небольшую глубину закачки и запустим загрузку. Через какое-то время закачка оборвется и вам в лицо бросят НАГлую надпись о том, что вы UNREGISTERED, время триала истекло и пошли бы вы на &&& и т.д. Опаньки, ведь мы же все поправили.
Пробуем еще раз - тот же результат. На этом этапе я по правде вначале тоже сел в калошу. Потрахался немного и бросил. Через некоторое время вернулся (350$ на дороге не валяются :)) Значит в программе есть еще одна проверка, но где? Причем проверка происхо- дит только во время закачки сайта, т.е. когда подключен к интернету. Если подключения нет или есть но закачка не производится, тогда прога часами ведет себя зарегистрированной, а при закачке через несколько секунд в окне состояния загрузки вместо слова Downloading появляется Aborted и привет...
Ага, "Aborted". Поищем в W32Dasm-е ссылочку на это слово и находим ее. Два раза щелкаем по ней мышкой и попадаем сюда:
 :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 и в строке команд напишем
addr OE1
Нажмем Enter
Это для того, что бы в SoftISE сделать активной нашу программу, когда она запущена, тогда можно ставить точки прерывания с уверенностью, что по ним прервешься. Можно поступить по другому. Не запуская программы поставить bpx Hmemcpy, запустить прогу, давить F12 пока не попадем в свой модуль и после этого ставить bpx на нужные адреса. А нужны нам два адреса (см. выше)
bpx :005B1A0C
bpx :005B1A19
Выходим из АЙСА и начнем закачку, причем запускайте Restart Download, что бы закачка шла с нуля. Через какое то время мы вылетим в SoftISE, смотрим на каком адресе. Это :005B1A19 Запомним его Удаляем точки останова. Выходим из SoftISE. Видим - Aborted и прога снова Not Registered и до свидания Помните в начале мы пропатчили прогу и сделали так, что бы по адресу в памяти [eax+000007AC] всегда было 01, так вот, если после этого Aborted заглянуть в этот адрес, то там увидим 00 со всеми вытекающими...
Значит мы на верном пути Заглянем в W32Dasm на этот адрес, который мы запомнили; Goto Code Location :005B1A19 Попадаем сюда
 :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 ссылок.
Снова грузим прогу, делаем все что выше, только брейкпойнтов придется поставить уже 14 штук Но что делать, кому сейчас легко?
Поставили, запустили прогу, подключились к интернету, начали закачку. Хоп и мы опять вывалились в SoftISE по адресу :0058CCD8. Запомним его, удалим бряки. Я все думал, почему прога не сразу начинает ругаться, а дает какое-то время поработать? От чего это зависит. От кол-ва скачанных байт или кол-ва скачанных файлов? хе-зе. Были мысли, что прога связывается с серваком и там проверяется на зарегистрированность, но это отпало. Попробовал в момент, когда тормозился на брейкпойнтах, которые вели к абортам посмотреть что творится в программе. Т.е. нажимал кнопочку F4 и смотрел самую нижнюю строку состояния программы там показывается кол-во скачанных файлов и байт и пришел к интересному выводу. Количество закаченных файлов в момент аборта всегда было 20. Эта строка отображает порядковый номер закачиваемого файла. Получается в момент закачки 20-го по счету файла происходит Abort. Вот это интересно!
Итак мы запомнили адрес :0058CCD8 Смотрим в в W32Dasm по этому адресу
 * 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) брейкпойнт на адрес где происходит сравнение
bpx :0059516D
Еще раз проделаем всю процедуру и когда прервемся первый раз посмотрим, с чем идет сравнение регистра eax, т.е. посмотрим область памяти по адресу [006F04C0] пишем в строке команд
d 006F04C0
и видим там число 15h это шестнадцатеричное, а в десятеричном это число 21. В регистре eax в это время сидит единица. Чуете чем пахнет?. Нажмем F4 и посмотрим на окно проги - загружено 0 файлов. Уже теплее...
Следующий за командой сравнения идет условный переход jl :005951A3 т.е. переход осуществляется если значение регистра eax меньше 15h. У нас в eax 01 значит прыгнем. Нажмем F5, через несколько секунд мы снова в SoftISE. В регистре eax уже 2. Вроде горячо :)) жмем F4 видим в нижней строке программы, что загружен 1 файл и так далее до тех пор пока в eax не будет 15h.
Получается, мы перескакиваем через процедуру, вызывающую аборт пока значение регистра eax меньше 15h (т.е. закачено меньше 21 файла). Вот тут мы и вознаградили наше ТЕРПЕНИЕ. Что нам стоит обмануть эту "глупую" программу сделав так, что бы она всегда думала, что файлов закачено меньше 20. И она поверит, будте уверены.
Для этого по адресу :00595173 поменяем условный переход jl 005951A3 на безусловный, jmp 005951A3 т.е. 7E3C на EB3C. Как это сделать посмотрите выше, а то уже устал колотить по клавиатуре.
Этот переход будет выполняться всегда, а значит никаких принудительных Abort-ов не будет.
Проверяйте
Конечно, можно было бы полезть еще глубже - посмотреть, откуда вызывается это сравнение с 15h , потому что, по моему мнению, нормально зарегистрированная программа этого сравнения делать не станет. Если хотите поисследуйте. А так прога пашет на 100%, а наши труды (поменяли в программе 5 байт) окупились виртуальными 350 баксами.

P.S. В реестре в разделе HKEY_CURRENT_USER\SOFTWARE\MetaProducts\Offline Explorer MX\Parameters в строковом параметре RegUser можете поставить свое имя :) Тогда в About будет Registered to: Ваше имя мелочь, а приятно.

Данная статья написана исключительно в познавательных целях и не иначе.

Все вопросы и пожелания на мыло pablov@km.ru

Обсуждение статьи: Исследование Offline Explorer Enterprise >>>


Комментарии к статье: Исследование Offline Explorer Enterprise

XATA 02.12.2004 21:12:08
Всё отлично!
---
Оберон 06.12.2004 11:18:14
Нормально!
---
Kedzu 26.10.2005 12:23:05
SoftISE << просто убило :)
---

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



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


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