搜索内存数据(二)

该博客介绍了一个VB函数SearchMem,用于在进程中搜索特定内存数据。通过将搜索字符串转换为Byte数组,遍历内存区域并逐字节比较,找到匹配的数据。函数支持在可读取的已提交内存区域中查找,并返回匹配数据的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值