readprocessmemory读取数据不对(readprocessmemory读取内存会黑屏)

本文目录
- readprocessmemory读取内存会黑屏
- VC里的关于ReadProcessMemory 的问题~!大神进来看看!
- VB内存读出来数据全是0
- MFC读游戏内存字符串得到乱码如何解决
- 关于Readprocessmemory的读取问题
- ReadProcessMemory读取数值总为0
- ReadProcessMemory 指针 偏移
readprocessmemory读取内存会黑屏
权限问题、数据处理错误。
1、权限问题:程序没有足够的权限来读取目标进程的内存,或目标进程对读取操作的允许设置不正确,会导致读取失败或程序崩溃,从而出现黑屏问题。
2、数据处理错误:返回的数据不正确或格式错误,会导致程序崩溃或出现其他异常行为,从而出现黑屏问题。
VC里的关于ReadProcessMemory 的问题~!大神进来看看!
BOOL ReadProcessMemory(
HANDLE hProcess, // 进程句柄
LPCVOID lpBaseAddress, // 读取数据的起始地址
LPVOID lpBuffer, // 缓冲区,存储读取内容
DWORD nSize, // 需要读取数据的大小
LPDWORD lpNumberOfBytesRead); // 实际读取数据的大小
看了上面的,你的第一个问题应该有答案了吧
至于你的结果,你这样尝试一下
LPCVOID pbase=(LPCVOID)0x00129FB4;
byte chessData;
::ReadProcessMemory(processH,pbase,(LPVOID)chessData,11*19,&byread);
然后调试跟踪进去,看看 chessData 是不是对的
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&
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,这种错误还要我指出两次来啊,比较一下就知道错误在那
关于Readprocessmemory的读取问题
问题出在“d = FindWindow(vbNullString, "暴风影音") ”这一行,其中“暴风影音”必须严格匹配,包括其中的空格等字符,应该是非常完整的窗口标题,例如Word在打开文件时和未打开文件时的窗口标题是不一样的。但可以先执行如下代码(需FindWindowEx 、GetWindowText两个API函数),待检测出你想要的窗口后再执行你的代码:
Dim aaa As Long
Dim bbb As Long
Dim ccc As Long
Dim sss As String * 255
Do
aaa = FindWindowEx(0, bbb, vbNullString, vbNullString)
If aaa = 0 Then
Exit Sub
Else
GetWindowText aaa, sss, 255
End If
bbb = aaa
ccc = Len(Trim(sss))
If ccc 《》 0 Then
For i = 1 To ccc
If Mid(sss, i, 4) = "暴风影音" Then Exit Do
Next i
End If
Loop
MsgBox Trim(sss)
ReadProcessMemory读取数值总为0
Handle是总变的,并且你得到的第一个Handle是不允许在第二个里用的,对于进程这种核心的东西,其句柄值是随机变化的(windows自身有加密)防止错误的访问。
至于你读数不正确的问题,建议贴代码出来
ReadProcessMemory 指针 偏移
是 += 不是 =+
首先读取存在addr0中的地址addr1没错
然后addr1加上偏移,你符号用错了
然后从addr1加偏移后的地址读取addr2,没错
然后addr2加偏移,你符号用错了
之后ReadProcessMemory从addr2中读出值,就是你要的数据。
Write的话就是拿到最终地址了最后一步读出来改成写回去

更多文章:
jfreechart 极坐标设置线条颜色(各位,怎样修改 matlab 中极坐标生成的图像线条的宽度求程序指导! 谢谢了!!!)
2025年8月9日 12:00
appear后面可以加名词吗(高考英语备考之 appear的用法)
2025年9月17日 03:30
django框架安装过程(京东云擎怎么搭建django 框架)
2025年7月24日 02:00
index加match函数出错(excel中INDEX和MATCH函数出现的问题)
2026年1月3日 23:00
routes插件(模拟火车2019机车插件和线路插件安装在哪里怎么激活求大神解答!!)
2025年7月11日 16:45
手机java运行库下载(三星C3300K手机下载JAVA游戏详细方法)
2026年1月12日 09:00
雅马哈音响portable(为什么存储卡里的歌在可插卡蓝牙音响上有些能放,有些不能放)
2026年8月5日 16:15
易语言源码忘记保存奔溃怎么找回(易语言源码丢失,用什么恢复软件恢复后可以用)
2025年12月9日 05:45















