Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Скрытие кода *.exe-файла

#шифрование #обфускация #дизассемблирование #обратная_разработка


Как можно скрыть код exe-файла (написаного, например, на Delphi) от расшифровки под
дизассемблером и, впоследствии, от реверса.

Строки, например, можно просто XOR-ить или смещать каждый символ на k позиций по
таблице ASCII (первое лучше, ИМХО). А вот как скрыть имена функций или даже целые блоки
кода? Ведь многие разработчики (особенно вирусописатели) любят это делать, тем самым
скрывая свои «творения» от исследования посторонними лицами. Таким же образом скрывается
от антивирусов всем известный SpyEye. А как этого добиться мне?
    


Ответы

Ответ 1



(Некоторое время не занимался реверсингом, поэтому информация может быть outdated) Если говорить о серьезной обфускации, то имеет смысл рассматривать только языки, которые компилируются в машинный код (C++, например). Языки с промежуточным слоем байт-кода обычно легко поддаются реверсингу и, судя по всему, пока нет более-менее адекватных способов запротектить написанные на них приложения. Адекватные протекторы совершают некоторую последовательность действий для защиты готового приложения от реверсинга: Вставляют в готовый бинарник готовые антиотладочные фрагменты кода (например, дешифрующий его в рантайме), путают секции, совершают хитрые джампы, в общем, совершают атомарные изменения (не меняющие поведение программы!) над исполняемым кодом, которые затрудняют отладку человеку. Человек - это reverse engineer, который открывает ваше приложение в IDA, зрительно выцепляет знакомые паттерны из дизассемблерного листинга, трейсит приложение, подменяя содержимое стека и патча это самое приложение в его рантайме. И основная цель этих защитных действий протектора - заставить реверсера сказать "Тьфу, пошло оно в ж*пу, задолбало", поскольку последовательность действий протектора всегда можно совершить в обратную сторону, был бы опыт и знания. Более серьезная защита, иногда останавливающая даже крутых и опытных реверсеров - это виртуализация кода приложения для того, чтобы исполнять его на собственной виртуальной машине (обычно сочетается со стандартным антиотладочными приемами, описанными выше). При этом виртуальная машина внедряется в бинарник вместе с некоторым IL-кодом, который может выглядеть абсолютно произвольно. Параметры создаваемой машины также можно варьировать в некоторых пределах - при желании можно и виртуалку с троичной логикой написать. Бонус такого подхода в том, что для полноценного реверсинга такого приложения необходимо каким-либо образом воспроизвести эту самую виртуальную машину. В такой ситуации (если виртуалка оказывается достаточно хитрой), большая часть стандартных тулзов и приемов реверсера перестает работать "из коробки". Что, опять же, приближает этого самого потенциального реверсера к состоянию "Спасибо, с меня хватит". С точностью до деталей таким образом протектит Themida. В соответствии с написанным выше - если есть желание запротектить свою программу более-менее достойно, то напишите свою виртуалку и сгенерируйте для нее IL-код из имеющихся объектных файлов вашего приложения. Это действие поможет отсеять большую часть реверсеров, которым недавно рассказали и показали, что такое IDA и как применять patch. Quick test - для того, чтобы понять, сможете ли вы создать более-менее адекватную защиту с виртуализацией, попробуйте сломать CrackMe от ESET. Если поймете, причем здесь SSE и общую механику проверки, то можно браться за дело. Всегда есть набор готовых public и private пакеров, которыми можно воспользоваться. Themida, ASProtect, FSG. Понятно также, что всегда найдется набор людей, которые эти или иные протекторы в состоянии снять.

Комментариев нет:

Отправить комментарий