readprocessmemory读取字符串(请教下跨进程内存读取问题)

本文目录
- 请教下跨进程内存读取问题
- MFC读游戏内存字符串得到乱码如何解决
- 运行光盘的时候出现仅完成部分的Read Porcess Memoty或Write Process Memory 请求
- VB中ReadProcessMemory用法求助
- C#用ReadProcessMemory读出的字符怎么才能正常显示啊,不能转换回中文字符的.
- C++ MFC中 如何获得内存中的字符串
- VB内存读出来数据全是0
请教下跨进程内存读取问题
我觉得你的方法没什么问题。如果你给的地址获取的是对的的话,你看看乱码是不是因为这个:你的确读取到了8个字节,4个字符;但是显示的时候因为不知道字符串结束位置,导致messagebox显示的是乱码。你可以看看name中的8个字节的数据到底是不是4个字符的unicode码,或者先把name分配的空间给初始化为0之后再进行后续的函数调用,这样就不存在不知道结束位置在哪儿的问题了。
希望有帮助。
MFC读游戏内存字符串得到乱码如何解决
ReadProcessMemory 函数状态: 翻译/整理完成 ,建设者:阵雨 ,最新更新时间: 2004-10-17 4:32:09 修改该函数
函数功能描述:该函数用来读取指定进程的空间的数据,此空间必须是可以访问的,否则读取操作会失败!
函数原型
BOOL ReadProcessMemory(
HANDLE hProcess, // 目标进程句柄
LPCVOID lpBaseAddress,
// 读取数据的起始地址
LPVOID lpBuffer, // 存放数据的缓存区地址
DWORD nSize, // 要读取的字节数
LPDWORD lpNumberOfBytesRead
// 实际读取数存放地址
);
参数
hProcess
目标进程的句柄,该句柄必须对目标进程具有PROCESS_VM_READ 的访问权限。
lpBaseAddress
从目标进程中读取数据的起始地址。 在读取数据前,系统将先检验该地址的数据是否可读,如果不可读,函数将调用失败。
lpBuffer
用来接收数据的缓存区地址。
nSize
从目标进程读取数据的字节数。
lpNumberOfBytesRead
实际被读取数据大小的存放地址。如果被指定为NULL,那么将忽略此参数。
返回值
如果函数执行成功,返回值非零。
如果函数执行失败,返回值为零。调用 GetLastError 函数可以获取该函数执行错误的信息。
如果要读取一个进程中不可访问空间的数据,该函数就会失败。
备注
ReadProcessMemory 函数从目标进程复制指定大小的数据到自己进程的缓存区,任何拥有PROCESS_VM_READ 权限句柄的进程都可以调用该函数,目标进程的地址空间很显然要是可读的,但也并不是必须的,如果目标进程处于被调试状态的话。
使用环境
Windows NT: 要求3.1或更高版本
Windows: 要求 Windows 95 或更高版本
Windows CE: 不支持
头文件: winbase.h
输入库: kernel32.lib.
示例代码段
HANDLE hProcess;
int tmp;
DWORD dwNumberOfBytesRead;
hProcess=(OpenProcess(PROCESS_VM_READ,false,pid);//pid为目标进程的id
if(hProcess !=NULL)
{
if(ReadProcessMemory(hProcess,(LPCVOID)0x00401000,&tmp,4,&dwNumberOfBytesRead))
OutputDebugString("读取数据成功");
else
OutputDebugString("读取数据失败");
}
楼上的是正解的,你犯了一个错误:数组在当作形参传递时会自动退化成改类型的指针。你是用a就已经是指针了,在加&就是取存这个指针的地址了,而这个指针的地址就是指向你数组的地址,而你数组里面的数据根本没有变化。注意你连你数组的指针都被改写了,你还怎么能找你数组里面的数据呢?奇怪你这样运行居然没有出现内存地址不可访问的错误,系统还没有崩溃。。。
怎么说你才好,你在c#里面调用的数组的格式是正确的!!!你看看你在MFC里面的数组调用 &a,这种错误还要我指出两次来啊,比较一下就知道错误在那
运行光盘的时候出现仅完成部分的Read Porcess Memoty或Write Process Memory 请求
方法一:
1.找到system32目录,将cmd.exe文件改成cmd.com文件(目的是使cmd能够运行,因为.exe文件不能执行了啊,改成.com可以执行了)。
2.在开始里点击运行,输入cmd,然后回车。
3.在dos内,输入assoc .exe=exefile,然后回车(注意assoc与.exe之间有个空格,assoc是个命令),这样.exe就与.exe的执行文件关联了,再运行.exe文件就可以了,解决。
方法二:
可以通过修改注册表来恢复EXE文件。因为EXE文件都无法打开,所以只有先将Windows目录下的注册表器“Regedit.exe”改为“Regedit.com”,然后运行它,依次找到HKEY_CLASSES_ROOT\exefile\shell\open\command,双击“默认”字符串,将其数值改为“"%1" %*”就可以了。另外也可以在DOS下运行“ftype exefile=%1 %*”或“assoc .exe=exefile”命令也可以恢复EXE文件的关联。
VB中ReadProcessMemory用法求助
至少也要把api声明贴出来,api声明不一样,调用的时候传入的参数的写法都不一样,
比如 byval a as long 和 a as long。
你这种api声明调用代码修改如下
ReadProcessMemory pHandle, ByVal &H102D4D8, str, 4, 0&
改成
ReadProcessMemory pHandle, ByVal &H102D4D8, varptr(str), 4, 0&
C#用ReadProcessMemory读出的字符怎么才能正常显示啊,不能转换回中文字符的.
String GetString(IntPtr hProcess, IntPtr lpBaseAddress, int nSize = 1000)
{
byte;
if (ReadProcessMemory(hProcess, lpBaseAddress, data, nSize, 0) == 0)
{
//读取内存失败!
return "";
}
String result = "";
//String TempString = Encoding.ASCII.GetString(data);
String TempString = Encoding.UTF8.GetString(data);
// \0
foreach (char item in TempString)
{
if (item == ’\0’)
{
break;
}
result += item.ToString();
}
return result;
}
C++ MFC中 如何获得内存中的字符串
DWORD dwWantRead = 16, dwHaveRead;
LPBYTE* lpName = new BYTE;
ReadProcessMemory(hOk, (LPCVOID)0x008C2654, pName, dwWantRead, &dwHaveRead);
Try again, good luck!
VB内存读出来数据全是0
读字符串应该将变量定义为Byte类型,dim x(0 to 9) as byte,dim str as string,然后将读出来的数据转换,str=trim(left$(x,10))
第二句好像是字节数错了,long类型应该是4个字节,改成ReadProcessMemory myPid, ByVal &HB5740, y , 4, 0&
这样的话应该可以了,如果还是0,你就改成a=readprocessmemory(...),这样根据a的值可以看是否调用成功,还有就是你用的VB版本可能使你的调用失败,你可以把命令打全一点,如:ReadProcessMemory ByVal myPid,ByVal &HB5740, ByVal VarPtr(y), 4, 0&

更多文章:
vb程序设计里面的x是啥(VB程序设计中的变量是如何定义的,请大家帮帮忙告诉我)
2026年10月10日 10:40
java定时器每一分钟执行一次(java定时执行问题: 我想让一个Java代码在每小时的第25分钟执行一次的,这个怎么实现)
2026年10月10日 08:50
abap开发工作经历(目前,从事的是ABAP开发的不知道做这个有没有什么前途啊好的话,我会加分的~)
2026年10月10日 01:10






