скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Регистрация 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). Удачи Вам!






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook