Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Взлом и исправление багов в WinNavigator v1.96 (https://forum.antichat.xyz/showthread.php?t=30452)

ProTeuS 02.01.2007 23:37

Взлом и исправление багов в WinNavigator v1.96
 
Взлом и исправление багов в WinNavigator v1.96

Сегодня будем исследовать мой любимый файловый менеджер WinNavigator. Я лет 5 пользовался 1.95 версией, т.к.
1.96(последняя версия, доступна на wnsoft.com, жаль проэкт закрыт уже 4 года) имела один досадный баг,
времени на исследование которого никогда не хватало(по при4ине утери всех интсаллов это время теперь нашлось ;).
Все, кто еще с DOSa привык пользоваться горя4имы клавишами, как и я, плохо себя 4увствуют если какая-то из них не работает.
Так в 1.96 версии сабжа при нажатии хоткея "Ctrl + \" для перехода в корень текущего диска возникала ошибка вместо нужной операции:

Усугубляется проблема еще тем, 4то при попытке распаковки выполняемого файла программы
(как сказал PEID, он запротек4ен ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov) лицензия пропадает
даже при нали4ии валидной регистрации =(
Протестировать можно на этом клю4е(лу4ше вбивать клю4 непосредственно в редакторе реестра):
Код:

REGEDIT4
[HKEY_CURRENT_USER\Software\WinNavigator]
"Key"="0nhVQp5A+vUjiP4KIJsJtcqZ3t/LUFVBW0Fo3zUVIF5S
1ccGs9gkabulamlqLQLR33evIRSekR+JJP5f6VFNxh+i0NLD98q
RmczWjAQiP6QSlUOSOUi7AeK51MqPKDA3dmYWCI+1qJUGKTuR2M
MRJRQFOGzXMgrxeT16B7LYbZWI= "
"Reg"="313"

Приступим к распаковке навесного протектора. Загрузив подопытного в ольку, видим знакомые команды.

Код:

00401000 >/$ 68 01F06100    PUSH WN.0061F001
00401005  |. E8 01000000    CALL WN.0040100B
0040100A  \. C3            RETN
0040100B  $ C3            RETN

В "исклю4ениях" свойств отладки отклю4аем все 4екбоксы и (не забыв активировать плагин IsDebugPresent, либо вру4ную пропат4ив соответствующий флаг)
проходим 32 исклю4ения. Видим такой код:

Код:

012005CC  3100            XOR DWORD PTR DS:[EAX],EAX
012005CE  64:8F05 00000000 POP DWORD PTR FS:[0]
012005D5  58              POP EAX
012005D6  833D DC492001 00 CMP DWORD PTR DS:[12049DC],0
012005DD  74 14            JE SHORT 012005F3

Ставим бряк на 012005DD, жмем Ctrl + F9 и бряк на доступ к памяти секции кода екзешника. F9 и мы на OEP. Дампим, восстанавливаем импорт в Imprec
(воспользовавшись функциями DisAsm1 и плагом для аспра, 4тобы восстановить нерезолвящиеся функции).

Запустив распакованый файл на свое удивление полу4аем такое вот сообщение (даже при валидной регистрации):

Код:

005380B8  . B8 AC815300    MOV EAX,fixed.005381AC                  ; |ASCII "Dear registered user of WinNavigator!
We have changed registration mechanism, so you need a new registration key.
Please contact us (support@wnsoft.com) and get a new registration for FREE.

Sorry for some inconvenience."
и приставку
005380DC  . B9 94825300    MOV ECX,fixed.00538294                  ;  ASCII "  -  UNREGISTERED"
на главном окне программы + ку4у ограни4ений и нагов

Изменив выделенную команду на нопы, сообщении выдаваться не будет.
4тобы узнать логику срабатывания условного перехода делаем следующее.
Ставим бряк на соответсвующие строки и жмем F9. При отработке бряка смотрим в стек вызовов и самой верхней надфункцией в нем есть
00537ADB |. E8 D4040000 CALL fixed.00537FB4
Входим в нее и видим код:

Код:

00537FD6  > A1 B4F55600    MOV EAX,DWORD PTR DS:[56F5B4]
00537FDB  . 50            PUSH EAX                                ; /ProcNameOrOrdinal => #5
00537FDC  . A1 B0F55600    MOV EAX,DWORD PTR DS:[56F5B0]            ; |
00537FE1  . 50            PUSH EAX                                ; |hModule => FFFFFFFF
00537FE2  . E8 D9F2ECFF    CALL <JMP.&kernel32.GetProcAddress>      ; \GetProcAddress
00537FE7  . 85C0          TEST EAX,EAX
00537FE9  . 74 62          JE SHORT fixed.0053804D

Можно догадаться, 4то в пакованом (видимо это особенность мутации ли4ной версии спра с выполняемым файлом) файле функция .00537FE2
выдаст правильный результат, т.к ей аргументом передастся верный hModule, в нашем же слу4ае для подмены результатов проверки (в распакованной проге, понятное дело, они никогда не будут правильными)
достато4но занопить команду .00537FE9.

Нагов нет, вот только осталась надпись о незарегистрированности в окне "О программе". 4тобы ее по-быстрому снять, ищем строку
"NOT REGISTERED COPY" в перекрестных ссылках. Попадаем сюда:

Видим знакомый вызов. Поскольку GetProcAddress явно возвратит 0, а не нужный адрес искомой функции (которая потом будет вызываться call esi),
то во избежение переполнения удалим весь код непосредственно до .4FD37F

Теперь все зарегистрированно и красиво, можно приступать до главного вопроса - поиска бага и его устранения.

Самый быстрый способ - отклю4ить игнор в ольке на все эксепшены и просто нажать в запущеной проге Ктрл + \ ;)
Брякаемся на эксепшене

На 3 команды выше выполняется основная функция файлового менеджера по парсингу путей, которая выдаст в EDX
указатель на надпапку (EDX=0121A114, (ASCII ".."). Команда .53E92B постоянно возвращает нуль (DS:[012087CC]=00000000).
Таким образом, команда .53E931 будет ссылаться на несуществующий указатель. А поскольку команда пыталась записать в DL
байт по [EDX] (а EDX имел нулевое зна4ение), то можно предположить, 4то в DL надо просто записать нуль (либо ни4его не делать, т.к.
в нешем слу4ае он уже там). Тогда просто забиваем .53E931 нопами и радуемся полнофункциональности файлового менеджера и отсутствию
исследованого бага.

gl hhf!


Время: 11:24