SoftICE как логгер крис касперски ака мыщъх Хакер, номер #084, стр. 084-112-5 Чтобы осуществить задуманное, мы должны сделать следующее: * поместить машинный код нашей функции выше вершины стека; * сохранить текущее значение регистра EIP и регистра флагов (например, в том же стеке); * сохранить все регистры, которые изменяет наша функция; * установить EIP на начало нашей функции; * тем или иным образом передать аргументы (например, через регистры); * выполнить функцию, возвратив результат работы, например, через EAX; * проанализировать возвращенное значение, выполнив те или иные операции; * восстановить измененные регистры; * восстановить регистр EIP и регистр флагов; * продолжить нормальное выполнение программы. Звучит устрашающе, но ничего сложного в этом нет. Давай для начала попытаемся выполнить функцию XOR EAX,EAX/RET. Как перевести ее в машинный код? Можно, конечно, воспользоваться HIEW'ом или даже FASM'ом, но зачем выходить из SoftICE? Достаточно переместиться в любое свободное место памяти и дать команду 'a' (assemble - то есть ассемблировать), только предварительно убедись, что ты находишься в контексте отлаживаемого приложения (его имя отображается в правом нижнем углу экрана), а не в ядре, иначе случится крах. [ассемблирование нашей функции в SoftICE] :a esp-10 0023:0012B0DC xor eax,eax 0023:0012B0DE ret 0023:0012B0DF :d esp-10 0023:0012B0DC 33 C0 C3 00 DB 80 FB 77-88 AE F8 77 FF FF FF FF 3......w...w.... 0023:0012B0EC 31 D8 43 00 E8 59 48 00-00 00 00 C0 03 00 00 00 1.C..YH......... Теперь программа лежит на стеке, но вот как ее исполнить? Да очень просто! Сказать '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 процессорах младший байт располагается по меньшему адресу. |