Программирование в машинных кодах или soft-ice как logger

ассемблирование нашей функции в soft-ice


Теперь программа лежит на стеке, но вот как ее исполнить? Да очень просто! Сказать 'G esp-10' (перейти к адресу esp-10) и пусть процессор выкручивается как может. Только ведь хрен он выкрутиться. Чтобы возвратить управление в текущее место отлаживаемой программы необходимо предварительно сохранить регистр EIP, а сделать это не так-то просто. Команда 'E (esp-10) EIP' не работает поскольку не допускает использования выражений (а имя регистра — это выражение) и обламывает нас по полный "syntax error". Как быть? Кого мочить? Что делать?!

А давайте воспользуется командой 'M' (move), копирующий блоки памяти из одного адреса в другой. Тогда мы сможем сохранить кусочек оригинальной программы на стеке, а саму оригинальную программу модифицировать по своему усмотрению. Конкретно мы будем должны записать PUSH EAX/MOV EAX,ESP/SUB EAX,10h/CALL EAX или что-то того. Короче нам нужна команда CALL ESP-N, по поскольку такой команды в лексиконе x86 процессоров нет и никогда не существовало, нам приходится ее эмулировать через математические преобразования с любым дополнительным регистром, например, EAX. В машинном коде это выглядит так: "50h/8Bh C4h/83h E8h 10h/FFh D0h".

Копируем кусок отлаживаемой программы на стек: 'M EIP L 10 ESP-20', где 'ESP?20' — адрес-приемник, лежащий выше указателя вершины стека и не затирающий нашу машинную программу. Теперь модифицируем окрестности отлаживаемой программы: 'ED EIP 83C48B50; ED EIP+4 D0FF10E8'. Как видно, это тот же самый код, только набранный задом наоборот, потому что в x86 процессорах младший байт располагается по меньшему адресу.

На этом подготовительный этап можно считать законченным. Говорим 'T' (TRACE), повторяя эту команду четыре раза до входа в нашу функцию, а затем отдаем приказ 'P RET' для выхода оттуда. И все!!! В регистре EAX теперь содержится ноль! Наша функция завершила свою работу и возвратила все, что хотела! Разве это не здорово — выполнять в отладчике свой собственный код, написанный с чистого листа?!

Но вот проблема — как проанализировать возвращенное значение в отладчике? Если попытаться пойти прямым путем: 'IF (eax==0) DO xxxx' нас поимеют по всему мясокомбинату. Ну не понимает soft-ice условных команд и ключевое слово IF может встречаться только в точках останова. Так давайте и создадим ему фиктивную точку останова, которая срабатывает всегда! Что-то вроде:

BPX EIP IF (EAX==0) DO xxx



Содержание раздела