向大家请教,如何用 ReadProcessMemory 读取内存地址里的文本
解决方案 »
- 添加变量是类消失了?
- CListCtrl能不能实现设置指定列的背景色呢?
- 怎么在画图的框架里得到两条相交线的交点坐标
- 我创建一个新的进程,想杀掉另一个进程中的一个线程,该怎么找到我想关掉的线程啊?然后又怎么再恢复这个线程呢?
- CTabCtrl在主框架最大化时不能显示
- 访问DCOM接口,返回错误码:0x800703e6 内存分配访问无效
- 用sscanf读取两个字符串的问题
- 如何利用vc中的CRecordset来实现数据表的查询??
- CString SQL;
- 怎么用c++读取jpg文件中的exif信息,比如GPS
- 怎么做RICHEDIT里面超链接的消息映射?
- vc 6 ISAPI 用ADO 连接数据库 'AfxOleInit' undeclared identifier
你把十进制换成Ascii对应的字母不就好了
例子包括3个文件s1.cpp, s2.cpp, s.h
s1.cpp和s2.cpp分别编译成2个exe文件,
首先运行s1.exe,会弹出个MessageBox提示启动s2.exe这时候,保持这个Messagebox在这里,然后启动s2.exe,s2.exe会弹出一个MessageBox显示从s1.exe中读出来的字符串。下面是代码:
//s1.cpp#include "s.h"int main()
{
TCHAR s[256]=_T("ReadProcessMemory的用法");//这个是读取的字符串
//创建内存映射文件,用来传递PID,字符串s的地址和字符串的长度
HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,3*sizeof(DWORD),FILE_MAP_NAME);
if(NULL == hFileMapping)
{
MessageBox(NULL,_T("CreateFileMapping Failed.\nTry to restart me."),_T("s1.exe"),MB_OK);
return 0;
}
HANDLE hMVOF = MapViewOfFile(hFileMapping,FILE_MAP_WRITE,0,0,0);
if(NULL == hMVOF)
{
CloseHandle(hFileMapping);
MessageBox(NULL,_T("MapViewOfFile Failed.\nTry to restart me."),_T("s1.exe"),MB_OK);
return 0;
}
//内存映射文件创建OK,写入内容
DWORD* FP = (DWORD*)hMVOF;
FP[0] = GetCurrentProcessId(); //当前进程的PID
FP[1] = (DWORD)s; //字符串s的地址
FP[2] = (DWORD)_tcslen(s); //字符串s的长度
MessageBox(NULL,_T("Start s2.exe before click the \"OK\" button on this messagebox."),_T("s1.exe"),MB_OK); //提示启动s2 //下面是善后
UnmapViewOfFile(hMVOF);
CloseHandle(hFileMapping);
return 0;
}
//s2.cpp#include"s.h"int main()
{
//打开内存映射文件,读出PID,字符串地址和字符串长度
HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ,FALSE,FILE_MAP_NAME);
if(NULL == hFileMapping)
{
MessageBox(NULL,_T("Can not Open File Mapping.\ns1.exe not running?\nPlease make sure s1.exe is running and start me again -_-"),_T("s2.exe"),MB_OK);
return 0;
}
HANDLE hMVOF = MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);
if(NULL == hMVOF)
{
CloseHandle(hFileMapping);
MessageBox(NULL,_T("Something wrong during MapViewOfFile.\nYou could try to restart me -_-"),_T("s2.exe"),MB_OK);
return 0;
}
//打开内存映射文件OK,读取
DWORD *FP =(DWORD*)hMVOF;
DWORD PID =FP[0]; //s1的PID
void* ADDR =(void*)FP[1]; //字符串的地址
DWORD LEN =FP[2]; //字符串的长度
UnmapViewOfFile(hMVOF);
CloseHandle(hFileMapping); //关闭内存映射文件 TCHAR* BUFFER = new TCHAR[LEN+1]; //准备buffer
HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE,PID);
if(NULL == hProcess)
{
delete[] BUFFER;
MessageBox(NULL,_T("OpenProcess Error.\ns1.exe not running?\nPlease make sure s1.exe is running and start me again -_-"),_T("s2.exe"),MB_OK);
return 0;
}
if(0==ReadProcessMemory(hProcess,ADDR,BUFFER,(LEN+1)*sizeof(TCHAR),NULL))
{
delete[] BUFFER;
MessageBox(NULL,_T("ReadProcessMemory Failed."),_T("s2.exe"),MB_OK);
return 0;
}
//读取OK,显示之
MessageBox(NULL,BUFFER,_T("s2.exe ReadProcessMemory OK"),MB_OK);
delete[] BUFFER;
return 0;
}
//s.h
// 如果想用UNICODE,取消下面两行的注释就行了
//#define _UNICODE
//#define UNICODE#include<TCHAR.h>
#include<windows.h>#ifndef FILE_MAP_NAME
#define FILE_MAP_NAME _T("XXXX_XXXX")
#endif
如果你看懂了,问题就解决了,看不懂的话,再来问。
// 小测试程序
TCHAR buf[] = _T("你好 Hello,World!");
TCHAR szText[256] = {0};
DWORD dwAddr = (DWORD)buf; // 字符串的地址
ReadProcessMemory(GetCurrentProcess(), (LPCVOID)dwAddr, szText, sizeof(buf), NULL);
AfxMessageBox(szText);
感谢 “magic7004” 耐心解答
感谢 “VisualEleven” 深入浅出的解答 感谢大家的帮助!
filemapping是为了获得PID和字符串地址,用ReadProcessMemory是为了演示它的用法