Читать реферат по информатике, вычислительной технике, телекоммуникациям: "Как ломать программы Windows C EDSON UCF, перевод Mr.BocoTCP" Страница 2
строчках ввода типа Windows Edit. Чтобы проверить код, программа должна прочитать содержимое строки ввода при помощи одной из функций:
16-бит 32-бит
------ ------
GetWindowText GetWindowTextA, GetWindowTextW
GetDlgItemText GetDlgItemTextA, GetDlgItemTextW
Последняя буква в названии 32-битных функций говорит о том, какие строки использует эта функция: однобайтовые или двухбайтовые. Двухбайтовые строки используются ОЧЕНЬ редко.
Возможно, что Вы уже уловили мою мысль. "Если бы можно было прерваться по вызову GetWindowText..." - и Вы МОЖЕТЕ это сделать!!! Но сперва Вы должны убедиться, что символьные имена (имена функций) загружены SoftICE'ом. Если Вы не знаете, как это сделать - см. приложение A.
Чтобы установить "ловушку" (на самом деле это называется точкой останова или брейкпоинтом) в SoftICE, Вы должны зайти в отладчик нажатием клавиш Ctrl-D и использовать команду BPX. В качестве параметра команды можно использовать либо имя функции, либо непосредственно адрес. Так как наш "объект изучения" (Task Lock) является 32-битным приложением, мы должны поставить брейкпоинт на функцию GetWindowTextA. Если это не поможет, попробуйте поставить брейкпоинт на другие функции.
В командной строке SoftICE наберите следующее:
:bpx getwindowtexta
Если Вы получите сообщение об ошибке (например, "No LDT"), убедитесь, что в фоне у Вас не выполняются никакие другие приложения. Я заметил, что Norton Commander в фоне является причиной подобного поведения SoftICE.
Вы можете проверить наличие брейкпоинтов командой:
:bl
В результате Вы увидите что-нибудь типа:
00)BPX USER32!GetWindowTextA C=01
Чтобы выйти из отладчика, нажмите Ctrl-D (или F5) еще раз.
Продолжим... Итак, Вы установили брейкпоинт и теперь SoftICE будет "выскакивать" при каждом вызове функции GetWindowTextA. Попробуем ввести какое-нибудь значение в окне регистрации и нажмем OK. Вы нажимаете OK... ...и получаете дурацкое сообщение о том, что Ваш код был неправильным. Значит, это была не функция GetWindowTextA... Попробуем GetDlgItemTextA. Удалим старый брейкпоинт:
:bc 0
(0 - это номер брейкпоинта в списке брейкпоинтов)
И установим новый:
:bpx getdlgitemtexta
Ну что ж, попробуем еще раз...
3.1.3 В отладчике
Wow! Работает! Теперь вы в SoftICE, в самом начале функции GetDlgItemTextA. Чтобы попасть туда, откуда она была вызвана, нажмите F11. Теперь Вы внутри модуля SGLSET.EXE. Если Вы не уверены - посмотрите на строчку между окном кода и окном командной строки, она должна выглядеть так:
----------SGLSET!.text+1B13----------
Сейчас Вы уже можете запретить реакцию на вызов функции:
:bd 0
Если Вам вдруг захочется снова разрешить ее, наберите:
:be 0
Первая строка в окне кода выглядит так:
CALL[USER32!GetDlgItemTextA]
Чтобы посмотреть строчки над ней, нажимайте Ctrl+Up ("стрелка вверх") до тех пор, пока не увидите нижеприведенный кусок кода. Если Вы ничего не понимаете в Ассемблере, я добавил комментарии которые могут Вам помочь.
RET ; Конец функции
PUSHEBP ; Начало другой функции
MOVEBP, ESP ; ...
SUBESP, 0000009C ; ...
PUSHESI ; ...
>LEA EAX, [EBP-34] ; EAX = EBP-34
PUSHEDI ; ...
MOVEESI, ECX ; ...
PUSH32 ; Макс. длина строки
>PUSHEAX ; Адрес текстового буфера
PUSH000003F4 ; Идентификатор управления
PUSHDWORD PTR [ESI+1C] ; Идентификатор окна диалога
CALL[USER32!GetDlgItemTextA] ; Получить текст
Команды PUSH означают сохранение значений для последующего использования.
Я пометил важные строчки символом '>'. Глядя на этот код, мы видим, что адрес текстового буфера
Похожие работы
Интересная статья: Основы написания курсовой работы

(Назад)
(Cкачать работу)