Подтвердить что ты не робот

Какой твой любимый анти-отладочный трюк?

У моего предыдущего работодателя мы использовали сторонний компонент, который в основном был только DLL и заголовочным файлом. Этот конкретный модуль обрабатывал печать в Win32. Однако компания, которая сделала компонент, стала банкротом, поэтому я не мог сообщить об ошибке, которую я нашел.

Итак, я решил сам исправить ошибку и запустил отладчик. Я с удивлением обнаружил код отладки почти везде, обычный IsDebuggerPresent, но то, что привлекло мое внимание, было следующим:

    ; some twiddling with xor 
    ; and data, result in eax 
    jmp eax 
    mov eax, 0x310fac09 
    ; rest of code here 

На первый взгляд я просто перешагнул рутину, которая была вызвана дважды, а затем просто пошли бананы. Через некоторое время я понял, что результат бит-вертела всегда был одинаковым, т.е. Jmp eax всегда прыгал прямо в инструкцию mov eax, 0x310fac09. Я расчленял байты и там был, 0f31, инструкция rdtsc, которая использовалась для измерения времени, проведенного между некоторыми вызовами в DLL.

Итак, мой вопрос SO: Какой твой любимый анти-отладочный трюк?

4b9b3361

Ответ 1

Мой любимый трюк - написать простой эмулятор команд для неясного микропроцессора.

Защита от копирования и некоторые основные функции затем будут скомпилированы для микропроцессора (GCC - отличная помощь здесь) и привязаны к программе как двоичный blob.

Идея заключается в том, что защита от копирования не существует в обычном коде x86 и как таковая не может быть разобрана. Вы не можете удалить весь эмулятор либо потому, что это приведет к удалению основных функций из программы.

Единственный шанс взломать программу - это перепроектировать то, что делает микропроцессорный эмулятор.

Я использовал MIPS32 для эмуляции, потому что было так легко эмулировать (потребовалось всего 500 строк простого C-кода). Чтобы сделать вещи еще более неясными, я не использовал необработанные коды операций MIPS32. Вместо этого каждый код операции был привязан к собственному адресу.

Двоичный код защиты от копирования выглядел как мусор-данные.

Настоятельно рекомендуется! Прошло более 6 месяцев, прежде чем появилась трещина (это было для игрового проекта).

Ответ 2

Я был членом многих сообществ RCE и имел свою долю взлома и взлома. С моего времени я понял, что такие фальшивые трюки обычно нестабильны и бесполезны. Большинство общих анти-отладочных трюков являются специфичными для ОС, а не "переносимыми".

В вышеприведенном примере вы предположительно используете встроенную сборку и функцию naked __declspec, которые не поддерживаются MSVC при компиляции в архитектуре x64. Конечно, есть еще способы реализовать вышеупомянутый трюк, но кто-то, кто реверсировал достаточно долго, сможет обнаружить и победить этот трюк за считанные минуты.

Как правило, я предлагаю отказаться от использования анти-отладочных трюков за пределами использования API IsDebuggerPresent для обнаружения. Вместо этого я предлагаю вам закодировать заглушку и/или виртуальную машину. Я закодировал свою собственную виртуальную машину и уже много лет совершенствую ее, и я могу честно сказать, что это было наилучшее решение, которое я принял сегодня в отношении защиты моего кода.

Ответ 3

Отключите дочерний процесс, который привязывает родителя как отладчик и изменяет ключевые переменные. Бонусные баллы за сохранение резидентного процесса и использование операций с памятью отладчика как своего рода IPC для определенных операций с ключами.

В моей системе вы не можете подключить два отладчика к одному процессу.

Хорошая вещь об этом, если они не пытаются вмешаться в вещи, ничего не сломается.

Ответ 5

Самый современный метод обфускации, по-видимому, является виртуальной машиной.

В основном вы принимаете часть своего объектного кода и конвертируете его в свой собственный формат байт-кода. Затем вы добавляете небольшую виртуальную машину для запуска этого кода. Единственный способ правильно отладить этот код - это код эмулятора или дизассемблера для вашего формата команд VM. Конечно, вам тоже нужно думать о производительности. Слишком большой байт-код сделает вашу программу медленнее, чем собственный код.

Самые старые трюки теперь бесполезны:

  • Isdebuggerpresent: очень хромает и легко исправляется
  • Другие обнаружения отладки/обнаружения точки останова
  • Материал Ring0: пользователям не нравится устанавливать драйверы, вы можете на самом деле сломать что-то на своей системе и т.д.
  • Другие тривиальные вещи, которые все знают, или это делает ваше программное обеспечение неустойчивым. помните, что даже если трещина сделает вашу программу нестабильной, но она по-прежнему работает, эта нестабильность будет зависеть от вас.

Если вы действительно хотите запрограммировать решение VM самостоятельно (есть хорошие программы для продажи), не используйте только один формат инструкции. Сделайте это полиморфным, чтобы вы могли иметь разные части кода в другом формате. Таким образом, весь ваш код не может быть разбит, написав только один эмулятор/дизассемблер. Например, решение MIPS, предлагаемое некоторыми людьми, кажется, легко сломано, потому что формат команд MIPS хорошо документирован, а инструменты анализа, такие как IDA, уже могут разобрать код.

Список форматов команд, поддерживаемых дизассемблером IDA pro

Ответ 6

Я бы предпочел, чтобы люди пили программное обеспечение, которое является надежным, надежным и делает то, что рекламируется. То, что они также продают его по разумной цене с разумной лицензией.

Я знаю, что я потратил слишком много времени на то, чтобы иметь дело с поставщиками, которые имеют сложные схемы лицензирования, которые только создают проблемы для клиентов и поставщиков. Всегда рекомендую избегать этих поставщиков. Работая на атомной электростанции, мы вынуждены использовать определенные продукты поставщиков и, следовательно, вынуждены иметь дело с их схемами лицензирования. Хотелось бы, чтобы был способ вернуть время, которое я лично потратил впустую, имея дело с их неудачными попытками предоставить нам рабочий лицензионный продукт. Похоже, что это мелочь, но все же это кажется трудной задачей для людей, которые слишком сложны для своего же блага.

Ответ 7

Во-вторых, предложение виртуальной машины. Я реализовал симулятор MIPS I, который (теперь) может выполнять двоичные файлы, созданные с помощью mipsel-elf-gcc. Добавьте к этому возможности шифрования кода/данных (AES или с любым другим алгоритмом по вашему выбору), способность самомодуляции (так что вы можете иметь вложенные симуляторы), и у вас есть довольно хороший программный обфускатор.

Хорошей особенностью выбора MIPS я является то, что 1) она легко реализуется, 2) я могу писать код на C, отлаживать его на своем рабочем столе и просто перекрестно компилировать его для MIPS, когда это будет сделано. Нет необходимости отлаживать пользовательские коды операций или вручную писать код для пользовательской виртуальной машины.

Ответ 8

Мой личный фаворит был на Amiga, где есть сопроцессор (Blitter), делающий большие передачи данных независимо от процессора; этому чипу будет поручено очистить всю память и reset от таймера IRQ.

При подключении картриджа Action Replay остановка процессора будет означать, что Blitter продолжит очистку памяти.

Ответ 9

Рассчитанные прыжки в середине законного вида, но действительно скрывающие фактические инструкции инструкций, являются моими любимыми. В любом случае их легко обнаружить для людей, но автоматические инструменты часто испортили его.

Также замена обратного адреса в стеке делает приятным времяпрепровождением.

Ответ 10

Использование nop для удаления сборки через отладчик - полезный трюк. Конечно, вернуть код намного сложнее!!!