zoukankan      html  css  js  c++  java
  • WIN32API获取进程句柄的2种方式

    0x00 相关说明:

    Windows系统中,进程句柄是进程最重要的属性之一,在应用层可以通过进程句柄直接对指定进程的内存空间进行读写。

    0x01 通过进程名获取进程句柄:

    首先通过进程名得到进程ID:

    1、 通过 CreateToolhelp32Snapshot 获得当前系统中所有进程的快照

    2、 通过 Process32First 判断第一个进程的信息是否正常

    3、 通过 Process32Next 结合循环遍历所有的快照信息,使用进程名筛选出目标进程

    通过进程ID获取进程句柄:

    使用 OpenProcess 可以通过进程ID获取进程句柄

    完整代码如下:

    HANDLE GetProcessHandle(LPCWSTR lpName)
    {
         DWORD dwPid = 0;
         HANDLE hProcess = NULL;
         HANDLE hProcessSnap;
         PROCESSENTRY32 pe32;

        // Take a snapshot of all processes in the system.
         hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
         if (hProcessSnap == INVALID_HANDLE_VALUE)
         {
             //printf("Error: CreateToolhelp32Snapshot (of processes) ");
             return NULL;
         }

        // Set the size of the structure before using it.
         pe32.dwSize = sizeof(PROCESSENTRY32);

        // Retrieve information about the first process,
         // and exit if unsuccessful
         if (!Process32First(hProcessSnap, &pe32))
         {
             //printf("Error: Process32First "); // show cause of failure
             CloseHandle(hProcessSnap);          // clean the snapshot object
             return NULL;
         }

        // Now walk the snapshot of processes, and
         // display information about each process in turn
         int namelen = 200;
         char name[201] = { 0 };
         do
         {
             if (!wcscmp(pe32.szExeFile, lpName)) {
                 dwPid = pe32.th32ProcessID;
                 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
                 break;
             }

        } while (Process32Next(hProcessSnap, &pe32));

        CloseHandle(hProcessSnap);
         return hProcess;
    }

    需要包含的头文件:

    #include <windows.h>
    #include <TlHelp32.h>
    #include <Psapi.h>

    0x02 通过窗口标题获取进程句柄:

    大部分的Windows应用程序都有窗口,通过窗口标题获取进程句柄非常简单:

    HANDLE GetProcessHandle(LPCWSTR lpName)
    {
         DWORD dwPid = 0;

        HWND hWnd = FindWindowW(NULL, lpName);
         if (hWnd == NULL) {
             return;
         }
         GetWindowThreadProcessId(hWnd, &dwPid);
         return OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    }

    0x03 封装代码:

    可以将上面的代码以及常用的进程读写封装在一起,方便后续的使用:

    新建 Process.h :

    #pragma once

    #include <stdio.h>
    #include <windows.h>
    #include <TlHelp32.h>
    #include <Psapi.h>

    class Process
    {
    public:
         Process();
         ~Process();
         Process(LPCWSTR lpName/*ProcessName/WindowTitle*/, BOOL bWindow = FALSE);

    public:
         BYTE ReadByte(LPCVOID addr, BYTE *data);
         int ReadInt(LPCVOID addr, int *data);
         long ReadLong(LPCVOID addr, long *data);
         WORD ReadWord(LPCVOID addr, WORD *data);
         DWORD ReadDword(LPCVOID addr, DWORD *data);
         float ReadFloat(LPCVOID addr, float *data);
         double ReadDouble(LPCVOID addr, double *data);
         BYTE* ReadByteArray(LPCVOID addr, BYTE *data, size_t length);

        BOOL WriteByte(LPVOID addr, BYTE data);
         BOOL WriteInt(LPVOID addr, int data);
         BOOL WriteLong(LPVOID addr, long data);
         BOOL WriteWord(LPVOID addr, WORD data);
         BOOL WriteDword(LPVOID addr, DWORD data);
         BOOL WriteFloat(LPVOID addr, float data);
         BOOL WriteDouble(LPVOID addr, double data);
         BOOL WriteByteArray(LPVOID addr, BYTE *data, size_t length);

        HMODULE GetModuleAddr(LPCWSTR lpModuleName);

    public:
         DWORD dwPid=0;
         HANDLE hProcess=NULL;
    };

    新建 Process.cpp :

    #include "Process.h"


    Process::Process()
    {
    }

    Process::~Process()
    {
         if(this->hProcess){
             CloseHandle(this->hProcess);
         }
    }

    Process::Process(LPCWSTR lpName/*ProcessName/WindowTitle*/, BOOL bWindow)
    {
         if (bWindow){
             HWND hWnd = FindWindowW(NULL, lpName);
             if(hWnd == NULL){
                 return;
             }
             GetWindowThreadProcessId(hWnd, &(this->dwPid));
             this->hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, this->dwPid);
         }
         else {
             HANDLE hProcessSnap;
             PROCESSENTRY32 pe32;

            // Take a snapshot of all processes in the system.
             hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
             if (hProcessSnap == INVALID_HANDLE_VALUE)
             {
                 //printf("Error: CreateToolhelp32Snapshot (of processes) ");
                 return;
             }

            // Set the size of the structure before using it.
             pe32.dwSize = sizeof(PROCESSENTRY32);

            // Retrieve information about the first process,
             // and exit if unsuccessful
             if (!Process32First(hProcessSnap, &pe32))
             {
                 //printf("Error: Process32First "); // show cause of failure
                 CloseHandle(hProcessSnap);          // clean the snapshot object
                 return;
             }

            // Now walk the snapshot of processes, and
             // display information about each process in turn
             int namelen = 200;
             char name[201] = { 0 };
             do
             {
                 if (!wcscmp(pe32.szExeFile, lpName)) {
                     this->dwPid = pe32.th32ProcessID;
                     this->hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, this->dwPid);
                     break;
                 }

            } while (Process32Next(hProcessSnap, &pe32));

            CloseHandle(hProcessSnap);
         }
    }


    BYTE Process::ReadByte(LPCVOID addr, BYTE *data)
    {
         BYTE  ret;
         ReadProcessMemory(this->hProcess, addr, &ret, sizeof(BYTE), NULL);
         if(data != NULL)   
             * data = ret;
         return ret;
    }

    int Process::ReadInt(LPCVOID addr, int *data)
    {
         int  ret;
         ReadProcessMemory(this->hProcess, addr, &ret, sizeof(int), NULL);
         if (data != NULL)
             * data = ret;
         return ret;
    }

    long Process::ReadLong(LPCVOID addr, long *data)
    {
         long  ret;
         return ReadProcessMemory(this->hProcess, addr, &ret, sizeof(long), NULL);
         if (data != NULL)
             * data = ret;
         return ret;
    }

    WORD Process::ReadWord(LPCVOID addr, WORD *data)
    {
         WORD  ret;
         ReadProcessMemory(this->hProcess, addr, &ret, sizeof(WORD), NULL);
         if (data != NULL)
             * data = ret;
         return ret;
    }

    DWORD Process::ReadDword(LPCVOID addr, DWORD *data)
    {
         DWORD  ret;
         ReadProcessMemory(this->hProcess, addr, &ret, sizeof(DWORD), NULL);
         if (data != NULL)
             * data = ret;
         return ret;
    }

    float Process::ReadFloat(LPCVOID addr, float *data)
    {
         float  ret;
         ReadProcessMemory(this->hProcess, addr, &ret, sizeof(float), NULL);
         if (data != NULL)
             * data = ret;
         return ret;
    }

    double Process::ReadDouble(LPCVOID addr, double *data)
    {
         double  ret;
         return ReadProcessMemory(this->hProcess, addr, &ret, sizeof(double), NULL);
         if (data != NULL)
             * data = ret;
         return ret;
    }

    BYTE* Process::ReadByteArray(LPCVOID addr, BYTE *data, size_t length)
    {
         if (data == NULL)
             exit(-1);
         ReadProcessMemory(this->hProcess, addr, data, sizeof(BYTE)*length, NULL);
         return data;
    }


    BOOL Process::WriteByte(LPVOID addr, BYTE data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(BYTE), NULL);
    }

    BOOL Process::WriteInt(LPVOID addr, int data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(int), NULL);
    }

    BOOL Process::WriteLong(LPVOID addr, long data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(long), NULL);
    }

    BOOL Process::WriteWord(LPVOID addr, WORD data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(WORD), NULL);
    }

    BOOL Process::WriteDword(LPVOID addr, DWORD data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(DWORD), NULL);
    }

    BOOL Process::WriteFloat(LPVOID addr, float data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(float), NULL);
    }

    BOOL Process::WriteDouble(LPVOID addr, double data)
    {
         return WriteProcessMemory(this->hProcess, addr, &data, sizeof(double), NULL);
    }

    BOOL Process::WriteByteArray(LPVOID addr, BYTE *data, size_t length)
    {
         return WriteProcessMemory(this->hProcess, addr, data, sizeof(BYTE)*length, NULL);
    }


    HMODULE Process::GetModuleAddr(LPCWSTR lpModuleName)
    {
         HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
         MODULEENTRY32 me32;
         HMODULE hModule = 0;

        // Take a snapshot of all modules in the specified process.
         hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, this->dwPid);
         if (hModuleSnap == INVALID_HANDLE_VALUE)
         {
             //printf("Error: CreateToolhelp32Snapshot (of modules) ");
             return NULL;
         }

        // Set the size of the structure before using it.
         me32.dwSize = sizeof(MODULEENTRY32);

        // Retrieve information about the first module,
         // and exit if unsuccessful
         if (!Module32First(hModuleSnap, &me32))
         {
             //printf("Error: Module32First ");  // show cause of failure
             CloseHandle(hModuleSnap);     // clean the snapshot object
             return NULL;
         }

        // Now walk the module list of the process,
         // and display information about each module
         do
         {
             if (!wcscmp(lpModuleName, me32.szModule)) {
                 hModule = (HMODULE)me32.modBaseAddr;
                 CloseHandle(hModuleSnap);
                 return hModule;
             }

        } while (Module32Next(hModuleSnap, &me32));

        CloseHandle(hModuleSnap);
         return NULL;
    }

  • 相关阅读:
    高效 告别996,开启java高效编程之门 问题
    高效 告别996,开启java高效编程之门 3-3实战:利用Lambda+Stream处理业务逻辑
    高效 告别996,开启java高效编程之门 3-2传统方式处理业务逻辑
    高效 告别996,开启java高效编程之门 3-1流式编程开场与案例场景概述
    无限树
    拖拽示例
    日期格式化字符串 字符串转化成日期
    loading
    It运维项目整理
    免费的二维码发布平台 http://zhifubao.masao.top:8282/assets/index.html
  • 原文地址:https://www.cnblogs.com/DarkBright/p/10809092.html
Copyright © 2011-2022 走看看