用户层的进程隐藏
用户层的进程隐藏
利用 MiniHook 框架对 ZwQuerySystemInformation 进行 InlineHook,实现进程隐藏
github 地址:SomaFon/ProcessHider
总体思路
1.利用 GetModuleHandle 获得 ntdll.dll 地址
2.调用 GetProcAddress 获得 ZwQuerySystemInformation 地址
3.对 ZwQuerySystemInformation 进行 Hook
4.FakeZwQuerySystemInformation 的实现
1)根据目标进程名获得进程 ID
2)跳回内存槽执行原函数
status = __OriginalZwQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
3)对原函数进行后过滤
①判断是否是查询进程信息SystemProcessInformation
②循环进程信息结构体链表,判断目标进程ID是否存在,如果存在,断链实现隐藏
4)返回
相比普通Hook,使用MiniHook有什么优势
1.不用考虑 Hook 重入问题(普通做法在 fake 函数里还需进行 unhook,再执行原函数,最后再执行 hook)
2.minihook 的常见优势
缺点
1.使用minihook框架,生成的dll太大,容易暴露
注意点
1.minihook使用时要进行初始化
2.ZwQuerySystemInformation的测试
3.minihook传参记得注意不要加&
4.def文件不能添加现有,需要重新创建,不然导出函数名字会乱
5.Fake函数调试方法:
1)调试被注入的dll
2)在minihook项目内写测试程序(调用原函数枚举进程的程序)
改进点
1.使用minihook框架
2.通过进程名获得进程ID比硬写进程ID方便
测试
全局钩子注入DLL方式,演示程序DLL注入到任务管理器当中。在注入前,打开任务管理器,查看到520.exe处于可见状态。运行注入程序之后,任务管理器中的520.exe进程消失,这表明进程隐藏成功
注入前
注入后