关于VB对内存数据搜索!
小弟,想用VB 写一个 找到指定数据的内存地址(找到应用程序进程这些都已经明白,关键是如何搜索这段内存来确定数据在虚拟内存中的地址。) 类似FPE等个工具的搜索功能
关键之处 不是很明白望有这方面经验的朋友能详细解释下,万分感激!
问题点数:100、回复次数:13Top
1 楼xbingboy(新月浪子)回复于 2003-09-04 13:44:10 得分 0
顶哦!请各位高手指教一下!Top
2 楼ww94307(外星人)回复于 2003-09-04 13:55:56 得分 0
upTop
3 楼rainstormmaster(暴风雨 v2.0)回复于 2003-09-04 21:51:05 得分 40
Public lngHwnd As Long '程序句柄
Public pHandle As Long '进程句柄
Public pId As Long ' 进程标志
Public Const PROCESS_ALL_ACCESS = 2035711
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
lngHwnd = GetHwnd("NeoRAGEx Emulator")
GetWindowThreadProcessId lngHwnd, pId
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pId)
'*****************************
'根据窗体部分名称取得句柄
'*****************************
Public Function GetHwnd(strWinText As String) As Long
Dim l As Long, k As Long, rlt As Long
Dim strLen As Long
Dim str As String * 255
l = GetForegroundWindow
l = GetWindow(l, GW_HWNDFIRST)
Do Until l = 0
strLen = SendMessage(l, WM_GETTEXTLENGTH, 0, 0&)
If strLen <> 0 Then
rlt = SendMessage(l, WM_GETTEXT, strLen + 1, ByVal str)
If Mid(str, 1, Len(strWinText)) = strWinText Then
GetHwnd = l
End If
End If
l = GetWindow(l, GW_HWNDNEXT)
Loop
End Function
'**************************************
'从内存指定位置读取数据
'**************************************
Public Function ReadMem(MemAddress As Long) As Long
Dim lngRlt As Long
Dim l As Long
If pHandle <> 0 Then
lngRlt = ReadProcessMemory(pHandle, MemAddress, ByVal VarPtr(l), 2, 0&)
ReadMem = l
Else
ReadMem = 0
End If
End Function
'**************************************
'把数据写入内存
'**************************************
Public Sub WriteMem(MemAddress As Long, val As Long)
Dim lngRlt As Long
Dim l As Long
l = val
lngRlt = WriteProcessMemory(pHandle, MemAddress, ByVal VarPtr(l), 2, 0&)
End Sub
Top
4 楼rainstormmaster(暴风雨 v2.0)回复于 2003-09-04 21:53:46 得分 20
http://vip.6to23.com/NowCan1/tech/VirtualQ.htmTop
5 楼bu_wen(不文)回复于 2003-09-04 22:50:28 得分 20
获取了进程PId,打开了进程..
然后的事情就是用ReadProcessMemory循环读取一段地址的内容,和你想得到的值做比对啊..
如果相=,这时候的地址便可能是你需要找的地址,当然你可能会获取好几个,所以要不段的筛选Top
6 楼James0001(虾米—什么时候成大虾?)回复于 2003-09-05 06:56:39 得分 20
搜索 &H00000000& 到 &H7FFFFFFF& 这段区域。Top
7 楼xbingboy(新月浪子)回复于 2003-09-05 11:28:13 得分 0
谢谢大家的帮忙 ,已经有基本的思路了
但详细处还是不是很明白 打个比方
我要找2a7d01这个16进制数据的地址 该如何写这段代码?
谢谢各位的帮忙了!Top
8 楼jlum99(闲人)回复于 2003-09-05 11:36:36 得分 0
注意高低位的顺序,其他还能有什么??Top
9 楼jlum99(闲人)回复于 2003-09-05 11:38:38 得分 0
得到进程的内存空间使用情况,一个范围.然后打开.搜索.Top
10 楼xbingboy(新月浪子)回复于 2003-09-05 17:25:59 得分 0
先把内存数据读出 然后比较?!
但一次读出多少呢?全部读出 还是分段读出?Top
11 楼xbingboy(新月浪子)回复于 2003-09-05 17:28:25 得分 0
比如2a7d01这个数据要比较?!
我一次从内存中怎么读数据好一点/1?Top
12 楼Gelim(Gelim)回复于 2003-09-06 01:04:37 得分 0
upTop
13 楼xbingboy(新月浪子)回复于 2003-09-06 14:45:18 得分 0
问题解决了!
但就是搜索速度太慢 不敢大范围的搜索!Top




