ProcessHider 利用分析
0x00 前言
ProcessHider 能够在任务管理器和 Process Explorer 之类的监视工具中隐藏指定进程,本文将要介绍实现原理,分析代码细节。
0x01 简介
本文将要介绍以下内容:
- ProcessHider 测试
- ProcessHider 的实现原理
- ProcessHider 的代码分析
- ProcessHider 的检测
0x01 简介
ProcessHider 能够在任务管理器和 Process Explorer 之类的监视工具中隐藏指定进程
地址如下:https://github.com/M00nRise/ProcessHider
支持以下参数:
- pid
- 进程名
两种启动形式:
- exe
- powershell
ProcessHider 能够自动识别操作系统版本和进程位数,向 32 位和 64 位进程分别注入 Payload.dll,通过 Hook API NtQuerySystemInformation() 实现进程隐藏
注入的代码使用 Dll 反射,地址如下:https://github.com/stephenfewer/ReflectiveDLLInjection
Hook 的代码使用 NtHookEngine,地址如下:https://www.codeproject.com/Articles/21414/Powerful-x86-x64-Mini-Hook-Engine
参数实例:
ProcessHider.exe -n "putty.exe" -x "procexp.exe"
能够在 procexp.exe 中隐藏进程名 putty.exe,并且默认针对以下进程进行隐藏:
- Taskmgr.exe
- powershell.exe
- procexp.exe
- procexp64.exe
- perfmon.exe
注:
目前不支持对 tasklist.exe 的进程隐藏
编译时需要注意的问题:
工程 ProcessHider 需要编译成 32 位,不能编译成 64 位
这是因为工程 ProcessHider 包含了针对 64 位进程的识别和利用代码
0x02 ProcessHider 的实现原理
工程 ProcessHider 实现流程如下:
1.判断当前操作系统版本
对应代码 isSystem64BitWow()
如果是 32 位系统:
(1) 监控进程列表
对应代码 LaunchDaemon(InjectAll);
(2) 向符合条件的进程注入 Payload.dll
对应代码 reactToProcess((DWORD) pCurrent->ProcessId, pCurrent->ImageName.Buffer);
注入的代码使用了 ReflectiveDLLInjection 中的代码
如果是 64 位系统:
(1) 同级目录下释放文件 x64Hider.exe,用作 64 位的守护进程
对应代码 CopyResourceIntoFile(x64filesList[i], MAKEINTRESOURCE(x64resourceIDint[i])
(2) 解析命令行参数
对应代码 createCommandLine(argc, argv, buffer, MAX_COMMANDLINE_LEN);
(3) 启动 64 位的守护进程 x64Hider.exe
对应代码 CreateProcessFromLine(buffer,false);
传入启动的参数
示例如下:
"c:\test\x64Hider.exe" "-n" "putty.exe" "-x" "cmd.exe"
(4) 将 Payload.dll 写入 x64Hider.exe 的进程空间
这个过程不向硬盘写入文件,增加隐蔽性
对应代码 WriteDLLsToProcess(pi)
x64Hider.exe 的功能如下:
- 监控 64 位的进程列表
- 向符合条件的 64 位进程注入 64 位的 Payload.dll
(5) 监控 32 位的进程列表
对应代码 LaunchDaemon(InjectAll);
(6) 向符合条件的 32 位进程注入 32 位的 Payload.dll
对应代码 reactToProcess((DWORD) pCurrent->ProcessId, pCurrent->ImageName.Buffer);
Payload.dll 分别对应工程 x64Payload 和 x86Payload
这是基于 ReflectiveDLLInjection 实现的 dll 反射
优点是注入成功后在进程空间不存在 dll 的名称
流程如下:
1.创建互斥量
对应代码 hMutex = CreateMutex(0, TRUE, NULL);
2.读取参数
如果参数为空,从固定文件 "C:\Program Files\Internet Explorer\mdsint.isf"
读取参数
3.Hook API NtQuerySystemInformation()
隐藏进程的代码:
NTSTATUS WINAPI HookedNtQuerySystemInformation(
__in SYSTEM_INFORMATION_CLASS SystemInformationClass,
__inout PVOID SystemInformation,
__in ULONG SystemInformationLength,
__out_opt PULONG ReturnLength
)
{
NTSTATUS status = RealNTQueryFunc(SystemInformationClass,
SystemInformation,
SystemInformationLength,
ReturnLength);
if (SystemProcessInformation == SystemInformationClass && NT_SUCCESS(status))
{
//
// Loop through the list of processes
//
PSYSTEM_PROCESS_INFO pCurrent = NULL;
PSYSTEM_PROCESS_INFO pNext = (PSYSTEM_PROCESS_INFO)SystemInformation;
do
{
pCurrent = pNext;
pNext = (PSYSTEM_PROCESS_INFO)((PUCHAR)pCurrent + pCurrent->NextEntryOffset);
if (isHiddenProcess((int)pNext->ProcessId,pNext->ImageName.Buffer))
{
if (0 == pNext->NextEntryOffset)
{
pCurrent->NextEntryOffset = 0;
}
else
{
pCurrent->NextEntryOffset += pNext->NextEntryOffset;
}
pNext = pCurrent;
}
} while (pCurrent->NextEntryOffset != 0);
}
return status;
}
这段代码同 SubTee 之前开源的代码 AppInitGlobalHooks-Mimikatz 基本相同
我在之前的文章 《利用 globalAPIhooks 在 Win7 系统下隐藏进程》 有过介绍
SubTee 的 Github 目前无法访问,但我当时 fork 了他的代码,地址如下:https://github.com/3gstudent/AppInitGlobalHooks-Mimikatz/blob/master/AppInitHook/main.cpp
所以说,我们使用之前的代码也能实现相同的功能
1.编译 dll
使用代码:https://github.com/3gstudent/AppInitGlobalHooks-Mimikatz/
编译生成 dll
2.注入 dll
这里可以使用我之前写的 dll 注入的代码,地址如下:https://github.com/3gstudent/Homework-of-C-Language/blob/master/NtCreateThreadEx%20%2B%20LdrLoadDll.cpp
但是需要把 FreeDll()
的功能去掉
综上,ProcessHider 的实现原理如下:
通过 Dll 注入来 Hook API NtQuerySystemInformation(),实现进程隐藏
0x03 ProcessHider 的检测
在检测上主要识别以下行为:
- Dll 注入
- Hook API NtQuerySystemInformation()
0x04 小结
本文介绍了 ProcessHider 的实现原理和代码细节,分析利用思路,给出检测建议。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 渗透技巧——导出 Firefox 浏览器中保存的密码
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论