Иногда необходимо задать кодокопателю задачу и наставить ловушек, из которых выбраться будет непросто. Как тебе, например, идея: превратить некоторую исходную инструкцию PE-файла в переход к коду, – он будет выполнять модификацию этой инструкции перехода (от которой получил управление), превращая ее в исходную?
Схематично этот процесс выглядит следующим образом:
[Ручное выполнение преобразования над инструкцией - превращение ее в переход] > [Выполнение инструкции (переход к управляющему коду)] > [Выполнение кода обратного преобразования] > [Передача управления на преобразованную инструкцию]Рассмотрим простой пример. Допустим, мы имеем программу, на точке входа (00401000) которой располагается инструкция «PUSH 0». Ее двухбайтный опкод выглядит как «6A 00». Предположим, что наш код обратного преобразования будет располагаться по адресу 00401026. Тогда инструкция перехода к нему будет выглядеть: «jmp 00401026», а опкод ее (также двухбайтный) равен EB 24. Значит, необходимо получить набор инструкций, который будет преобразовывать опкод «EB 24» в опкод «6A 00». Самый простой способ - применение логической операции «XOR» (хотя можно использовать любые, сколь угодно сложные, алгоритмы преобразования). Чтобы превратить машинное слово «EB24» в слово «6A00», необходимо выполнить операцию XOR с некоторым числом X: EB24 XOR X = 6A00. Вспомним математическую логику и получим число X следующим образом: X = 6A00 XOR EB24, откуда X = 8124. Учтем, что процессор забирает данные «задом наперед»; для преобразования одной инструкции в другую нужно будет выполнить операцию XOR 2481.
Итак, вот последовательность необходимых действий:
1. Открываем программу в OllyDBG и изменяем инструкцию «PUSH 0», расположенную по адресу 00401000, на инструкцию «jmp 00401026», имеющую опкод EB24.
2. Начиная с адреса 00401026, размещаем следующий код, выполняющий преобразование инструкции вызова:
00401026 MOV EAX, 00401000; помещаем в регистр EAX адрес изменяемой инструкции
0040102B MOV EBX, [EAX]; помещаем опкод инструкции в регистр EBX
0040102D XOR EBX,2481; выполняем операцию XOR - приводим инструкцию «jmp 00401026» к виду «PUSH 0»
00401033 MOV [EAX],EBX; записываем измененную инструкцию...
00401035 JMP 00401000; ... и передаем ей управление3. Запускаем программу для пошагового выполнения и наслаждаемся результатами трюка. Это действительно работает!
Сей трюк - лишь часть обширного набора средств «запудривания мозгов реверсеру». Он прост, но содержит в себе большой потенциал: к примеру, можно производить множественные модификации одной инструкции, усложнять алгоритм преобразования, делая его неявным или «размазанным» по коду программы, – и так далее.
Сей трюк - лишь часть обширного набора средств «запудривания мозгов реверсеру». Он прост, но содержит в себе большой потенциал: к примеру, можно производить множественные модификации одной инструкции, усложнять алгоритм преобразования, делая его неявным или «размазанным» по коду программы, – и так далее.
Комментариев нет:
Отправить комментарий