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

ВВЕДЕНИЕ

Internet Maniac - программа для получения информация о серверах в Интернет. Включает такие возможности, как Ping, Finger, Traceroute и т.д. Для исследованиz данной программы мы будем использовать отладчик SoftICE. Же- лательно, версии 4.00 или выше.

ИССЛЕДОВАНИЕ

При каждом запуске программа в заголовке окна выдает строку UNREGISTERED, что само по себе уже угнетает. В этой статье мы рассмотрим, как ее зарегистриро- вать.

Запустим программу. В меню Help есть пункт Register..., с помощью которого мож- но ввести имя (Your Name) и код (Registration code). Попробуем ввести любые имя и код и нажмем на кнопку Register. Появится окошко с надписью Incorrect registration code. Хорошо... Перейдем в SoftICE и поставим контрольные точки (breakpoint) на выполнение функций GetDlgItemTextA() и GetWindowTextA(). Для этого введем сле- дующие команды:


bpx GetDlgItemTextA
bpx GetWindowTextA

Хотя названия функций можно вводить и маленькими буквами, рекомендуется вводить их так. Таким образом, Вы быстрее их запомните. Ну, что ж... Введем имя (я ввел YH2K) и код (я ввел 110184). Нажимаем на кнопку, и... Программа прерывается, и мы попадаем в отладчик. Программа остановилась при вызове функции GetDlgItemTextA(). Нажмем F12, чтобы вернуться из функции в про- грамму. Теперь посмотрим на участок, откуда она вызывается:


015F:0040449D 6800010000 PUSH 00000100
015F:004044A2 50 PUSH EAX
015F:004044A3 684A040000 PUSH 0000044A
015F:004044A8 56 PUSH ESI
015F:004044A9 FFD7 CALL EDI <- вызов GetDlgItemTextA (считывается имя)
015F:004044AB 8D4C2408 LEA ECX,[ESP+08] <- мы тут
015F:004044AF 6800010000 PUSH 00000100
015F:004044B4 51 PUSH ECX
015F:004044B5 6849040000 PUSH 00000449
015F:004044BA 56 PUSH ESI
015F:004044BB FFD7 CALL EDI <- вызов GetDlgItemTextA (считывается код)
015F:004044BD 8D542448 LEA EDX,[ESP+48]
015F:004044C1 8D442408 LEA EAX,[ESP+08]
015F:004044C5 52 PUSH EDX <- запись в стек кода
015F:004044C6 50 PUSH EAX <- запись в стек имени
015F:004044C7 E8C4240000 CALL 00406990 <- вызов функции

Попробуем разобраться. По адресу 4044А9 происходит вызов функции, считыва- ющей имя, введенное пользователем. По адресу 4044ВВ происходит вызов функции,.NeCrOmAnCeR. Регистрация Internet Maniac v1.08. 2 считывающей код. По адресам 4044С5 и 4044С6 происходит запись в стек двух пара- метров, которые будут переданы функции, вызывающейся по адресу 4044С7. С по- мощью кнопки F10 дойдем до адреса 4044С5 и посмотрим, что хранится в регистрах EDX и EAX. Выполняется это с помощью следующих команд:


d edx
d eax

И что же мы увидим??? В этих регистрах хранится имя и код, которые мы ввели! А зачем функции получать в качестве параметров имя и код??? Правильно... Отпра- вимся внутрь функции с помощью кнопки F8. Начнем анализировать код:


