syscall
找出应该具有的功能。 我想在这一点上我也可以尝试取消钩子,但我还没有尝试过。
我使用
ZwQuerySystemInformation
来获取模块列表,并且我始终认为第一个模块是内核。 这种方法有多安全?是否有可能内核模块不是第一个?我可以按名称搜索,但是并不总是一样,因此我尝试避免这种情况。我可以搜索内核模块可能具有的名称之一。
我还需要该列表,以查看从哪个模块中获取钩子。如果它被钩住了,它可以向我隐藏信息。
关于内联钩子,现在我遍历内核模块的所有导出,并检查每个函数的代码以查看其是否以相对跳转或推入偏移量&退出开始。我是否还应该检查跳转/返回到的地址是否在内核模块之外或是否多余?
如果我不检查跳转地址,我会误以为
ZwQuerySystemInformation
会在内核模块内跳转。 /> jmp nt!KeIpiGenericCall+0x132
int 3
似乎还可以。
我知道这并不完美(有人可以将钩子放在函数代码中的任何位置,或者可以在内核模块中找到放置其函数的位置,依此类推),但是我只是
此外,我知道在x64上实现该方法并不是那么简单,但是目前我正在尝试x86。
“我应该如何处理”问题比“我应该如何编码”问题更多。
#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上找到该项目
评论
看到这个和这个无论它是否在内核模块之外,都只会捕获最简单的钩子方法。像每个加载到内存中的PE文件一样,NT内核也会有“间隙”。基本上,节的其余部分不超过其逻辑大小,甚至只是当函数与必要的NOP对齐时。可以将这些间隙用于存储蹦床,并且您的检测代码甚至不会考虑它们的钩子。