Использование TEB для антиотладки
Использование TEB для антиотладки
Структура TEB (Thread Environment Block), как и PEB (Process Environment Block), при грамотном использовании позволяет получить огромное количество полезной информации. Сегодня расскажу еще об одном малоизвестном антиотладочном трюке. Он основан на том, что при нормальном запуске приложения в поле StaticUnicodeBuffer структуры TEB не содержится ничего, а при запуске под отладчиком там обязательно оказывается название той или иной динамической библиотеки, используемой приложением.
Единственный минус в том, что этот способ работает только на Windows Vista и Windows 7. По результатам тестирования выявлено, что на более старых и более новых системах это не срабатывает. Увы.
Code (Assembler) : Убрать нумерацию
- mov ecx,30h
- ; Указатель на РЕВ
- mov eax,[fs:ecx]
- ; PEB->OSMajorVersion
- cmp dword [eax+ecx+0074h],6
- ; Трюк работает только на Vista и Win7
- jne loc_normal
- ; ECX=18h
- shr ecx,1
- ; Указатель на TEB
- mov eax,[fs:ecx]
- ; ECX=0C00h
- shl ecx,7
- ; TEB->StaticUnicodeBuffer
- cmp word [eax+ecx],0
- ; Строка пустая?
- je loc_normal
- loc_debug:
- ; Обнаружен отладчик
- ...
- ...
- loc_normal:
- ; Нормальный запуск
- ...
- ...
Code (Assembler) : Убрать нумерацию
- ; Указатель на РЕВ
- mov eax,[fs:30h]
- ; PEB->OSMajorVersion
- cmp dword [eax+00A4h],6
- ; Трюк работает только на Vista и Win7
- jne loc_normal
- ; Указатель на TEB
- mov eax,[fs:18h]
- ; TEB->StaticUnicodeBuffer
- cmp word [eax+0C00h],0
- ; Строка пустая?
- je loc_normal
- loc_debug:
- ; Обнаружен отладчик
- ...
- ...
- loc_normal:
- ; Нормальный запуск
- ...
- ...
Code (Assembler) : Убрать нумерацию
- ; Указатель на РЕВ
- mov eax,[fs:30h]
- ; PEB->OSMajorVersion
- cmp dword [eax+00A4h],6
- ; Трюк работает только на Vista и Win7
- jne loc_normal
- ; Указатель на TEB32
- mov eax,[fs:18h]
- ; Указатель на TEB64 есть?
- mov ebx,[eax+0F70h]
- or ebx,ebx
- jnz loc_x64
- loc_x86:
- ; TEB32->StaticUnicodeBuffer
- cmp word [eax+0C00h],0
- ; Строка пустая?
- je loc_normal
- jmp loc_debug
- loc_x64:
- ; TEB64->StaticUnicodeBuffer
- cmp word [ebx+1268h],0
- ; Строка пустая?
- je loc_normal
- loc_debug:
- ; Обнаружен отладчик
- ...
- ...
- loc_normal:
- ; Нормальный запуск
- ...
- ...
В приложении пример программы с исходным текстом, которая определяет запуск себя под отладчиком с использованием этого метода.
Просмотров: 1361 | Комментариев: 14
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
brute
(27.01.2022 в 13:24):
Кодер, имхо, такая защита - прошлый век. Сейчас покупается 1 экземляр лицензии и распространяется бесконечно (обрубив функции проверки по сети) или делается портабельная версия. Для особо дорогого софта можно и образ виртуалки распространять с установленным софтом. А я предпочитаю использовать старые проги до 2015г, пока их хватает)
кодер
(25.01.2022 в 16:41):
"Опять же, не надо сразу оповещать исследователя о том, что мы знаем о его присутствии, надо просто начинать мелко пакостить. Например, как я уже говорил, можно вносить ошибочные данные в результаты расчетов, или пускать алгоритм по заведомо неправильной ветке, или имитировать ошибку и завершать работу, или генерировать миллионы разных исключений, или сыпать всякий хлам"
Полностью поддерживаю мнение автора.
Я помню делал так - очень мудрёная функция проверки серийника (разворачивал её в математическом пакете), но проверял серийник не полностью, а только частично, потом делал дополнительные случайные проверки.
Пускать по ложной ветке и пакостить тоже очень хорошая идея, но крупные фирмы сейчас таким не увлекаются, потому что убытков от плохих отзывов (negative PR) окажется больше.
Защиту от генератора серийника сделать довольно просто с помощью публичных/приватных ключей (типа RSA или nacl.cr.yp.to). От кряка же, как мне кажется, почти нереально, разве что вот такими бесконечными рандомными трюками с ложными ветками, чтоб задолбались выискивать всевозможные места.
Полностью поддерживаю мнение автора.
Я помню делал так - очень мудрёная функция проверки серийника (разворачивал её в математическом пакете), но проверял серийник не полностью, а только частично, потом делал дополнительные случайные проверки.
Пускать по ложной ветке и пакостить тоже очень хорошая идея, но крупные фирмы сейчас таким не увлекаются, потому что убытков от плохих отзывов (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"
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!
7FFDFC00 ntdll.dll Debugger detected!
User
(18.01.2022 в 09:26):
win11, olly v1/v2, x64dbg - Normal start
Добавить комментарий
Заполните форму для добавления комментария
+100500