Хакерские трюки или как поставить бряк на jmp eax


Программирование шаблонов в машинных кодах - часть 2


Остается проверить: является ли третья по счету команда условным переходом или нет? Увеличиваем EIP еще на 2 байта (длина TEST EAX, EAX) и смотрим: если это 74h или 75h — искомая последовательность команд найдена!

Чтобы "скормить" эту конструкцию отладчику, необходимо изучить синтаксис выражений строки "condition is TRUE", описанный в разделе "evaluation of expressions" файла OllyDbg.hlp. Он совсем не похож ни на синтаксис soft-ice, ни на Си и представляет собой нечто среднее между ассемблером и смесью Паскаля и Си. Тождество задается двойным знаком равенства "==", а неравенство "!=" (как в Си). Логические операции AND и OR обозначаются одинарными операторами "&" и "|" (не так, как в Си). Выражение, заключенное в квадратные скобки, возвращает содержимое ячейки памяти по данному адресу, например, "[EAX]". По умолчанию размер ячейки составляет четыре байта, а для преобразования типов используются ключевые слова BYTE, WORD и DWORD, например, "[BYTE ESI] == 41". Все числа трактуются как шестнадцатеричные и должны начинаться с цифры. То есть, 0FA – правильно, а FA – уже нет. К сожалению, OllyDbg не выдает сообщение об ошибках, затрудняя отладку выражений. Если после числа стоит точка, оно трактуется как десятичное, поэтому выражение (10==16.) истинно. Литералы заключаются в одиночные кавычки ('A'==41), а строки — в двойные. Выражение ([ESI] =="password") становится истинным, когда регистр ESI указывает на ASCII-строку "password" (квадратные скобки необязательны и их можно опустить), если же строка задана в уникоде, используйте ключевое слово UNICODE, например, (UNICODE [ESI]=="password"). Так же, допустимы арифметические выражения типа "*", "+", "-" и знаки больше/меньше.

Сказанного вполне достаточно для написания сколь угодно сложных шаблонов. В частности, поиск нашей последовательности CALL const/TEST EAX, EAX/Jx const, осуществляется так:




- Начало -  - Назад -  - Вперед -