Антиотладка. Теория и практика защиты приложений от дебага - «Новости»
«Жизнь в Найт-Сити продолжается»: CD Projekt Red и студия Trigger официально анонсировали Cyberpunk: Edgerunners 2 - «Новости сети»
«Жизнь в Найт-Сити продолжается»: CD Projekt Red и студия Trigger официально анонсировали Cyberpunk: Edgerunners 2 - «Новости сети»
В Китае набрали популярность «обманки» для автопилота Tesla, которые позволяют не держаться за руль - «Новости сети»
В Китае набрали популярность «обманки» для автопилота Tesla, которые позволяют не держаться за руль - «Новости сети»
Sony приостановила продажи Xperia 1 VII из-за технических проблем - «Новости сети»
Sony приостановила продажи Xperia 1 VII из-за технических проблем - «Новости сети»
Испытания солью, пылью и асфальтом: Apple показала, как тестирует iPhone на прочность - «Новости сети»
Испытания солью, пылью и асфальтом: Apple показала, как тестирует iPhone на прочность - «Новости сети»
Большинство новейших видеокарт по-прежнему продаются с наценкой в 12–57 % — особенно GeForce RTX 5090 и 5080 - «Новости сети»
Большинство новейших видеокарт по-прежнему продаются с наценкой в 12–57 % — особенно GeForce RTX 5090 и 5080 - «Новости сети»
Нил Дракманн бросил сериал The Last of Us, чтобы «целиком сосредоточиться» на Intergalactic: The Heretic Prophet - «Новости сети»
Нил Дракманн бросил сериал The Last of Us, чтобы «целиком сосредоточиться» на Intergalactic: The Heretic Prophet - «Новости сети»
Blizzard разочаровалась в Warcraft Rumble и уволила «большую часть» команды — нового контента не будет - «Новости сети»
Blizzard разочаровалась в Warcraft Rumble и уволила «большую часть» команды — нового контента не будет - «Новости сети»
Первый независимый обзор GeForce RTX 5050 — медленнее Intel Arc B580 и GeForce RTX 4060 - «Новости сети»
Первый независимый обзор GeForce RTX 5050 — медленнее Intel Arc B580 и GeForce RTX 4060 - «Новости сети»
Руководители крупных компаний перестали скрывать, что ИИ грозит массовыми увольнениями - «Новости сети»
Руководители крупных компаний перестали скрывать, что ИИ грозит массовыми увольнениями - «Новости сети»
Миллионы долларов на ветер — DARPA отменило проект космического рейдера на тепловом ядерном двигателе - «Новости сети»
Миллионы долларов на ветер — DARPA отменило проект космического рейдера на тепловом ядерном двигателе - «Новости сети»
Новости мира Интернет » Новости » Антиотладка. Теория и практика защиты приложений от дебага - «Новости»

Содержание статьи

  • Process Environment Block
  • Flags и ForceFlags
  • Тонкости NtQueryInfoProcess
  • ProcessDebugFlags
  • TLS Callbacks
  • NtSetInformationThread
  • SeDebugPrivilege
  • Заключение
К методам?детектирования отладки прибегают многие программисты: одни хотели бы уберечь свои продукты от конкурентов, другие противостоят вирусным аналитикам или автоматическим системам распознавания малвари. Мы в подробностях рассмотрим разные методы борьбы с дебагом — от простых до довольно нетривиальных.

Поскольку сейчас популярна не только архитектура x86, но и x86-64, многие старые средства обнаружения отладчиков устарели. Другие требуют корректировки, потому что жестко завязаны на смещения в архитектуре x86. В этой статье я расскажу о нескольких методах детекта отладчика и покажу код, который?будет работать и на x64, и на x86.


IsDebuggerPresent() и структура PEB


Начинать говорить об антиотладке и не упомянуть о функции IsDebuggerPresent() было бы неправильно. Она универсальна, работает на разных архитектурах и очень проста в использовании. Чтобы определить отладку, достаточно одной строки кода: if (IsDebuggerPresent()).


Что представляет собой WinAPI IsDebuggerPresent? Эта функция обращается?к структуре PEB.



Process Environment Block


Блок окружения процесса (PEB) заполняется загрузчиком операционной системы, находится в адресном пространстве процесса и может быть модифицирован из режима usermode. Он содержит много полей: например, отсюда можно узнать информацию о текущем модуле, окружении?и загруженных модулях. Получить структуру PEB можно, обратившись к ней напрямую по адресу fs:[30h] для x86 и gs:[60h] для x64.



Соответственно, если загрузить в отладчик функцию IsDebuggerPresent(), на x86-системе мы увидим:


mov
eax,dword ptr fs:[30h]
movzx
eax,byte ptr [eax+2]
ret
[/code]

