Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #84, ДЕКАБРЬ 2005 г.

SoftICE как логгер

крис касперски ака мыщъх

Хакер, номер #084, стр. 084-112-6


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

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

[фиктивная точка останова позволяет использовать ключевое слово IF]

BPX EIP IF (EAX==0) DO xxx

Естественно, независимо от того сработает ли точка останова или нет, нам необходимо восстановить регистр EAX (про флаги мы помним, но не сохраняем их, чтобы не загромождать код), вернуть кусок оригинальной программы на место и удалить фиктивную точку, поскольку количество точек останова ограниченно. Что касается регистра EAX, то он может быть восстановлен командой POP EAX, следующей за CALL EAX, а вернуть программу на место поможет конструкция 'M ESP-20 L 10 EIP-9'. Откуда взялось 'EIP-9'? Прочему не EIP? Так ведь в процессе выполнения «заплатки» значение EIP изменилось! Число «9» и есть размер нашей заплатки вместе с командой POP EAX. Остается сказать «R EIP = EIP-9», чтобы вернуть EIP на место, и выполнение отлаживаемой программы можно смело продолжать. Если все было сделано правильно и никакой защитный механизм не использовал незадействованный стек, то отлаживаемая программа не рухнет.

Кстати говоря, под Windows 9x с некоторой вероятностью сбои все-таки будут происходить, поскольку она активно мусорит в стеке. Чтобы не дать ей хулиганить, регистр ESP следует на время выполнения всех операций подтянуть наверх, а затем снова опустить назад.

Естественно, необязательно каждый раз набивать машинные коды вручную. Занятие это утомительное, и приятным его никак не назовешь. Вот тут-то нам и пригодятся макросы! Говорим 'MACRO MACRO_NAME = "xxxxx"' и заносим макрос в список постоянных. Это делается так: запускам Symbol Loader, заходим в Edit -> SoftICE Initialization Setting, переходим к вкладке Macro Definitions, нажимаем Add, даем макросу имя (name) и тело (definition). Теперь макрос будет автоматически загружаться вместе с SoftICE. Можно создать библиотеку собственных расширенных условных точек останова, поддерживающих такие функции поиска подстроки в строке или сравнения строк по шаблонам '*' и '?'. Это действительно можно сделать, и тогда мощь SoftICE многократно возрастет, кроме того, мы получим замечательный шанс попрактиковаться программированию в машинных кодах!

Кстати говоря, макросы позволяют решить и другую проблему. Дело в том, что SoftICE не поддерживает вложенные точки останова, без которых нам никак не обойтись (как мы помним, для анализа содержимого регистра EAX нам пришлось прибегнуть к созданию фиктивной точки останова). Если мы попытаемся написать: 'BPX CreateFileA DO "xxx; bpx EIP DO "XXXX"; x;"', то ничего не получится! SoftICE запутается в кавычках и откажется переваривать такую конструкцию. Но если оформить 'bpx EIP DO "XXXX"' в виде макроса, названного, например, XYZ, то конструкция 'BPX CreateFileA DO "xxx; XYZ; x;"' будет воспринята отладчиком вполне благосклонно.

Назад на стр. 084-112-5  Содержание  Вперед на стр. 084-112-7