C++ 修改指定进程 PEB 中路径和命令行信息实现进程伪装

背景

所谓的进程伪装,指的修改任意一个指定进程的信息,是它的信息在系统中的显示是另一个进程的信息,这样看来,指定的进程就像是被伪装的进程一样,因为进程信息相同,但实际上,它还是原来的进程,做着原来的进程操作。

函数介绍

NtQueryInformationProcess

    NTSTATUS WINAPI NtQueryInformationProcess(
        _In_      HANDLE           ProcessHandle,				// 要获取信息的进程的句柄。
        _In_      PROCESSINFOCLASS ProcessInformationClass,		// 要获取的进程信息的类型
        _Out_     PVOID            ProcessInformation,			// 指向由调用应用程序提供的缓冲区的指针
        _In_      ULONG            ProcessInformationLength,	// 指向的缓冲区的大小
        _Out_opt_ PULONG           ReturnLength					// 返回所请求信息的大小
    );

实现原理

进程伪装的原理不是很复杂,就是修改指定进程的进程环境块 PEB 中的进程路径以及命令行信息,即可达到进程伪装的效果。

具体实现原理分析如下:

  • 首先,我们根据进程的 PID 号打开指定进程,并获取进程的句柄。
  • 然后,我们要从 ntdll.dll 中获取 NtQueryInformationProcess 函数的导出地址,因为 NtQueryInformationProcess 函数没有关联导入库,所以只能动态获取,这个函数是这个程序功能实现的关键步骤。
  • 接着,使用 NtQueryInformationProcess 函数获取指定进程的进程基本信息 PROCESS_BASIC_INFORMATION,并从中获取指定进程的进程环境块 PEB。
  • 然后,我们就可以根据进程环境块中的 ProcessParameters,获取指定进程的 RTL_USER_PROCESS_PARAMETERS 信息,因为PEB的路径信息、命令行信息存储在这个结构体中。
  • 最后,我们开始对指定进程 PEB 中路径信息、命令行信息进行更改,实现进程伪装

编码实现

    // 修改指定进程的进程环境块PEB中的路径和命令行信息, 实现进程伪装
    BOOL DisguiseProcess(DWORD dwProcessId, wchar_t *lpwszPath, wchar_t *lpwszCmd)
    {
        // 打开进程获取句柄
        HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        if (NULL == hProcess)
        {
            ShowError("OpenProcess");
            return FALSE;
        }
        typedef_NtQueryInformationProcess NtQueryInformationProcess = NULL;
        PROCESS_BASIC_INFORMATION pbi = { 0 };
        PEB peb = { 0 };
        RTL_USER_PROCESS_PARAMETERS Param = { 0 };
        USHORT usCmdLen = 0;
        USHORT usPathLen = 0;
        // 需要通过 LoadLibrary、GetProcessAddress 从 ntdll.dll 中获取地址
        NtQueryInformationProcess = (typedef_NtQueryInformationProcess)::GetProcAddress(
            ::LoadLibrary("ntdll.dll"), "NtQueryInformationProcess");
        if (NULL == NtQueryInformationProcess)
        {
            ShowError("GetProcAddress");
            return FALSE;
        }
        // 获取指定进程的基本信息
        NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
        if (!NT_SUCCESS(status))
        {
            ShowError("NtQueryInformationProcess");
            return FALSE;
        }
        /*
              注意在读写其他进程的时候,注意要使用ReadProcessMemory/WriteProcessMemory进行操作,
            每个指针指向的内容都需要获取,因为指针只能指向本进程的地址空间,必须要读取到本进程空间。
            要不然一直提示位置访问错误!
        */
        // 获取指定进程进本信息结构中的PebBaseAddress
        ::ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL);
        // 获取指定进程环境块结构中的ProcessParameters, 注意指针指向的是指定进程空间中
        ::ReadProcessMemory(hProcess, peb.ProcessParameters, &Param, sizeof(Param), NULL);
        // 修改指定进程环境块PEB中命令行信息, 注意指针指向的是指定进程空间中
        usCmdLen = 2 + 2 * ::wcslen(lpwszCmd);
        ::WriteProcessMemory(hProcess, Param.CommandLine.Buffer, lpwszCmd, usCmdLen, NULL);
        ::WriteProcessMemory(hProcess, &Param.CommandLine.Length, &usCmdLen, sizeof(usCmdLen), NULL);
        // 修改指定进程环境块PEB中路径信息, 注意指针指向的是指定进程空间中
        usPathLen = 2 + 2 * ::wcslen(lpwszPath);
        ::WriteProcessMemory(hProcess, Param.ImagePathName.Buffer, lpwszPath, usPathLen, NULL);
        ::WriteProcessMemory(hProcess, &Param.ImagePathName.Length, &usPathLen, sizeof(usPathLen), NULL);
        return TRUE;
    }

