Blog. Just Blog

Использование TEB для антиотладки

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование TEB для антиотладки
Использование TEB для антиотладки

Структура TEB (Thread Environment Block), как и PEB (Process Environment Block), при грамотном использовании позволяет получить огромное количество полезной информации. Сегодня расскажу еще об одном малоизвестном антиотладочном трюке. Он основан на том, что при нормальном запуске приложения в поле StaticUnicodeBuffer структуры TEB не содержится ничего, а при запуске под отладчиком там обязательно оказывается название той или иной динамической библиотеки, используемой приложением.

Единственный минус в том, что этот способ работает только на Windows Vista и Windows 7. По результатам тестирования выявлено, что на более старых и более новых системах это не срабатывает. Увы.
  1.         mov     ecx,30h
  2.         ; Указатель на РЕВ
  3.         mov     eax,[fs:ecx]
  4.         ; PEB->OSMajorVersion
  5.         cmp     dword [eax+ecx+0074h],6
  6.         ; Трюк работает только на Vista и Win7
  7.         jne     loc_normal
  8.         ; ECX=18h
  9.         shr     ecx,1
  10.         ; Указатель на TEB
  11.         mov     eax,[fs:ecx]
  12.         ; ECX=0C00h
  13.         shl     ecx,7
  14.         ; TEB->StaticUnicodeBuffer
  15.         cmp     word [eax+ecx],0
  16.         ; Строка пустая?
  17.         je      loc_normal
  18. loc_debug:
  19.         ; Обнаружен отладчик
  20.         ...
  21.         ...
  22. loc_normal:
  23.         ; Нормальный запуск
  24.         ...
  25.         ...
Адресация через регистр ECX и его последующая модификация сделана специально, чтобы типовой код работы с PEB/TEB не был таким очевидным. Код маленький, его легко "размазать" между другими командами. Проверка версии Windows тоже сделана без использования WinAPI. В чистом виде это выглядит вот так:
  1.         ; Указатель на РЕВ
  2.         mov     eax,[fs:30h]
  3.         ; PEB->OSMajorVersion
  4.         cmp     dword [eax+00A4h],6
  5.         ; Трюк работает только на Vista и Win7
  6.         jne     loc_normal
  7.         ; Указатель на TEB
  8.         mov     eax,[fs:18h]
  9.         ; TEB->StaticUnicodeBuffer
  10.         cmp     word [eax+0C00h],0
  11.         ; Строка пустая?
  12.         je      loc_normal
  13. loc_debug:
  14.         ; Обнаружен отладчик
  15.         ...
  16.         ...
  17. loc_normal:
  18.         ; Нормальный запуск
  19.         ...
  20.         ...
При запуске 32-битных приложений на 64-битных системах надо обрабатывать параметр StaticUnicodeBuffer в TEB64. Найти адрес TEB64 не составит труда, он хранится в [TEB32+0F70h]. Если там ненулевое значение, то это и есть адрес TEB64. Адрес StaticUnicodeBuffer в этом случае тоже будет другим. Вот универсальное решение:
  1.         ; Указатель на РЕВ
  2.         mov     eax,[fs:30h]
  3.         ; PEB->OSMajorVersion
  4.         cmp     dword [eax+00A4h],6
  5.         ; Трюк работает только на Vista и Win7
  6.         jne     loc_normal
  7.         ; Указатель на TEB32
  8.         mov     eax,[fs:18h]
  9.         ; Указатель на TEB64 есть?
  10.         mov     ebx,[eax+0F70h]
  11.         or      ebx,ebx
  12.         jnz     loc_x64
  13. loc_x86:
  14.         ; TEB32->StaticUnicodeBuffer
  15.         cmp     word [eax+0C00h],0
  16.         ; Строка пустая?
  17.         je      loc_normal
  18.         jmp     loc_debug
  19. loc_x64:
  20.         ; TEB64->StaticUnicodeBuffer
  21.         cmp     word [ebx+1268h],0
  22.         ; Строка пустая?
  23.         je      loc_normal
  24. loc_debug:
  25.         ; Обнаружен отладчик
  26.         ...
  27.         ...
  28. loc_normal:
  29.         ; Нормальный запуск
  30.         ...
  31.         ...
Что интересно, таким способом ловится не только OllyDbg, но даже могучий x64dbg, который обычно с легкостью обходит в автоматическом режиме большинство известных антиотладочных приемов (протестировано на Win7x86 и Win7x64). Опять же, не надо сразу оповещать исследователя о том, что мы знаем о его присутствии, надо просто начинать мелко пакостить. Например, как я уже говорил, можно вносить ошибочные данные в результаты расчетов, или пускать алгоритм по заведомо неправильной ветке, или имитировать ошибку и завершать работу, или генерировать миллионы разных исключений, или сыпать всякий хлам в OutputDebugString, или еще что-нибудь подобное. Но только не надо опускаться до реальной деструкции.

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

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

