本次实验 使用windows API 访问进程内存
涉及以下几个函数
根据类名 或者 标题名 寻找窗口句柄
FindWindowA
根据窗口句柄 获取进程PID和线程TID
GetWindowThreadProcessId();
根据进程皮带 获取进程句柄
OpenProcess();
打开进程句柄后 用完了记得释放
CloseHandle();
根据进程句柄 读进程内存
ReadProcessMemory();
根据进程句柄 写进程内存
WriteProcessMemory();
创建远程线程 在其它进程地址空间中运行的线程
CreateRemoteThread();
实验代码如下
#include <iostream>
#include <windows.h>
int main()
{
//根据类名 或者 标题名 寻找窗口句柄 名字可能会变 最好用类名查找
HWND handle=FindWindowA(
NULL //输入类名 查找窗口句柄
,"计算器"); //输入标题名 查找窗口句柄
printf("窗口句柄:%p \n",handle);
DWORD pid, tid;
//根据窗口句柄 获取进程PID和线程TID
tid = GetWindowThreadProcessId(handle,&pid); // 传入窗口句柄 PID 传入&pid TID 传入tid ,第二个参数是输出参数
//根据进程皮带 获取进程句柄
HANDLE Phandle = OpenProcess(
PROCESS_ALL_ACCESS //想要拥有的权限
,0 //是否继承句柄
,pid //PID
);
//打开进程句柄后 用完了记得释放
//CloseHandle(Phandle);
//根据进程句柄 读进程内存
unsigned int redbuff = 0;
ReadProcessMemory(
Phandle //进程句柄
,(LPCVOID)0x401000 //想要读取的地址
,&redbuff //读取后 存放的地址
,4 //读取多少字节
,0 //输出参数 实际读取的字节数
);
//根据进程句柄 写进程内存
unsigned int wrtbuff = 10;
WriteProcessMemory(
Phandle //进程句柄
,(LPVOID)0x401000 //想要写入的地址
,&wrtbuff //想要写入的值
,4 //写多少个字节
,NULL //输出参数 实际写入的字节数
);
//创建远程线程 创建一个在其它进程地址空间中运行的线程
CreateRemoteThread(
,Phandle //进程句柄
,NULL //安全属性
,0 //新开线程的堆栈大小
,0x410000 //线程创建后 调用函数的地址
,0 //调用函数的参数
,0 //线程创建后 立即运行还是挂起
,NULL //输出参数
,0);
);
return 0;
}