这个也是使用Windows的一个未公开函数的方法,你可以在当前线程里调用NtSetInformationThread,调用这个函数时,如果在第二个参数里指定0x11这个值(意思是ThreadHideFromDebugger),等于告诉操作系统,将所有附加的调试器统统取消掉。示例代码:1 J" g8 F, u# \3 A
3 b2 h) Z4 P" ]) m- E" R
// 声明一个函数指针。
typedef NTSTATUS (*NtSetInformationThreadPtr)(HANDLE threadHandle,2 q7 n ?% d. U5 S
THREADINFOCLASS threadInformationClass,
PVOID threadInformation,9 K) ]# i# c7 |2 }4 @
ULONG threadInformationLength);6 F* o' |: S: {/ d5 f
" {; s4 Q1 q" x: _) \( C! q$ v
void NtSetInformationThreadApproach()1 x8 s( E- n0 q# }
{
HMODULE hModule = LoadLibrary(TEXT("ntdll.dll"));
NtSetInformationThreadPtr NtSetInformationThread = (NtSetInformationThreadPtr)GetProcAddress(hModule, "NtSetInformationThread");5 b$ k4 e7 o, Z0 }
NtSetInformationThread(GetCurrentThread(), (THREADINFOCLASS)0x11, 0, 0);: v; o' h2 p' W/ q) q% g* Z V7 s
}
- u& ~) T9 o6 T q$ s* e+ Y
( f3 V( |! s$ ~8 y0 R9 U
6 u/ F" t( ~( e! S5 m" f
七、触发异常的方法2 b' V& l& z# j" m
: \* L/ a( M) g
这个技术的原理是,首先,进程使用SetUnhandledExceptionFilter函数注册一个未处理异常处理函数A,如果进程没有被调试的话,那么触发一个未处理异常,会导致操作系统将控制权交给先前注册的函数A;而如果进程被调试的话,那么这个未处理异常会被调试器捕捉,这样我们的函数A就没有机会运行了。
8 c8 L# _+ a! _+ ?% v
# y% j* t5 a: P- B0 ]# I$ N% y, k
这里有一个技巧,就是触发未处理异常的时候,如果跳转回原来代码继续执行,而不是让操作系统关闭进程。方案是在函数A里修改eip的值,因为在函数A的参数_EXCEPTION_POINTERS里,会保存当时触发异常的指令地址,所以在函数A里根据这个指令地址修改寄存器eip的值就可以了,示例代码如下:/ |$ r: ]% X5 O
" z6 t# \6 s2 o3 E* M; k
) H# x9 U/ t$ w5 H2 `
// 进程要注册的未处理异常处理程序A/ {1 m! t/ S r( A b2 o7 z
LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *pei)$ M. a( ~0 s# M! d7 m
{' B/ V" Q: D5 J) r7 G8 [5 K1 ?
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)
pei->ContextRecord->Eax);
// 修改寄存器eip的值
pei->ContextRecord->Eip += 2;5 Y7 B9 A {5 N- D1 B. \
// 告诉操作系统,继续执行进程剩余的指令(指令保存在eip里),而不是关闭进程+ \4 i- I( [/ F9 z% H1 `0 e/ n
return EXCEPTION_CONTINUE_EXECUTION;7 [9 s6 K. R4 x7 i6 M x3 o
}
bool UnhandledExceptionFilterApproach()
{5 h% s9 O! v8 }- Q
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
__asm
{. j2 P# |9 H( b
// 将eax清零
xor eax, eax
// 触发一个除零异常
div eax9 q8 l3 f* v0 c4 Q
}6 Q5 N7 g- J8 D2 h( z9 F y1 u
0 _2 j* U% D9 n" M
return false;6 w7 ]! y1 r* p( r
} \/ z* ?( k" W
八、调用DeleteFiber函数* o9 g' y6 r; y" o
- h, g$ t3 F4 v