搜索内存数据(二)

来源:互联网 发布:彩票缩水软件大全 编辑:程序博客网 时间:2024/04/29 08:23
  1. Public Function SearchMem(hProcess As Long, strSearch As StringOptional spos As Long = &H400000) As Long
  2.     Dim i As Long, j As Long, count As Long, nLength As Long
  3.     Dim r As Long, mbi As MEMORY_BASIC_INFORMATION
  4.     Dim lpAddress As Long, ubs As Long, RSize As Long, lMax As Long
  5.     Dim bSearch() As Byte
  6.     Dim sp() As String
  7.     Dim lpBuffer() As Byte
  8.     Dim si As SYSTEM_INFO
  9.      
  10.     GetSystemInfo si
  11.     lMax = si.lpMaximumApplicationAddres
  12.  '将我们的搜索的内容转换成为一个Byte数组
  13.     '搜索支持数据串,每个数据用空格分开
  14.     sp = Split(strSearch, " ")
  15.     nLength = UBound(sp)
  16.     ReDim bSearch(nLength)
  17.     For i = 0 To nLength
  18.         bSearch(i) = Val("&H" & sp(i)) And &HFF '防止溢出错误
  19.     Next
  20.      
  21.     SearchMem = 0
  22.     lpAddress = spos     '以 10000 作为起点
  23.     ubs = UBound(bSearch)
  24.     bSearching = True
  25.     r = VirtualQueryEx(hProcess, lpAddress, mbi, Len(mbi))
  26.     '将7F000000作为搜索结束地址
  27.     Do While (r And (lpAddress < lMax) And bSearching)
  28.         DoEvents
  29.         '只搜索可读取的已提交的内存区域
  30.         If (mbi.Protect And PAGE_READWRITE) And (mbi.State = MEM_COMMIT) Then
  31.             RSize = mbi.RegionSize
  32.             ReDim lpBuffer(RSize - 1)
  33.             ReadProcessMemory hProcess, mbi.BaseAddress, lpBuffer(0), RSize, 0
  34.              
  35.             count = RSize - 1 - ubs
  36.             For i = 0 To count '防止越界
  37.                 DoEvents
  38.                 '逐个字节比较,如果有任何一个不相等,则不再比较其它
  39.                 For j = 0 To ubs
  40.                     DoEvents
  41.                     If bSearch(j) <> lpBuffer(i + j) Then GoTo 10
  42.                 Next
  43.                 '全部相等,返回地址
  44.                 bSearching = False
  45. '                Debug.Print Hex(i + lpAddress)
  46.                 SearchMem = i + lpAddress
  47.                 Exit Function
  48. 10:
  49.             Next
  50.         End If
  51.         lpAddress = lpAddress + RSize
  52.         r = VirtualQueryEx(hProcess, lpAddress, mbi, Len(mbi))
  53.     Loop
  54.     bSearching = False
  55.     SearchMem = 0
  56. End Function
 
原创粉丝点击