ReadProcessMemory内存读取

y564642865 2011-07-24 02:38:10
请问ReadProcessMemory这个函数该怎样读取指定内存地址中的值呢。在网上找了N久,头都大了,特来请教。

目标程序01是我自己编写的一个窗体程序,然后我在空白地址 &H401E46 写入了一些字符串,用内存写入没问题,读取的却不一样。
觉得奇怪的是为什么进程id会一直变动的pHandle。读出的&H401E46的内存也是一直变动的,鼠标移动到窗体不同地方也会变化(不正确)。
请问怎样才能读取到的内容和写入的时候一样呢。
窗体中的
00401E46的十六进制数据是 DC D9 06 0B 7C 7B
用下面方法读取到的却是一些变动的数字。

下面是读取的代码

Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const PROCESS_ALL_ACCESS = &H1F0FFF

Dim hwnd1 As Long
Dim pid As Long
Dim pHandle As Long

Private Function ncnr(lpADDress As Long) As Integer
hwnd1 = FindWindow(vbNullString, "01")
GetWindowThreadProcessId hwnd1, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
ReadProcessMemory pHandle, lpADDress, ByVal VarPtr(ncnr), 6, 0&
CloseHandle pHandle
End Function
Private Sub Timer1_Timer()
hwnd1 = FindWindow(vbNullString, "01")
If hwnd1 = 0 Then
Label1.Caption = "程序未运行"
Text1.Text=""
Else
Label1.Caption = "程序已运行"
Text1.Text = ncnr(&H401E46)
End If
End Sub
...全文
659 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
y564642865 2011-07-31
  • 打赏
  • 举报
回复
完成,做好了,并且增加了一些功能。代码那样写肯定不行的。
y564642865 2011-07-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 nerozs 的回复:]
我给你一个自己编写的代码
[/Quote]
收到,我先研究下,谢谢了。
nerozs 2011-07-28
  • 打赏
  • 举报
回复
我给你一个自己编写的代码
y564642865 2011-07-27
  • 打赏
  • 举报
回复
还有没有人会啊,再顶一次
y564642865 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 caozhy 的回复:]
http://download.csdn.net/source/1859731
[/Quote]
其实我想自己做一个类似外挂的程序,用你给的我找不到我想要的结果。也不合实际操作。
用网上的那些都不行,能写入肯定是能读取的。
看来这个问题大家都不怎么会,所以才没多少人回复。。。
threenewbee 2011-07-24
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1859731
y564642865 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 veron_04 的回复:]
hMine = FindWindow(vbNullString, "扫雷") '找 扫雷 窗口
Call GetWindowThreadProcessId(hMine, MineID) '返回 扫雷 进程的ID,为mineId
yOffset = 60
xOffset = 20
pMine = OpenProcess(PROCESS_VM_READ, True, MineI……
[/Quote]
这个内存区基址是不是我上面用内存写入的地址?&H401E46
这个地址记录着我写入的内容,如果是,那么数据缓冲区地址该是多少?
y564642865 2011-07-24
  • 打赏
  • 举报
回复
我的帖子呢???
贝隆 2011-07-24
  • 打赏
  • 举报
回复
hMine = FindWindow(vbNullString, "扫雷") '找 扫雷 窗口
Call GetWindowThreadProcessId(hMine, MineID) '返回 扫雷 进程的ID,为mineId
yOffset = 60
xOffset = 20
pMine = OpenProcess(PROCESS_VM_READ, True, MineID) '打开 扫雷 进程
If pMine = 0 Then
Call MsgBox("你还没有打开扫雷吧:)", vbInformation, "找不到哦")
RunMine
Exit Sub
End If
nSize = 1
'ReDim lpBuffer(nSize - 1)
If ReadProcessMemory(pMine, miBegin, lpBuffer, nSize, lpNumberOfBytesRead) Then '进程句柄,内存区基址,数据缓冲区,要读的字节数,已读字节数
Me.Caption = "共有雷数 " + CStr(lpBuffer) + " 个"
MineNum = lpBuffer
End If
If ReadProcessMemory(pMine, miWidth, lpBuffer, nSize, lpNumberOfBytesRead) Then
mWidth = lpBuffer '雷区宽度,即 扫雷 的列数
End If
If ReadProcessMemory(pMine, miHeight, lpBuffer, nSize, lpNumberOfBytesRead) Then
mHeight = lpBuffer '雷区高度,即 扫雷 的行数
End If

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