请教vb.net如何获取进程模块基址

qq_33929570 2017-07-04 01:49:51
本人新学vs,特来请教
...全文
735 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33929570 2017-08-05
  • 打赏
  • 举报
回复
因以上代码不完善的原因,请管理员帮忙删掉此贴。
qq_33929570 2017-08-04
  • 打赏
  • 举报
回复
这问题问了这么久都没人回答,吃惊ing。经过自己网上查资料和研究,知道了一个方法,我列出来。方便给网上搜索这个问题的同学们一起参考。虽然这种方法不太专业,也总聊胜于无。(百度搜索这个问题,搜索结果这里是第一个,其余的都看得我抓不到重点。)我用的是vb2010版,网上搜索了一下关于vb2010获取远程进程模块基址的方法,答案是找不到

网上很多教程都很专业,但是对于初学者来说像天书。所以我用傻瓜都会看得懂的方法写一下。

首先新建1个form1,在form1上增加一个listbox1和一个listbox2和一个textbox1和一个button1,就这4个控件即可,以下就是代码。我用win7的自带的计算器举例。以下为代码


Public Class Form1
Public zj
Public myProcesses() As Process
Public myProcess As Process

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

ListBox1.Items.Clear()‘这里是把系统里所有运行中的进程都显示并列表出来
myProcesses = Process.GetProcesses()
For Each Me.myProcess In myProcesses
ListBox1.Items.Add(myProcess.ProcessName)
Next

Dim I, dl As Integer
For I = 0 To ListBox1.Items.Count - 1
If ListBox1.Items(I) = "calc" Then‘我举例的是win7计算器的进程名(“exe”不用写),这种方法是过滤字符串的方法,把listbox1出现的想要的模块的名字加入listbox2,再在listbox2进行操作。有需要就自己改改这里就可以了。其余地方不用改。

dl = (I + 1)
End If
Next

ListBox2.Items.Clear()
Dim zha
zha = myProcesses(dl - 1).Modules.Count
ListBox2.Items.Add(myProcesses(dl - 1).Modules(0).FileName)

Dim f
f = myProcesses(dl - 1).Modules.Count

TextBox1.Text = Hex(myProcesses(dl - 1).Modules(0).BaseAddress.ToString())’这里我用了textbox1显示指定模块的16进制基址。

End Sub
End Class

’最后说说如果没有运行你所想要得出模块基址的程序而运行此代码,会出问题。解决方法就留给大家自己去弄。不难。
qq_33929570 2017-08-04
  • 打赏
  • 举报
回复
顺便把VB6的获取exe基址方法也写在这里,懒得找来找去 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
'此代码为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

'此代码还有许多不足之处,请莫喷

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