21xrx.com
2024-11-22 11:27:55 Friday
登录
文章检索 我的文章 写文章
C++编程:如何隐藏进程
2023-06-30 20:44:03 深夜i     --     --
C++ 编程 隐藏进程 进程管理 操作系统

在某些情况下,需要用到隐藏进程的功能,这可以有效地保护进程不被非法使用者所发现。C++编程提供了一些方法来实现这个功能。

首先,我们需要了解Windows操作系统中进程隐藏的原理。Windows操作系统中,进程隐藏的原理是通过改变进程的PEB结构体中ProcessParameters结构体的CommandLine字段来实现的。改变这个字段的值,可以控制进程的可见性。

接下来,让我们看看如何在C++编程中实现进程隐藏。

第一种方法是使用ZwQueryInformationProcess函数,这个函数可以查询进程信息,并隐藏它们。以下是使用ZwQueryInformationProcess函数实现进程隐藏的示例代码:


#include <Windows.h>

#include <iostream>

#include <winternl.h>

using namespace std;

typedef NTSTATUS(WINAPI* pZwQueryInformationProcess)(

  HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);

int main()

{

  pZwQueryInformationProcess ZwQueryInformationProcess =

    (pZwQueryInformationProcess)GetProcAddress(

      GetModuleHandleA("ntdll.dll"), "ZwQueryInformationProcess");

  HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());

  PROCESS_BASIC_INFORMATION pbi;

  ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr);

  PEB peb;

  ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), nullptr);

  RTL_USER_PROCESS_PARAMETERS upp;

  ReadProcessMemory(hProcess, peb.ProcessParameters, &upp, sizeof(upp), nullptr);

  wchar_t* cmd = L"";

  WriteProcessMemory(hProcess, upp.CommandLine.Buffer, cmd, wcslen(cmd) * sizeof(wchar_t), nullptr);

  CloseHandle(hProcess);

}

第二种方法是使用NtQueryInformationProcess函数,这个函数可以返回进程的信息,找到倒数第二个Reserved字段并将它的值设置为1,这样就可以将进程隐藏起来。

以下是使用NtQueryInformationProcess函数实现进程隐藏的示例代码:


#include <Windows.h>

#include <iostream>

#include <winternl.h>

using namespace std;

typedef NTSTATUS(WINAPI* pNtQueryInformationProcess)(

  HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);

int main()

{

  pNtQueryInformationProcess NtQueryInformationProcess =

    (pNtQueryInformationProcess)GetProcAddress(

      GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");

  HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());

  PROCESS_BASIC_INFORMATION pbi;

  NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), nullptr);

  USHORT usReserved[6];

  ReadProcessMemory(hProcess, &pbi.Reserved3, &usReserved, sizeof(USHORT) * 6, nullptr);

  usReserved[4] = 1;

  WriteProcessMemory(hProcess, &pbi.Reserved3, &usReserved, sizeof(USHORT) * 6, nullptr);

  CloseHandle(hProcess);

}

总结:

这两种方法可以实现进程隐藏的功能,但需要注意的是,进程隐藏并不意味着进程不会被发现。在一些特定的场景下,仍然可以通过其他方式找到被隐藏的进程。因此,在使用这些方法时,需要慎重考虑,并在保证安全性的前提下进行使用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复