Регистрация Internet Maniac

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

ВВЕДЕНИЕ

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). Удачи Вам!

{/codecitation}

Добавить комментарий