А на x64 код будет таким:


mov
rax,qword ptr gs:[60h]
movzx eax,byte ptr [rax+2]
ret
[/code]

Что значит byte ptr [rax+2]? По этому смещению находится поле BeingDebugged в структуре PEB, которое и сигнализирует нам о факте отладки. Как еще можно?использовать PEB для обнаружения отладки?


NtGlobalFlag


Во время отладки система выставляет флаги FLG_HEAP_VALIDATE_PARAMETERS, FLG_HEAP_ENABLE_TAIL_CHECK, FLG_HEAP_ENABLE_FREE_CHECK, в поле NtGlobalFlag, которое находится в структуре PEB. Отладчик использует эти флаги для контроля разрушения кучи посредством переполнения. Битовая маска флагов — 0x70. Смещение NtGlobalFlag в PEB для x86 составляет 0x68, для x64 — 0xBC. Чтобы показать пример кода?детекта отладчика по NtGlobalFlag, воспользуемся функциями intrinsics, а чтобы код был более универсальным, используем директивы препроцессора:


#ifdef _WIN64

DWORD pNtGlobalFlag = NULL;
PPEB pPeb = (PPEB)__readgsqword(0x60);
pNtGlobalFlag = *(PDWORD)((PBYTE)pPeb + 0xBC);

#else

DWORD pNtGlobalFlag = NULL;
PPEB pPeb = (PPEB)__readfsdword(0x30);
pNtGlobalFlag = *(PDWORD)((PBYTE)pPeb + 0x68);

#endif

if ((pNtGlobalFlag & 0x70) != 0) std::cout  "Debugger detected!n";

Flags и ForceFlags


PEB также содержит указатель на структуру _HEAP, в которой есть поля Flags и ForceFlags. Когда отладчик подсоединен к приложению, поля Flags и ForceFlags содержат признаки отладки. ForceFlags при отладке не должно?быть равно нулю, поле Flags не должно быть равно 0x00000002:


#ifdef _WIN64

PINT64 pProcHeap = (PINT64)(__readgsqword(0x60) + 0x30);
Получаем структуру _HEAP через PEB
PUINT32 pFlags = (PUINT32)(*pProcHeap + 0x70);
Получаем Flags внутри _HEAP
PUINT32 pForceFlags = (PUINT32)(*pProcHeap + 0x74);
Получаем ForceFlags внутри _HEAP

#else

PPEB pPeb = (PPEB)(__readfsdword(0x30) + 0x18);
PUINT32 pFlags = (PUINT32)(*pProcessHeap + 0x40);
PUINT32 pForceFlags = (PUINT32)(*pProcessHeap + 0x44);

#endif

if (*pFlags & ~HEAP_GROWABLE || *pForceFlags != 0) 
std::cout  "Debugger detected!n";

Источник новостиgoogle.com
Цитирование статьи, картинки - фото скриншот - Rambler News Service.
Иллюстрация к статье - Яндекс. Картинки.
Есть вопросы. Напишите нам.
Общие правила  поведения на сайте.

Содержание статьи Process Environment Block Flags и ForceFlags Тонкости NtQueryInfoProcess ProcessDebugFlags TLS Callbacks NtSetInformationThread SeDebugPrivilege Заключение К методам?детектирования отладки прибегают многие программисты: одни хотели бы уберечь свои продукты от конкурентов, другие противостоят вирусным аналитикам или автоматическим системам распознавания малвари. Мы в подробностях рассмотрим разные методы борьбы с дебагом — от простых до довольно нетривиальных. Поскольку сейчас популярна не только архитектура x86, но и x86-64, многие старые средства обнаружения отладчиков устарели. Другие требуют корректировки, потому что жестко завязаны на смещения в архитектуре x86. В этой статье я расскажу о нескольких методах детекта отладчика и покажу код, который?будет работать и на x64, и на x86. IsDebuggerPresent() и структура PEB Начинать говорить об антиотладке и не упомянуть о функции IsDebuggerPresent() было бы неправильно. Она универсальна, работает на разных архитектурах и очень проста в использовании. Чтобы определить отладку, достаточно одной строки кода: if (IsDebuggerPresent()). Что представляет собой WinAPI IsDebuggerPresent? Эта функция обращается?к структуре PEB. Process Environment Block Блок окружения процесса (PEB) заполняется загрузчиком операционной системы, находится в адресном пространстве процесса и может быть модифицирован из режима usermode. Он содержит много полей: например, отсюда можно узнать информацию о текущем модуле, окружении?и загруженных модулях. Получить структуру PEB можно, обратившись к ней напрямую по адресу fs:_

Смотрите также

А что там на главной? )))



Комментарии )))