搜索内存数据(三)

来源:互联网 发布:彩票缩水软件大全 编辑:程序博客网 时间:2024/06/11 14:06
 
  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
原创粉丝点击