我做了一个简单的SSDT Hooks检测器,该检测器遍历所有条目并检查是否有任何地址在内核模块之外。如果是这样,我什至可以返回并使用syscall找出应该具有的功能。
我想在这一点上我也可以尝试取消钩子,但我还没有尝试过。

我使用ZwQuerySystemInformation来获取模块列表,并且我始终认为第一个模块是内核。
这种方法有多安全?是否有可能内核模块不是第一个?我可以按名称搜索,但是并不总是一样,因此我尝试避免这种情况。我可以搜索内核模块可能具有的名称之一。
我还需要该列表,以查看从哪个模块中获取钩子。如果它被钩住了,它可以向我隐藏信息。

关于内联钩子,现在我遍历内核模块的所有导出,并检查每个函数的代码以查看其是否以相对跳转或推入偏移量&退出开始。我是否还应该检查跳转/返回到的地址是否在内核模块之外或是否多余?
如果我不检查跳转地址,我会误以为ZwQuerySystemInformation会在内核模块内跳转。 />
jmp nt!KeIpiGenericCall+0x132
int 3


似乎还可以。

我知道这并不完美(有人可以将钩子放在函数代码中的任何位置,或者可以在内核模块中找到放置其函数的位置,依此类推),但是我只是

此外,我知道在x64上实现该方法并不是那么简单,但是目前我正在尝试x86。

“我应该如何处理”问题比“我应该如何编码”问题更多。

评论

看到这个和这个

无论它是否在内核模块之外,都只会捕获最简单的钩子方法。像每个加载到内存中的PE文件一样,NT内核也会有“间隙”。基本上,节的其余部分不超过其逻辑大小,甚至只是当函数与必要的NOP对齐时。可以将这些间隙用于存储蹦床,并且您的检测代码甚至不会考虑它们的钩子。

#1 楼

如果您正在寻找与WinDbg绑定的SSDT,请尝试SwishDbgExt.dll吗?

这是作者页面的链接-http://www.msuiche.net/2014/07/16/thats -so-swish

更新:http://www.msuiche.net/2014/08/19/swishdbgext-update-0-6-20140817/

编辑( 2020年7月1日):您可以在GitHub上找到该项目