TEB.Antidebug.Demo.zip (1,516 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 674 | Комментариев: 14

Комментарии

Отзывы посетителей сайта о статье
ManHunter (28.01.2022 в 17:33):
Традиционное противостояние брони и снаряда. На хитрую жопу всегда есть хер с винтом, на хер с винтом есть жопа с закоулками, на жопу с закоулками есть хер с путеводителем, ну и так далее.

ЦитатаА я предпочитаю использовать старые проги до 2015г, пока их хватает)

+100500
brute (27.01.2022 в 13:24):
Кодер, имхо, такая защита - прошлый век. Сейчас покупается 1 экземляр лицензии и распространяется бесконечно (обрубив функции проверки по сети) или делается портабельная версия. Для особо дорогого софта можно и образ виртуалки распространять с установленным софтом. А я предпочитаю использовать старые проги до 2015г, пока их хватает)
кодер (25.01.2022 в 16:41):
"Опять же, не надо сразу оповещать исследователя о том, что мы знаем о его присутствии, надо просто начинать мелко пакостить. Например, как я уже говорил, можно вносить ошибочные данные в результаты расчетов, или пускать алгоритм по заведомо неправильной ветке, или имитировать ошибку и завершать работу, или генерировать миллионы разных исключений, или сыпать всякий хлам"

Полностью поддерживаю мнение автора.

Я помню делал так - очень мудрёная функция проверки серийника (разворачивал её в математическом пакете), но проверял серийник не полностью, а только частично, потом делал дополнительные случайные проверки.

Пускать по ложной ветке и пакостить тоже очень хорошая идея, но крупные фирмы сейчас таким не увлекаются, потому что убытков от плохих отзывов (negative PR) окажется больше.

Защиту от генератора серийника сделать довольно просто с помощью публичных/приватных ключей (типа RSA или nacl.cr.yp.to). От кряка же, как мне кажется, почти нереально, разве что вот такими бесконечными рандомными трюками с ложными ветками, чтоб задолбались выискивать всевозможные места.
ManHunter (22.01.2022 в 14:17):
Итого. Нашел свободное время, потестил под разными системами. Трюк с обнаружением работает ТОЛЬКО на Vista и Win7 обеих разрядностей. Предположение с TEB64 подтвердилось, добавил пример с запуском x86 приложения под x64 системой. Архив обновлен. Всем огромное спасибо за тестирование.
morgot (22.01.2022 в 00:17):
Странно, у меня ничего не детектит - ни олли, ни х64дбг
тестил на десятке и ХР. Потом посмотрю еще подробнее.
Nemo (20.01.2022 в 10:01):
Win 8.1x64 x64dbg & OllyDbg = Normal start
ManHunter (18.01.2022 в 21:56):
dElk, это для 64-битных приложений. Насколько я помню, при запуске 32-битных приложений на x64 создается два варианта TEB. Надо будет проверить этот случай.
dElk (18.01.2022 в 20:24):
На win x64 указатель на PEB в GS:[0x60]
ManHunter (18.01.2022 в 16:43):
Хуже, если бы давало ложные положительные срабатывания. Это тоже к вопросу о мелких пакостях.
dElk (18.01.2022 в 14:24):
win 7x64 странно, но оба мимо.
olly 1.1
CMP WORD PTR DS:[EAX+ECX],0 ; [EAX+ECX] 7EFDDC00  00 00 00 00 
JE SHORT 00402034     ; Jump is taken
;...
PUSH teb.00401014     ; |Text = "Normal start"
;
olly 2.0
CMP WORD PTR DS:[ECX+EAX],0 ; EFDDC00  00 00 00 00| 
JE SHORT 00402034     ; Jump is taken
;...
PUSH OFFSET 00401014  ; ASCII "Normal start"
User (18.01.2022 в 12:11):
без проблем ) это к вопросу о "надо просто начинать мелко пакостить" и почему коммерческие проты так не поступают )
ManHunter (18.01.2022 в 11:55):
11-й винды под рукой нет, проверить не могу. Но за тестирование спасибо, буду иметь в виду, по возможности обязательно проверю.
dElk (18.01.2022 в 11:49):
win 7, olly 1/2
7FFDFC00  ntdll.dll Debugger detected!
User (18.01.2022 в 09:26):
win11, olly v1/v2, x64dbg - Normal start

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2022
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0042 сек.) / Память: 4.75 Mb
Наверх