- Public Function SearchMem(hProcess As Long, strSearch As String, Optional spos As Long = &H400000) As Long
- Dim i As Long, j As Long, count As Long, nLength As Long
- Dim r As Long, mbi As MEMORY_BASIC_INFORMATION
- Dim lpAddress As Long, ubs As Long, RSize As Long, lMax As Long
- Dim bSearch() As Byte
- Dim sp() As String
- Dim lpBuffer() As Byte
- Dim si As SYSTEM_INFO
- GetSystemInfo si
- lMax = si.lpMaximumApplicationAddres
- '将我们的搜索的内容转换成为一个Byte数组
- '搜索支持数据串,每个数据用空格分开
- sp = Split(strSearch, " ")
- nLength = UBound(sp)
- ReDim bSearch(nLength)
- For i = 0 To nLength
- bSearch(i) = Val("&H" & sp(i)) And &HFF '防止溢出错误
- Next
- SearchMem = 0
- lpAddress = spos '以 10000 作为起点
- ubs = UBound(bSearch)
- bSearching = True
- r = VirtualQueryEx(hProcess, lpAddress, mbi, Len(mbi))
- '将7F000000作为搜索结束地址
- Do While (r And (lpAddress < lMax) And bSearching)
- DoEvents
- '只搜索可读取的已提交的内存区域
- If (mbi.Protect And PAGE_READWRITE) And (mbi.State = MEM_COMMIT) Then
- RSize = mbi.RegionSize
- ReDim lpBuffer(RSize - 1)
- ReadProcessMemory hProcess, mbi.BaseAddress, lpBuffer(0), RSize, 0
- count = RSize - 1 - ubs
- For i = 0 To count '防止越界
- DoEvents
- '逐个字节比较,如果有任何一个不相等,则不再比较其它
- For j = 0 To ubs
- DoEvents
- If bSearch(j) <> lpBuffer(i + j) Then GoTo 10
- Next
- '全部相等,返回地址
- bSearching = False
- ' Debug.Print Hex(i + lpAddress)
- SearchMem = i + lpAddress
- Exit Function
- 10:
- Next
- End If
- lpAddress = lpAddress + RSize
- r = VirtualQueryEx(hProcess, lpAddress, mbi, Len(mbi))
- Loop
- bSearching = False
- SearchMem = 0
- End Function
搜索内存数据(二)
最新推荐文章于 2025-05-29 09:53:36 发布