Секреты маскировки Крис Касперски Xakep, номер #066, стр. 066-032-6 Соответственно, для вычисления RVA-адреса антиотладочного кода мы должны вычесть из него image base. Тогда мы получим: 03149100h – 03140000h == 9100h. Т.е. берем адрес начала внедряемого в файл кода (который, как мы помним, в нашем случае равен 03149100h), вычитаем из него image base, сообщенный hiew'ом или pe-editor'ом (03140000h), и получаем 9100h. Как вариант можно затоптать кнопочку FLC (File Location Calculator - Калькулятор Файловых Локаций). Перемещаем радиокнопку в положение Virtual Address, топчем 03149100 и давим "calculate", после чего поле RVA будет содержать искомое значение. Записываем это значение в поле Entry Point и вновь возвращаемся в HIEW. Если все было сделано правильно, после двойного нажатия на <ENTER>, последовательное нажатие клавиш <F8> и <F5> перенесет нас аккурат в окрестности новой точки входа. К внедрению антиотладочного кода готов? Блин… ну ты же не пионер… Антиотладочный код Начнем с самого просто – с самомодифицирующегося кода. Забросим на стек инструкцию перехода на оригинальную точку входа и немедленно ее исполним. Для этого нам предстоит набрать следующую последовательность команд: mov eax, абсолютный адрес старой точки входа/push 0E0FF/jmp esp, где "E0FFh" представляют собой машинный код команды jmp eax. Экран HIEW'а после завершения ввода должен выглядеть приблизительно так: Прогнав файл через AVP, мы убеждаемся, что он даже и не порывается хрюкать! Dr.WEB рычит, но это явление временное, и скоро мы его обломаем. Открываем на радостях свежее пиво! Малость промочив горло и ощупав растущий живот, мы приступаем к более сложным фокусам. А именно – передаче управления посредством структурного исключения, более известного под аббревиатурой SEH. Никакие известные мне антивирусы SEH не эмулируют, отладчики от него едут крышей, а начинающие хакеры тонут в диспетчере, умирая за трассировкой от старости и истощения. Один из вариантов реализации антиотладочного кода выглядит так: заталкиваем в стек адрес старой точки входа (в нашем случае это 315E001h), заталкиваем указатель на предыдущий обработчик (он лежит в двойном слове по адресу FS:[0]) и регистрируем свой обработчик установкой FS:[0] на вершину стека. Затем возбуждаем исключение, например, порываемся делить на ноль, выполняем несуществующую машинную команду или обращаемся к несуществующему/защищенному адресу памяти (скажем, лезем в ядро). И что же? Оба антивируса молчат, а отладчики при достижении строки 3149111h забрасывают нас глубоко в ядро, и далеко не каждый хакер знает, как заставить soft-ice отобразить истинный адрес перехода (правильный ответ: дать команду xframe). |