关于清除线程创建监视例程这个问题,我以前在水木清华问过了。
那时候2k源代码好像还没被hack出来,但高手就是高手啊,看看这个回答:
文章出处:水木清华
发信人: soycola (酱油可乐), 信区: MSDN
标 题: Re: 关于PsSetCreateThreadNotifyRoutine的问题
发信站: BBS 水木清华站 (Mon Nov 24 22:53:32 2003), 转信
这个确实比较搞怪,下面这个也许行,针对2000的,
原理:PsSetCreateThreadNotifyRoutine返回的时候
edx=ecx*4 + PspCreateThreadNotifyRoutine,你
分析一下ntoskrnl就知道了。
/*
demo code of PsRemoveThreadNotifyProc()
by Soycola@smth.org
*/
DWORD install_hook(PROC p)
{
DWORD cookie;
__asm{
push p
call PsSetCreateThreadNotifyRoutine
or eax, eax
jnz __failed
lea eax, [edx-ecx*4]
mov cookie, eax
jmp __next
__failed:
xor eax, eax
mov cookie, eax
__next:
}
return cookie;
}
BOOL remove_hook(DWORD cookie, PROC pp)
{
int i;
PROC * p;
BOOL r = FALSE;
KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
for(i=0, p=(PROC*)cookie; i<8; i++, p++){
if(*p == pp){
*p = 0;
r = TRUE;
break;
}
}
KeLowerIrql(oldIrql);
return r;
}
int main()
{
DWORD cookie;
cookie = install_hook(p);
// do some-thing
// ....
remove_hook(cookie, p);
return 0;
}
【 在 zzzevazzz (初号机,暴走!) 的大作中提到: 】
: 如何取消PsSetCreateThreadNotifyRoutine()注册的回调函数?
: 对于PsSetCreateProcessNotifyRoutine(
: IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
: IN BOOLEAN Remove
: );
: 但PsSetCreateThreadNotifyRoutine(
: IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
: );
: 只有一个参数。
: 怎么取消?
: ...................
那时候2k源代码好像还没被hack出来,但高手就是高手啊,看看这个回答:
文章出处:水木清华
发信人: soycola (酱油可乐), 信区: MSDN
标 题: Re: 关于PsSetCreateThreadNotifyRoutine的问题
发信站: BBS 水木清华站 (Mon Nov 24 22:53:32 2003), 转信
这个确实比较搞怪,下面这个也许行,针对2000的,
原理:PsSetCreateThreadNotifyRoutine返回的时候
edx=ecx*4 + PspCreateThreadNotifyRoutine,你
分析一下ntoskrnl就知道了。
/*
demo code of PsRemoveThreadNotifyProc()
by Soycola@smth.org
*/
DWORD install_hook(PROC p)
{
DWORD cookie;
__asm{
push p
call PsSetCreateThreadNotifyRoutine
or eax, eax
jnz __failed
lea eax, [edx-ecx*4]
mov cookie, eax
jmp __next
__failed:
xor eax, eax
mov cookie, eax
__next:
}
return cookie;
}
BOOL remove_hook(DWORD cookie, PROC pp)
{
int i;
PROC * p;
BOOL r = FALSE;
KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
for(i=0, p=(PROC*)cookie; i<8; i++, p++){
if(*p == pp){
*p = 0;
r = TRUE;
break;
}
}
KeLowerIrql(oldIrql);
return r;
}
int main()
{
DWORD cookie;
cookie = install_hook(p);
// do some-thing
// ....
remove_hook(cookie, p);
return 0;
}
【 在 zzzevazzz (初号机,暴走!) 的大作中提到: 】
: 如何取消PsSetCreateThreadNotifyRoutine()注册的回调函数?
: 对于PsSetCreateProcessNotifyRoutine(
: IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
: IN BOOLEAN Remove
: );
: 但PsSetCreateThreadNotifyRoutine(
: IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
: );
: 只有一个参数。
: 怎么取消?
: ...................