ProcessHider 利用分析

发布于 2025-01-10 00:18:45 字数 6127 浏览 0 评论 0

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 的功能如下:

  1. 监控 64 位的进程列表
  2. 向符合条件的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

双马尾

暂无简介

文章
评论
23 人气
更多

推荐作者

寻梦旅人

文章 0 评论 0

冰美式不加糖

文章 0 评论 0

m0_51416705

文章 0 评论 0

123456wqwqwq

文章 0 评论 0

qq_R47skh

文章 0 评论 0

hs1283

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文