搜索内存数据(三)

 
  1. Option Base 1
  2. Option Explicit
  3. Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
  4. Private Const PAGE_READWRITE = 
  5. Private Const MEM_COMMIT = 
  6. Private Type MEMORY_BASIC_INFORMATION
  7.     BaseAddress As Long
  8.     AllocationBase As Long
  9.     AllocationProtect As Long
  10.     RegionSize As Long
  11.     State As Long
  12.     Protect As Long
  13.     lType As Long
  14. End Type
  15. Private Declare Function VirtualQueryEx Lib "kernel32" (ByVal hProcess As LongByVal lpAddress As Long, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As LongAs Long
  16. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  17. Private Declare Function DebugActiveProcess Lib "kernel32" (ByVal dwProcessId As LongAs Long
  18. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As StringByVal lpWindowName As StringAs Long
  19. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As LongAs Long
  20. Private Const TH32CS_SNAPPROCESS As Long = 
  21. Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As LongByVal lProcessID As LongAs Long
  22. Private Const MAX_PATH As Integer = 260
  23. Private Type PROCESSENTRY32
  24.     dwSize As Long
  25.     cntusage As Long
  26.     th32ProcessID As Long           ' this process
  27.     th32DefaultHeapID As Long
  28.     th32ModuleID As Long            ' associated exe
  29.     cntThreads As Long
  30.     th32ParentProcessID As Long     ' this process's parent process
  31.     pcPriClassBase As Long          ' Base priority of process's threads
  32.     dwFlags As Long
  33.     szExeFile As String * MAX_PATH  ' Path
  34. End Type
  35. Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
  36. Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
  37. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As LongAs Long
  38. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As LongByVal bInheritHandle As LongByVal dwProcessId As LongAs Long
  39. Private Const PROCESS_VM_READ As Long = &H10                    '允许读目标进程
  40. Private Const PROCESS_QUERY_INFORMATION As Long = &H400         '允许查询内存状态
  41. Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFFF            '允许完全控制目标进程
  42. Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As LongAs Long
  43. Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, lphModule As Any, ByVal cb As Long, lpcbNeeded As LongAs Boolean
  44. Private Declare Function GetModuleFileNameEx Lib "psapi" Alias "GetModuleFileNameExA" (ByVal hProcess As LongByVal hModule As LongByVal lpFilename As StringByVal nSize As LongAs Long
  45. Sub Main()
  46.     Dim s As String
  47.     Dim b() As Byte
  48.     Dim nLen As Long
  49.      
  50.     s = "1234567890"
  51.     nLen = Len(s) * 2
  52.     ReDim b(nLen) As Byte
  53.     CopyMemory b(1), ByVal StrPtr(s), nLen
  54.      
  55.     Call Search(b, GetCurrentProcessId())
  56. End Sub
  57. Public Sub Search(byteData() As ByteOptional p_ID As Long = 0, Optional szWindowText As String = ""Optional ByVal lpStart As Long = &H100000, Optional lpEnd As Long = &H7FFFFFFF)
  58.     Dim hWnd As Long                                                '窗口句柄
  59.     Dim hProcessID As Long                                          '进程ID
  60.     Dim hProcessSnapShot As Long                                    '进程快照句柄
  61.     Dim szModuleName As String                                      '进程模块名称
  62.     Dim bSuccessHup As Boolean                                      '进程挂起标志
  63.     Dim bFoundProcess As Boolean                                    '进程查找标志
  64.     Dim stProcess As PROCESSENTRY32                                 '进程信息结构
  65.     '判断进程句柄是否存在,如果不存在,则查找进程
  66.     If p_ID > 0 Then                                            '如果直接指定了要查找的目标进程的ID
  67.         hProcessID = p_ID
  68.     Else
  69.         If Len(szWindowText) > 0 Then                           '如果指定了窗口名称
  70.             hWnd = FindWindow(vbNullString, szWindowText)
  71.             If hWnd = 0 Then Exit Sub
  72.             GetWindowThreadProcessId hWnd, hProcessID
  73.         End If
  74.     End If
  75.     If hProcessID > 0 Then                                      '查找特定的进程
  76.         Call fnSearch(byteData, hProcessID, lpStart, lpEnd)
  77.     Else                                                        '查找所有进程
  78.         stProcess.dwSize = Len(stProcess)
  79.         hProcessSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
  80.         bFoundProcess = Process32First(hProcessSnapShot, stProcess)
  81.         Do While bFoundProcess
  82.             hProcessID = stProcess.th32ProcessID
  83.             szModuleName = Left(stProcess.szExeFile, InStr(stProcess.szExeFile, vbNullChar) - 1)
  84.             Call fnSearch(byteData, hProcessID, lpStart, lpEnd)
  85.             bFoundProcess = Process32Next(hProcessSnapShot, stProcess)
  86.         Loop
  87.         CloseHandle hProcessSnapShot
  88.     End If
  89. End Sub
  90. Private Function fnSearch(byteData() As ByteByVal p_ID As LongByVal lpStart As LongByVal lpEnd As Long)
  91.     Dim hProcess As Long
  92.                '进程句柄
  93.     Dim lpBaseAddress As Long
  94.     Dim bSuccess As Boolean
  95.     Dim MBI As MEMORY_BASIC_INFORMATION
  96.     Dim lRet As Long                                                '用于接收API返回值
  97.     Dim mbiSize As Long, bSize As Long, dwNeeded As Long
  98.     Dim lpMBI As Long, lpByte As Long
  99.     Dim lpBuffer() As Byte                                          '内存缓冲区指针
  100.     Dim lpszFileName As String                                      '进程模块名称数组
  101.      
  102.     lpBaseAddress = lpStart
  103.     mbiSize = Len(MBI)
  104.     bSize = UBound(byteData)
  105.      
  106.     hProcess = OpenProcess(PROCESS_VM_READ Or PROCESS_QUERY_INFORMATION, False, p_ID)
  107.     If hProcess = 0 Then Exit Function
  108.      
  109.     lpszFileName = String(MAX_PATH, vbNullChar)                     '取完整的进程模块名称
  110.     If GetModuleFileNameEx(hProcess, ByVal 0&, lpszFileName, MAX_PATH) Then
  111.         lpszFileName = Left(lpszFileName, InStr(lpszFileName, vbNullChar) - 1)
  112.     End If
  113.     lRet = VirtualQueryEx(hProcess, lpBaseAddress, MBI, mbiSize)
  114.      
  115.     Do While ((lRet > 0) And (lpBaseAddress < lpEnd))
  116.         If (MBI.Protect And PAGE_READWRITE) And (MBI.State = MEM_COMMIT) Then
  117.             ReDim lpBuffer(MBI.RegionSize)
  118.             ReadProcessMemory hProcess, ByVal MBI.BaseAddress, lpBuffer(1), MBI.RegionSize, 0
  119.             For lpMBI = 1 To MBI.RegionSize - bSize
  120.                 For lpByte = 1 To bSize
  121.                     bSuccess = (lpBuffer(lpMBI + lpByte) = byteData(lpByte))
  122.                     If Not bSuccess Then Exit For
  123.                 Next
  124.                 If bSuccess Then    '找到目标内容
  125.                     Debug.Print "找到目标内容,进程文件:", lpszFileName, "地址:", MBI.BaseAddress + lpMBI
  126.                 End If
  127.             Next
  128.         End If
  129.         lpBaseAddress = lpBaseAddress + MBI.RegionSize
  130.         lRet = VirtualQueryEx(hProcess, lpBaseAddress, MBI, mbiSize)
  131.         DoEvents
  132.     Loop
  133.     CloseHandle hProcess
  134. End Function
  135. Private Function fnSearch1(byteData() As ByteByVal p_ID As LongByVal lpStart As LongByVal lpEnd As Long)
  136.     Dim hProcess As Long                                            '进程句柄
  137.     Dim lpBaseAddress As Long
  138.     Dim bSuccess As Boolean
  139.     Dim MBI As MEMORY_BASIC_INFORMATION
  140.     Dim lRet As Long
  141.     '用于接收API返回值
  142.     Dim mbiSize As Long, bSize As Long, dwNeeded As Long
  143.     Dim lpMBI As Long, lpByte As Long
  144.     Dim lpMemBuffer() As Long                                       '内存缓冲区指针
  145.     Dim lpDataBuffer() As Long                                      '要查找的字符串缓冲区指针
  146.     Dim lpszFileName As String                                      '进程模块名称数组
  147.      
  148.     lpBaseAddress = lpStart
  149.     mbiSize = Len(MBI)
  150.     bSize = UBound(byteData)
  151.     bSize = (bSize / 4) + IIf((bSize Mod 4) <> 0, 1, 0)
  152.     ReDim lpDataBuffer(bSize)
  153.     CopyMemory lpDataBuffer(1), byteData(1), UBound(byteData)
  154.      
  155.     hProcess = OpenProcess(PROCESS_VM_READ Or PROCESS_QUERY_INFORMATION, False, p_ID)
  156.     If hProcess = 0 Then Exit Function
  157.      
  158.     lpszFileName = String(MAX_PATH, vbNullChar)                     '取完整的进程模块名称
  159.     If GetModuleFileNameEx(hProcess, ByVal 0&, lpszFileName, MAX_PATH) Then
  160.         lpszFileName = Left(lpszFileName, InStr(lpszFileName, vbNullChar) - 1)
  161.     End If
  162.     lRet = VirtualQueryEx(hProcess, lpBaseAddress, MBI, mbiSize)
  163.      
  164.     Do While ((lRet > 0) And (lpBaseAddress < lpEnd))
  165.         If (MBI.Protect And PAGE_READWRITE) And (MBI.State = MEM_COMMIT) Then
  166.             ReDim lpMemBuffer(MBI.RegionSize)
  167.             ReadProcessMemory hProcess, ByVal MBI.BaseAddress, lpMemBuffer(1), MBI.RegionSize, 0
  168.             For lpMBI = 1 To (MBI.RegionSize / 4 - bSize)
  169.                 For lpByte = 1 To bSize
  170.                     bSuccess = (lpMemBuffer(lpMBI + lpByte) = lpDataBuffer(lpByte))
  171.                     If Not bSuccess Then Exit For
  172.                 Next
  173.                 If bSuccess Then    '找到目标内容
  174.                     Debug.Print "找到目标内容,进程文件:", lpszFileName, "地址:", MBI.BaseAddress + lpMBI * 4
  175.                 End If
  176.             Next
  177.         End If
  178.         lpBaseAddress = lpBaseAddress + MBI.RegionSize
  179.         lRet = VirtualQueryEx(hProcess, lpBaseAddress, MBI, mbiSize)
  180.         DoEvents
  181.     Loop
  182.     CloseHandle hProcess
  183. End Function
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DEBUG命令详解 参数 搜索 跟踪 反汇编 写入 分配扩展内存 释放扩展内存 直接将 8086/8087/8088 记忆码合并到内存。 该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。 a [address] 参数 address 指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。 有关将数据输入到指定字节中的信息,请参看Debug E(键入)。 有关反汇编字节的信息,请参看Debug U(反汇编) 说明 使用记忆码 段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。 汇编跳转和调用 汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示: -a0100:0500 0100:0500 jmp 502 ; a 2-byte short jump 0100:0502 jmp near 505 ; a 3-byte near jump 0100:0505 jmp far 50a ; a 5-byte far jump 可以将 near 前缀缩写为 ne。 区分字和字节内存位置 当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式: dec wo [si] neg byte ptr [128] 指定操作数 Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式: mov ax,21 ; load AX with 21h mov ax,[21] ; load AX with the ; contents of ; memory location 21h 使用伪指令 使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例: db 1,2,3,4,"THIS IS AN EXAMPLE" db 'THIS IS A QUOTATION MARK:"' db "THIS IS A QUOTATION MARK:'" dw 1000,2000,3000,"BACH"

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值