Недавно я провел некоторое исследование регистров отладки и того, как некоторые вредоносные программы могут манипулировать ими в качестве тактики против отладки. Одна из вещей, которые я прочитал несколько раз, заключается в том, что это можно предотвратить, используя флаг General Detect в DR7, который вызывает исключение отладки, если инструкция MOV используется для доступа к любому из DR0-DR7.
Однако мне не ясно, что именно означает доступ - если, например, инструкция mov используется только для помещения адреса DR0-DR3 в регистр общего назначения, чтобы его можно было прочитать, вызовет ли это отладку? исключение, которое будет вызвано, когда установлен флаг GD? Или это происходит только в том случае, если инструкция MOV используется для фактического изменения содержимого регистра? То, что я читал до сих пор, было немного двусмысленным по этому поводу.
Я столкнулся с приведенной ниже сборкой в тексте, который показывает манипулирование регистрами отладки, но в этом случае mov используется только для получения адреса регистров отладки, а фактическая модификация выполняется с помощью инструкции или, поэтому я не уверен, что это код вызовет исключение, если установлен GD.
xor eax, eax
push offset except_callback
push d fs:[eax]
mov fs:[eax], esp
int 3 ;force an exception to occur
...
except_callback:
mov eax, [esp+0ch] ;get ContextRecord
mov ecx, [eax+4] ;Dr0
or ecx, [eax+8] ;Dr1
or ecx, [eax+0ch] ;Dr2
or ecx, [eax+10h] ;Dr3
jne <Debugger_detected>
mov XXX, drX
(xxx = регистр, x = число) имеют прямой доступ к ним. - person ecm   schedule 14.12.2020