Регистрация 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. Выполняется это с помощью следующих команд:
И что же мы увидим??? В этих регистрах хранится имя и код, которые мы ввели! А
зачем функции получать в качестве параметров имя и код??? Правильно... Отпра-
вимся внутрь функции с помощью кнопки 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). Удачи Вам!
|