隐藏技术-进程伪装

本文最后更新于:2021-08-09 晚上

进程伪装

进程伪装就是修改任意进程的信息,在系统中显示的是另一个进程的信息,但是实际上还是它还是在执行原来的操作。

实现原理

实现起来原理并不复杂,就是修改指定进程的进程环境块PEB中的进程路径以及命令行信息即可。下面使用Windbg来查看一下notepad的相关信息。

查看PEB的相关信息,可以看到ProcessParameters,这里有进程的路径和命令行相关信息。

继续查看这个结构,可以看到ImagePathName和CommandLine,也可以看到其中的信息都是”C:\Windows\system32\notepad.exe”

编码实现

  • 获取PEB地址
  • 获取ProcessParameters
  • 写入伪装信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// DisguiseProcess.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <Windows.h>
#include <winternl.h>
#include <process.h>

typedef NTSTATUS(NTAPI* typedef_NtQueryInformationProcess)(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

/*PID:需要进行伪装的进程PID
* lpwszpath:伪装路径
* lpwszcmd:伪装命令行
*/
BOOL DisguiseProcess(DWORD PID, wchar_t* lpwszPath, wchar_t* lpwszCmd) {
//打开进程获取句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
if (hProcess == NULL) {
printf("打开进程失败\n");
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;
NtQueryInformationProcess = (typedef_NtQueryInformationProcess)GetProcAddress(LoadLibraryA("ntdll.dll"), "NtQueryInformationProcess");
if (NtQueryInformationProcess == NULL) {
printf("获取函数地址失败\n");
return FALSE;
}
NTSTATUS status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
if (!NT_SUCCESS(status)) {
printf("获取进程信息失败\n");
return FALSE;
}
//获取peb的地址
ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL);
//获取ProcessParameters地址
ReadProcessMemory(hProcess, peb.ProcessParameters, &Param, sizeof(Param), NULL);
usCmdLen = 2 + 2 * wcslen(lpwszCmd);
//写入命令行信息
WriteProcessMemory(hProcess, Param.CommandLine.Buffer, lpwszCmd, usCmdLen, NULL);
WriteProcessMemory(hProcess, &Param.CommandLine.Length, &usCmdLen, sizeof(usCmdLen), NULL);
usPathLen = 2 + 2 * wcslen(lpwszPath);
//写入路径信息
WriteProcessMemory(hProcess, Param.ImagePathName.Buffer, lpwszPath, usPathLen, NULL);
WriteProcessMemory(hProcess, &Param.ImagePathName.Length, &usPathLen, sizeof(usPathLen), NULL);
return TRUE;
}
int main()
{
//伪装自身获取自身PID,如果伪装其他程序可以通过窗口或者进程名方式获得PID
if (DisguiseProcess(_getpid(), L"C:\\Windows\\System32\\notepad.exe", L"C:\\Windows\\Syetem32\\notepad.exe") == FALSE) {
printf("进程伪装失败\n");
system("pause");
exit(-1);
}
printf("伪装成功\n");
system("pause");
return 0;
}

运行伪装程序,提示伪装成功

然后使用Process Explorer查看伪装程序的相关信息。可以看到进程已经伪装成功,描述这里写着记事本,路径和命令行都是我们写入的伪装信息。

参考

参考《Windows黑客编程技术详解》一书