пятница, 15 мая 2009 г.

Игры с Turbo Debagger

После знакомства немного поиграем с отладчиком, чтобы получше его узнать.
В отладчике можно менять и значения регистров по ходу выполнения программы. Сделаем следующий финт ушами – загрузим программу hello4.exe снова в отладчик и выполним все команды до первой команды int 21h. К этому моменту в регистр DX будет помещено смещение поля данных msg, в данном случае 0000. Изменим значение регистра DX на 5. Теперь выполним команду int 21h и DOS выведет на экран строку, начало которой расположено на 5 байте сегмента данных (помним нумерация начинается с нуля). В нашем случае смещение 5 указывает на буку е. То есть будет выведена фраза ' ello World *=-'. Медитируем, просветляемся :)

Еще одной полезной опцией отладчика является вывод содержимого области памяти, начиная с заданного адреса (дамп памяти). Таким образом можно увидеть содержимое не только поля данных программы, но и содержимое вообще любых участков памяти компьютера, в частности системных таблиц. Посмотрим, например, как выглядит в памяти блок окружения программы.
Любая программа, загруженная в память состоит из двух отдельных блоков: собственно программы и ее окружения, которое располагается обычно перед программой, хотя не обязательно вплотную к ней.
Окружение представляет собой область памяти, в которой в виде символьных строк записаны значения переменных, называемых переменными окружения, например: path, set и т.д.
Сегментный адрес окружения загружаемой программы записывается ОС в PSP со смещением 2Ch от его начала. Чтобы увидеть все это дело, снова загружаем hello4.exe в отладчик открываем окно CPU, переходим в окно дампа памяти и даем команду Goto и параметр ей 2C, жамкаем Enter и видим:

Внимательно медитируем на цифири 0A 15…. Что это? А это сегментный адрес окружения программы, только наоборот :), то есть 150A. Еще раз жмем Goto, параметр 150A:0 и видим:

К сожалению в окне CPU нельзя изменять взаимный размер окон и окно дампа памяти всегда оказывается не большим. Если хотим увидеть сравнительно большой участок памяти, лучше это сделать выбрав пункт меню View->Dump. И там проделать все те же операции, что мы выполнили до этого.

Комментариев нет: