能力值:
( LV12,RANK:1010 )
2 楼
这也太...
ssdt hook还需要引擎啊??? 就是替换一个表.....
能力值:
( LV4,RANK:50 )
3 楼
本来就是写着方便自己学习的 大米见笑了。。。
其实就是一个HOOK接口 方便自己调用 呵呵
SSDT的是简单了点 Inline就复杂一点了 类型多种多样
能力值:
( LV9,RANK:850 )
4 楼
ssdt hook lib
能力值:
( LV12,RANK:420 )
5 楼
ssdt hook怎么不需要引擎了?
需要考虑到多个模块HOOK,即钩即用,随时卸载,方便管理,一个引擎是不可避免的
但其实“HOOK”不是关键,怎么做好分发、管理、稳定和灵活,才是关键
HOOK这件事本身是不需要一个引擎的,也不能用一个引擎来框起来
看看微软在VISTA ,WIN7内核里新引入的CALLBACK等等,就明白了
能力值:
( LV2,RANK:10 )
6 楼
这个完全同意,一个好的hook引擎主要是处理hook chain的dispatch,还有针对不同参数的的hookee的处理,还要随时能够安全的append to chain, pop out of chain,during call。
能力值:
( LV2,RANK:10 )
7 楼
有点意思,但代码中有一个低级错误。
能力值:
( LV4,RANK:50 )
8 楼
ssdt hook怎么不需要引擎了? 需要考虑到多个模块HOOK,即钩即用,随时卸载,方便管理,一个引擎是不可避免的 但其实“HOOK”不是关键,怎么做好分发、管理、稳定和灵活,才是关键 HOOK这件事本身是不需要一个引擎的,也不能用一个引擎来框起来 看看微软在VISTA ,WIN7内核里新引入的CALLBACK等等,就明白了
这个完全同意,一个好的hook引擎主要是处理hook chain的dispatch,还有针对不同参数的的hookee的处理,还要随时能够安全的append to chain, pop out of chain,during call。
感谢指点 学习之。。。
有点意思,但代码中有一个低级错误。
请问哪里出现了错误,希望网上勇士能提出来 谢谢了
能力值:
( LV2,RANK:10 )
9 楼
终于见到stone“胸”在看雪的ID了,还是精华贴!
能力值:
( LV2,RANK:10 )
10 楼
感觉自己是用不上了
能力值:
( LV2,RANK:10 )
11 楼
7楼说的是这个?ObReferenceObjectByHandle
If the call succeeds, a pointer to the object body is returned to the caller and the pointer reference count is incremented. Incrementing this count prevents the object from being deleted while the pointer is being referenced. The caller must decrement the reference count with ObDereferenceObject as soon as it is done with the object.
能力值:
( LV12,RANK:420 )
12 楼
粗看一下,问题至少有三处
(1).(ULONG)ClientId->UniqueProcess;
未经检查就使用了ClientId,发送0x00000001或者0x80000000等地址系统即BSOD
(2).NTSTATUS ret = ObReferenceObjectByHandle(FileHandle,
GENERIC_READ,
*IoFileObjectType,
KernelMode,
(PVOID*)&pFileObject,
0); 完成后未降低引用计数
(3). return OldNtOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
return OldZwSetInformationFile( FileHandle, IoStatusBlock, FileInformation,
Length, FileInformationClass);
直接运行了函数开始时取到的地址,如果你的处理过程中发生了线程切换,当前SSDT表中的其他hook卸载了他们钩子,就会BSOD
能力值:
( LV4,RANK:50 )
13 楼
感谢qihoocom和halfsoul的指点!
第一点还不是很明白,对ClientID不是做了判空检查了吗?还需要什么其他的检查吗?我看WRK的源码也只是用ARGUMENT_PRESENT做了下判空检查而已。。。不懂
第二点的确是个低级错误,现已修正。这两段代码都是我从网上拷过来的,做了点小的修改,对引擎做个测试用的。测试通过了也就没有注意这么多了。。
第三点倒没有想到,的确会出现严重的问题。我是在干净的虚拟机系统做的实验,所以没有出现什么问题。我目前想到的解决方法是,在InitSerices()中检查SSDT,对于已挂钩的表项不做处理,HookService的时候直接返回错误,不对这些做HOOK。这种方法应该比较安全。不知道有没有更好的方法?
能力值:
( LV2,RANK:10 )
14 楼
2G的前64K和最后64K永远不会分配,对他们的访问是会挂球的
能力值:
( LV12,RANK:420 )
15 楼
1.可能传一个无效BUFFER,例如0x00000001
3.可以在调用之前再做检查,或者在调用前检查下,减少几率,但100%保证安全是不可能的
因为世界上还有微点和瑞星的驱动程序员这么挫的人
能力值:
( LV2,RANK:10 )
16 楼
第1个,要防止恶意传错误地址。先判断PreviousMode,是UserMode就ProbeForRead,如果是KernelMode就MmIsAddressValid。
第3个,要绝对安全,很麻烦。简单点的做法是在你调用原函数之前检查当前SSDT项,如果不是你hook函数地址就不调用,直接返回;或者再次hook,更新原函数地址。
能力值:
( LV12,RANK:420 )
17 楼
第一,kernel mode不用管的
第三,楼上的理解有错误,应该是判断你保留的原始地址是否正确,如果不正确,从当前SSDT里取
能力值:
( LV2,RANK:10 )
18 楼
的确有误了,不好意思,这样在有新的module处理的时候会有问题。不过"判断你保留的原始地址是否正确"也不保险,他unhook并不表示会unload。
所以,最保险的就是你自己hook之前先恢复所有的hook,或者直接查ntoskrnl.exe文件里面的地址,保证你取到的原始地址是NtXxx函数地址。
能力值:
( LV2,RANK:10 )
19 楼
ULONG OldServiceAddressTable[1024];
你认为应该放在头文件里,还是源文件里。
能力值:
( LV4,RANK:50 )
20 楼
[QUOTE=网上勇士;555011]ULONG OldServiceAddressTable[1024];
你认为应该放在头文件里,还是源文件里。[/QUOTE]
这个应该没问题吧
只是一个数组而已嘛 用来保存原SSDT的
ssdt_hook_function.c 和 hook_sample.c都会用到这个数组的
能力值:
( LV4,RANK:50 )
21 楼
奇怪。。。
添加了对ClientId的检测代码后
PreMode = KeGetPreviousMode();
if(PreMode != KernelMode)
{
__try
{
ProbeForRead(ClientId, sizeof(CLIENT_ID), sizeof(ULONG));
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return GetExceptionCode();
}
}
出现编译错误:error C4013: 'KeGetPreviousMode' undefined; assuming extern returning int
KeGetPreviousMode明明就在ntddk.h中定义了嘛
能力值:
( LV12,RANK:420 )
22 楼
用ExGetPreviousMode
能力值:
( LV12,RANK:420 )
23 楼
恢复HOOK和调用原始函数,可能导致一些安全软件出问题,如卡巴
一些垃圾驱动,例如NP之类,则可能BSOD
能力值:
( LV4,RANK:50 )
24 楼
用ExGetPreviousMode
恩 已作修改。感谢~~!
恢复HOOK和调用原始函数,可能导致一些安全软件出问题,如卡巴 一些垃圾驱动,例如NP之类,则可能BSOD
最好的方法就是对于已HOOK的表项就不HOOK了。。。
暂时就这样实现了
能力值:
( LV12,RANK:420 )
25 楼
不HOOK了很多功能无法实现~
碰上SSM那种所有函数都HOOK的你就废了~