Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Исследование Njwin

Необходимые инструменты
1. Отладчик SoftICE 3.23 или более поздний
2. Ваш любимый шестнадцатеричный редактор

Введение

Не так давно наткнулся я на программу под названием Njwin, которая опознает и перекодирует япон- ские, корейские и китайские иероглифы в их "первозданный" вид. Найти программу Njwin 1.6 можно по адресу http://www.njstar.com

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

У программы интересная сильная защита, которая все-таки имеет свои слабости, и при правильном подходе довольно быстро сдается. Во-первых, программа при закрытии проверяет сама себя на измене- ния кода, и если Вы изменили в теле программы хоть один байт, программа самоуничтожается. Вторая защита - 30-ти дневный "trial period". Итак, сначала нам необходимо отключить механизм самоуничтожения, а после заняться ее регистра- цией.

Отключение механизма самоуничтожения

Скопируйте файл Njwin.exe в другое место на случай неудачи и запустите программу. Установите в SoftICE точку прерывания bpx GetModuleFileName, нажмите F5 и закройте Njwin. Вы попадаете в SoftICE. Нажмите F11 и вы окажетесь в модуле Njwin.exe:


44E9 call KERNEL!GETMODULEFILENAME
44EE push 1A7Fh
44F1 push 7688h
44F4 lea ax, [bp+FEEAh]
44F8 push ss
44F9 push ax
44FA call 1A7F:0856
44FF add sp,08
4502 mov si, ax
4504 mov [bp-0C], dx
4507 or dx, ax
4509 jnz 450C
450B jmp 4698
450E push 02

Протрассируйте код, используя F10, и записав все переходы jz и jnz. Теперь, используя любой шест- надщатеричный редактор, измените что-нибудь в файле Njwin.exe. Откройте его, установите точку пре- рывания на ту же функцию (bpx GetModuleFileName), и закройте Njwin. Попав в SoftICE, снова трасси- руйте код, отыскивая различия..Eduard Titov. Исследование Njwin 2 Для начинающих исследователей Очень скоро вы наткнетесь на место:


461C JNZ 467A расхождение
MOV WORDD PTR[BP-12],CFC4
MOV WORD PTR[BP-10],7BBC
PUSH 112F
PUSH 768C
LEA AX,[BP+FEEA]
PUSH SS
PUSH AX
CALL 112F:0856 вот он, самоубийца
ADD SP,08
MOV SI,AX
MOV [BP-0C],DX
OR DX,AX
JZ 4698

И убедитесь, что неизмененная программа не делает перехода по адресу 461С (jnt 467A), и делает его по команде jz 4698. Измените jnz на jmp 4698, и вы увидите, что программа перестала самоуничтожаться. Теперь можно внести эти изменения в тело оригинальной программы. Кстати, взглянув повнимательнее на первый кусочек кода, вы увидите знакомый переход по адресу 450В. Можно просто изменить jnz 450C по адресу 4509 на jmp 4698, и вы снова отключите защиту. Теперь можно переходить к регистрации программы.

Регистрация программы

У меня программа не выдавала окна для ввода регистрационной информации, но друзья говорили, что даже после ввода правильной регистрационной информации при перезапуске программы она снова видела себя незарегистрированной, т.е. снова появлялось окошко с напоминанием о необходимости ре- гистрации и т.д. Как избавиться от этого окошка? Программа использует при запуске файл Njwin.ini , расположенный в каталоге Windows. Значит, следует трассировать изменения, происходящие при чте- нии .ini файла. Ставим bpx GetPrivateProfileString и запускаем программу. Останавливаемся мы в следую- щем месте:


0001.3B83 9AB93B0000 call KERNEL.GETPRIVATEPROFILESTRING
0001.3B88 80BEF6FD3F cmp byte ptr [bp+FDF6], 3F
0001.3B8D 752E jne 3BBD
0001.3B8F FF36DC05 push word ptr [05DC]
0001.3B93 FF36DA05 push word ptr [05DA]
0001.3B97 FF36E005 push word ptr [05E0]
0001.3B9B FF36DE05 push word ptr [05DE]
0001.3B9F FFB6ECFB push word ptr [bp+FBEC]
0001.3BA3 FFB6EAFB push word ptr [bp+FBEA]
0001.3BA7 8D86F6FD lea ax, [bp+FDF6]
0001.3BAB 16 push ss
0001.3BAC 50 push ax
0001.3BAD 680001 push 0100
0001.3BB0 FF36F405 push word ptr [05F4]
0001.3BB4 FF36F205 push word ptr [05F2]
0001.3BB8 9AE53B0000 call KERNEL.GETPRIVATEPROFILESTRING
0001.3BBD FF36DC05 push word ptr [05DC]

Трассируем программу, пока не дойдем до следующего места:


0001.33EB 9AFA360334 call 0001.36FA вызов считывания данных из реестра
0001.33F0 83C402 add sp, 0002
0001.33F3 0BC0 or ax, ax
0001.33F5 7503 jne 33FA проверка на регистрацию
0001.33F7 E9BF01 jmp 35B9 переход, если зарегистрирована
0001.33FA FF36F005 push word ptr [05F0]
0001.33FE FF36EE05 push word ptr [05EE]
0001.3402 680934 push SEG ADDR of Segment 0001.

Как видно, по адресу 001.33F5 осуществляется проверка регистра ах, с последующим переходом через адрес 0001.33F7, если программа не зарегистрирована. Значит, нам необходимо изменить jne 33FA на jmp 35B9 - и CRACK готов.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay