首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

怎么取得EXE文件的物理内存起始地址

2012-03-26 
如何取得EXE文件的物理内存起始地址?VB codeOption ExplicitPrivate Const STANDARD_RIGHTS_REQUIRED &H

如何取得EXE文件的物理内存起始地址?

VB code
Option ExplicitPrivate Const STANDARD_RIGHTS_REQUIRED = &HF0000Private Const SYNCHRONIZE = &H100000Private Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongPrivate Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)Private Sub Command1_Click()    Dim strP As String    Dim lngStartAdd As Long     '进程内存起始地址    Dim lngWindowHwnd As Long         '进程句柄    Dim lngPID As Long    Dim lngP As Long    Dim lngProcessHwnd As Long    Dim strValue As String * 20On Error GoTo errSub    lngStartAdd = LoadLibrary("c:\windows\system32\calc.exe")       '读取软件内存起始地址    lngWindowHwnd = FindWindow(vbNullString, "计算器")                    '找到窗口句柄    lngP = GetWindowThreadProcessId(lngWindowHwnd, lngPID)                '取得进程PID    lngProcessHwnd = OpenProcess(PROCESS_ALL_ACCESS, False, lngPID)           '读取进程句柄    lngP = ReadProcessMemory(lngProcessHwnd, lngStartAdd, strValue, 20, ByVal 0)    Exit SuberrSub:End Sub


我通过这段代码想查看一下计算器的内存地址的值,lngStartAdd、lngWindowHwnd、lngProcessHwnd都能取得,但就是ReadProcessMemory失败!返回值lngP=0。 我仔细查阅了ReadProcessMemory的使用方法,觉得没有错误。

现在我怀疑我的lngStartAdd的读取有问题,百度了一下,并没有找到如何读取exe的起始地址的方法。不知道我的读取内存起始地址的方法是否正确?
lngStartAdd = LoadLibrary("c:\windows\system32\calc.exe") '读取软件内存起始地址

[解决办法]
LoadLibrary是取得载入的DLL的内存基址,至于能否取得EXE的基址,这个不知道了。
[解决办法]
怎么没有定义结构 MEMORY_BASIC_INFORMATION
参考一下下面地址的读取或写入指定地址lAddr的函数ReadWriteMemory:http://topic.csdn.net/u/20110329/10/78f7baa9-d526-4a6f-8e23-6141d9bb76d3.html
[解决办法]
lngProcessHwnd 名字应该叫ProcessHandle,hwnd是窗口句柄的意思(handle of window)

物理内存的起始地址需要读页表,不是能够在用户模式办得到的,而且它也不一定存在于物理内存

可以得到虚拟地址,使用EnumProcessModules
[解决办法]
ReadProcessMemory用的是虚拟地址,如果要得到物理地址,编写驱动程序读取对应的页表项
[解决办法]
windows使用扁平寻址模式,你平常所说的内存地址都是指虚拟地址,很少直接用到物理地址
[解决办法]
api 声明改成这样就行了:

VB code
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long,byval  lpBaseAddress As long,byval lpBuffer As string, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
[解决办法]
探讨
引用:
什么意思

就是找到鲁大师这个软件中,CPU温度的存储地址。。

[解决办法]
这个应该用了驱动程序,你去看一下有无sys文件
------解决方案--------------------


这个的确不是那么容易的事情,需要和底层打交道。
和底层打交道当然是汇编最好了,但汇编对于绝大多数人来说是很难的

如果真的能找到这个“地址”,即便是物理地址 使用象WinIo.dll或inpout.dll是能够完成这个任务的。

难度不小啊。

既然要借用鲁大师,考虑一下图片验证,它的图形规则。做起来成功率应该比较高。

热点排行