015F:00406990 83EC20 SUB ESP,20 <- мы здесь
015F:00406993 56 PUSH ESI
015F:00406994 8B742428 MOV ESI,[ESP+28]
015F:00406998 56 PUSH ESI
015F:00406999 FF154C004100 CALL [KERNEL32!lstrlen] <- определяется длина имени
015F:0040699F 83F804 CMP EAX,04 <- если длина не меньше 4,
015F:004069A2 7D07 JGE 004069AB <- то осуществляется переход на 4069АВ
015F:004069A4 33C0 XOR EAX,EAX
015F:004069A6 5E POP ESI
015F:004069A7 83C420 ADD ESP,20
015F:004069AA C3 RET <- выход из функции
015F:004069AB 0FBE4601 MOVSX EAX,BYTE PTR [ESI+01]
...
015F:004069E0 8B542440 MOV EDX,[ESP+40]
015F:004069E4 83C414 ADD ESP,14
015F:004069E7 8D442404 LEA EAX,[ESP+04]
015F:004069EB 52 PUSH EDX <- запись в стек содержимого регистра EDX
015F:004069EC 50 PUSH EAX <- запись в стек содержимого регистра EAX
015F:004069ED FF15F8004100 CALL [KERNEL32!lstrcmp] <- сравнивается две строки

Обратим внимание на адрес 406999. Вызывается функция, определяющая длину имени. Далее, если длина имени не меньше 4, то осуществляется переход на 4069АВ. А если длина меньше 4, то переход не осуществляется и происходит выход из функ- ции по адресу 4069АА. После того, как произошел переход на 4069АВ, по шагу про- кручиваем код и доходим до того места, в котором сравнивается введенный нами код с правильным. Конечно... Вызывается функция lstrcmp(), которая предназначена для сравнения строк. Посмотрим параметры, которые ей передаются: в регистре EDX (d edx) находится код введенный нами код (у меня 110184), а в регистре EAX (d eax) - искомый код. В моем случае - 1184420864-200144. Вот его-то и следует переписать... Выйдем из отладчика и введем новые данные в окно регистрации (не забудьте перед этим отключить все контрольные точки - bd *). Нажимаем на кнопку Register, и... программа зарегистрирована!

Казалось бы, программа исследована... Но, есть один нюанс. Помните, осуществ- лялся выход из функции, если длина имени была менее 4 символов? Вот тут-то и надо рассмотреть этот случай. В отладчике вновь включим все контрольные (be *), введем имя меньше четырех символов и нажмем на Register. Пройдем по вышеописанному пути и после выхода из функции попадем сюда:


015F:004044C7 E8C4240000 CALL 00406990
015F:004044CC 83C408 ADD ESP,08 <- сюда мы попадаем
015F:004044CF 85C0 TEST EAX,EAX <- проверяется значение EAX.NeCrOmAnCeR. Регистрация Internet Maniac v1.08. 3
015F:004044D1 744A JZ 0040451D <- осуществляется переход, если установ-
лен флаг нуля (Z)
015F:004044D3 8B3D78004100 MOV EDI,[KERNEL32!WritePrivateProfileSt...

По адресу 4044CF проверяется значение EAX, после которого устанавливается флаг нуля (Z). Далее, с адреса 4044D1 происходит переход в случае, если данный флаг уста- новлен. После этого перехода появляется окно с сообщением о неправильно введен- ном коде. Значит, нам нужно сделать так, чтобы переход не осуществлялся. Этого можно добиться путем изменения оператора условного перехода JZ на обратный ему JNZ. Шестнадцатеричный код оператора JZ 0040451D - 74h 4Аh. Когда курсор уста- новлен на строке 4044D1, наберите команду «a» (без кавычек) для переключения в режим интерактивного ассемблера. Поменяйте данный оператор на JNZ 0040451D. Таким образом, шестнадцатеричный код изменится на 75h 4Ah. Теперь если Вы вый- дете из отладчика, высветится окошко об успешной регистрации. Но... Код изменил- ся только на одну сессию работы программы, поэтому Вам нужно открыть исполняе- мый файл в шестнадцатеричном редакторе и производить модификацию в нем. Глав- ное, найти нужное место в файле. Так как комбинация 744Ah очень коротка, она мо- жет встречаться в нескольких местах в программе. Поэтому следует переписать так- же несколько байт, стоящих до и после изменяемой комбинации, например: 83C40885C0744A8B3D78004100h. Далее надо изменить байт 74h на 75h (т.е. изменить код команды JZ на JNZ). Удачи Вам!

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