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