在 Windows 平台的开发中,利用 windows.h 提供的 API,开发者可以对应用程序进行深入的操作,包括获取窗口句柄、线程与进程信息,以及读写进程的内存。在本文中,我们将介绍以下关键函数的使用:

  1. FindWindow
  2. GetWindowThreadProcessId
  3. ReadProcessMemory
  4. WriteProcessMemory

1. FindWindow - 查找窗口句柄

FindWindow 函数用于根据窗口类名或窗口标题查找窗口句柄。

函数原型

HWND FindWindow(
  LPCSTR lpClassName,
  LPCSTR lpWindowName
);

参数说明

  • lpClassName: 窗口类名(可为 NULL)。
  • lpWindowName: 窗口标题(可为 NULL)。

示例代码

#include <windows.h>
#include <iostream>

int main() {
    HWND hWnd = FindWindow(NULL, "目标窗口标题");
    if (hWnd) {
        std::cout << "窗口句柄: " << hWnd << std::endl;
    } else {
        std::cout << "未找到窗口!" << std::endl;
    }
    return 0;
}

2. GetWindowThreadProcessId - 获取线程和进程 ID

GetWindowThreadProcessId 用于获取与窗口关联的线程 ID 和进程 ID。

函数原型

DWORD GetWindowThreadProcessId(
  HWND    hWnd,
  LPDWORD lpdwProcessId
);

参数说明

  • hWnd: 窗口句柄。
  • lpdwProcessId: 指向一个变量,用于接收进程 ID。

示例代码

#include <windows.h>
#include <iostream>

int main() {
    HWND hWnd = FindWindow(NULL, "目标窗口标题");
    if (!hWnd) {
        std::cout << "窗口未找到!" << std::endl;
        return -1;
    }

    DWORD processId;
    DWORD threadId = GetWindowThreadProcessId(hWnd, &processId);

    std::cout << "线程 ID: " << threadId << std::endl;
    std::cout << "进程 ID: " << processId << std::endl;

    return 0;
}

3. ReadProcessMemory - 读取进程内存

ReadProcessMemory 函数用于读取指定进程内存中的数据。

函数原型

BOOL ReadProcessMemory(
  HANDLE  hProcess,
  LPCVOID lpBaseAddress,
  LPVOID  lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesRead
);

参数说明

  • hProcess: 目标进程的句柄。
  • lpBaseAddress: 要读取的内存地址。
  • lpBuffer: 接收读取数据的缓冲区。
  • nSize: 要读取的字节数。
  • lpNumberOfBytesRead: 实际读取的字节数。

示例代码

#include <windows.h>
#include <iostream>

int main() {
    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, 目标进程ID);
    if (!hProcess) {
        std::cerr << "无法打开进程!" << std::endl;
        return -1;
    }

    int buffer;
    SIZE_T bytesRead;
    if (ReadProcessMemory(hProcess, (LPCVOID)目标地址, &buffer, sizeof(buffer), &bytesRead)) {
        std::cout << "读取的值: " << buffer << std::endl;
    } else {
        std::cerr << "读取失败!" << std::endl;
    }

    CloseHandle(hProcess);
    return 0;
}

4. WriteProcessMemory - 写入进程内存

WriteProcessMemory 函数用于修改目标进程的内存。

函数原型

BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);

参数说明

  • hProcess: 目标进程的句柄。
  • lpBaseAddress: 要写入的内存地址。
  • lpBuffer: 包含写入数据的缓冲区。
  • nSize: 要写入的字节数。
  • lpNumberOfBytesWritten: 实际写入的字节数。

示例代码

#include <windows.h>
#include <iostream>

int main() {
    HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, 目标进程ID);
    if (!hProcess) {
        std::cerr << "无法打开进程!" << std::endl;
        return -1;
    }

    int newValue = 12345;
    SIZE_T bytesWritten;
    if (WriteProcessMemory(hProcess, (LPVOID)目标地址, &newValue, sizeof(newValue), &bytesWritten)) {
        std::cout << "写入成功!" << std::endl;
    } else {
        std::cerr << "写入失败!" << std::endl;
    }

    CloseHandle(hProcess);
    return 0;
}