16,553
社区成员
发帖
与我相关
我的任务
分享
'此代码为VB6 通过程序窗体名称直接获取该程序的exe模块基址(只对32位exe程序生效)
'在form1 上添加 4个控件,分别为 text1,text2,text3,command1 即可
Option Explicit
'以下为获取指定模块基址声明
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'以下为获取进程PID声明
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Dim Hwd As Long
Dim PID As Long
'以下为获取模块信息快照
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule As String * 256
szExePath As String * 1024
End Type
'以下为定义获取模块基址的表达式
Public Function GetModuleAdd(PID As Long, ModuleName As String) As Long
Dim m As MODULEENTRY32
Dim k As Long
k = CreateToolhelp32Snapshot(8, PID)
m.dwSize = Len(m)
Module32First k, m
GetModuleAdd = m.modBaseAddr
If PID = 0 Then
GetModuleAdd = 0
End If
CloseHandle (k)
End Function
'以下为用控件把exe模块基址值与进程pid值显示出来,本人用win7的32位 windows media player 程序作示范
Private Sub Command1_Click()
PID = 0 '为确保当前pid数值的准确度先清零之前的进程数值
Hwd = FindWindow((vbNullString), Text1.Text)
'在text1输入你想要找基址的程序的运行窗口名称,例如我想要找win7的wmplayer.exe (即windows media player程序)运行后
'的基址,就先运行wmplayer.exe,再把wmplayer运行后的窗口名称" Windows Media Player "输入 text1 里面,再按
'command1既可。如想直接用代码实现效果,请把以上代码改为 Hwd = FindWindow((vbNullString), "Windows Media Player")
'(对64位的exe程序无效)
GetWindowThreadProcessId Hwd, PID ‘'获pid值
Text2.Text = "程序进程PID= " & Hex(PID) '显示16进制进程PID数值
Text3.Text = "程序exe模块基址= " & Hex(GetModuleAdd(PID, "")) '显示16进制exe模块基址值"
End Sub
'此代码还有许多不足之处,请莫喷