程序测试

我们运行一个测试程序 Demon Memory.exe,先使用 Process Explorer 查看它的进程信息:在这里插入图片描述

现在,我们运行我们的进程伪装程序,修改上述的测试程序 Demon Memory.exe 进程的PEB进程环境块信息,实现进程伪装。程序执行提示成功,我们再运行 Process Explorer 程序查看进程信息,发现测试程序 Demon Memory.exe 进程信息成功伪装了 explorer.exe 资源管理器进程。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 如果PebProcess Environment Block)的路径修改后不起效,可能有以下几个原因: 1. 没有正确修改Peb路径字段:Peb包含了进程的重要信息,包括程序的路径修改Peb路径字段需要确保将新路径正确写入该字段,否则路径修改不会生效。可能是在修改路径时出现了错误或者忘记将新的路径写入Peb。 2. 没有重启进程Peb路径字段只有在进程启动时才会读取并应用,如果修改路径后没有重启该进程,新的路径不会生效。所以,需要确保在修改Peb路径后,重启该进程使得新路径生效。 3. 被其他因素覆盖:有些程序会通过保护机制或安全策略来防止路径被非法修改,这可能导致Peb路径字段被恢复到原始值,从而修改路径无效。如果程序具有类似的安全策略,可能需要进行额外的操作才能成功修改路径。 4. 编程错误或操作系统限制:在某些情况下,可能由于编程错误或操作系统限制导致修改Peb路径无效。例如,某些操作系统可能限制了修改系统关键信息的能力,从而阻止了路径修改。需要详细检查程序或操作系统文档,以确定是否存在这种限制。 综上所述,如果Peb修改路径后不起效,需要检查是否正确修改Peb路径字段、是否重启了进程、是否存在安全策略限制以及是否涉及编程错误或操作系统限制。根据具体的情况进行对应的调整和修复,以使路径修改生效。 ### 回答2: 当在PEB进程环境块)修改路径后却不起效时,可能有以下几个可能的原因和解决方法。 第一个可能的原因是修改路径并不是PEB指定路径PEB保存了进程的环境变量和路径信息,当我们通过修改PEB路径来改变程序的搜索路径时,需要确保修改路径PEB路径一致。可以通过读取PEB路径信息,确认是否正确修改了对应的路径。 第二个可能的原因是修改路径的时机不正确。PEB保存的是进程启动时的路径信息,所以如果在进程启动后再修改PEB路径修改是无效的。需要在进程启动之前或者重新启动进程来使修改路径生效。 第三个可能的原因是缺少对修改路径的权限。PEB路径信息是受保护的,只有进程管理员或者具有足够权限的用户才能修改。因此,检查当前用户的权限,确保具备修改PEB路径的权限。 最后,可能是程序内部对路径信息进行了缓存。有些程序在启动时会对路径信息进行缓存,以提高性能或者减少文件系统访问次数。在这种情况下,即使修改PEB路径,程序仍然会使用缓存的路径信息。解决方法是重新启动程序或者清除缓存,使修改路径生效。 综上所述,当在PEB修改路径后却不起效时,需要检查是否正确修改了对应的路径修改路径的时机是否正确,用户是否具备修改PEB路径的权限,并考虑是否对路径信息进行了缓存。根据具体情况来采取相应的解决方法。 ### 回答3: 当修改PEB(进程环境块)路径后,可能会遇到路径不起效的情况。原因可能有以下几点: 1. 系统保护机制:PEB路径可能被系统保护机制所限制,在某些情况下无法实际生效。例如,部分操作系统禁止用户修改系统关键目录的路径。 2. 程序重启前置:某些程序在启动时会读取并保存PEB路径信息,如果在程序启动后修改PEB路径,程序需要重启才能生效。 3. 函数缓存:某些函数在调用时会缓存PEB路径信息,以提高性能。因此,如果修改PEB路径,可能需要等到缓存被刷新后才能生效。 4. 读写权限:PEB路径信息可能受到访问权限的限制。如果没有足够的权限来修改PEB路径修改将不会生效。 为解决这个问题,可以尝试以下方法: 1. 以管理员权限运行程序:如果修改路径位于系统关键目录下,确保以管理员身份运行程序,以获取足够的权限来修改PEB路径。 2. 重启程序:修改PEB路径后,尝试重启程序,以使修改能够生效。 3. 强制刷新缓存:可以尝试通过系统API或者特定的程序接口来刷新函数缓存,强制使修改后的PEB路径生效。 需要注意的是,在修改PEB路径前,请确保了解并理解系统的相关保护机制,以及修改后可能会产生的影响和风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值