请教autoit如何获取dll进程基址?
本帖最后由 yd111070 于 2011-9-1 13:14 编辑想读出一个程序中的一段数据,首先用ce定位,查到数据放的地址是“0136b738”,双击后弹出对话框中写着"GlobalData.dll+1B738"。
前一个“0136b738”地址,每次重启程序都会变化,应该不是我要的。
后一个"GlobalData.dll+1B738",每次重启程序后,用ce重新指向此程序,便会自动指向我要的数据。
所以我想,后一个"GlobalData.dll+1B738"地址才是我要的。
下面要做的也就是想办法获得每次程序运行时,GlobalData.dll的基址,可是找了好几天资料,就是查不到有什么方法可以获得GlobalData.dll的基址,请大家帮帮忙,非常感谢。
简单一点,自身载入一次就可以获得地址.不过可能准确性不能达到100%
复杂点,历遍该进程的模块,名称为指定的DLL则取址. 如果是Au3自身进程加载了GlobalData.dll,可以用Kernel32.dll中的GetModuleHandle获取 GlobalData.dll的基址。如果是其他进程加载,调用Psapi.dll中的EnumProcessModules枚举所有加载的模块,配合调用GetModuleFileNameEx获取模块名称。 如果是Au3自身进程加载了GlobalData.dll,可以用Kernel32.dll中的GetModuleHandle获取 GlobalData.dll的基址 ...
pusofalse 发表于 2011-9-1 13:28 http://autoitx.com/images/common/back.gif
版主你好,感谢热心回复。
是有其他程序加载GlobalData.dll,我要用autoit做的就是简单的读出这个软件中的一个数据。
经过ce的搜索,这个数据每次都是在GlobalData.dll这个地址加上1B738的偏移量。
所以我现在很苦恼,因为我不会找出GlobalData.dll的地址。。。
我在autoit的帮助并没有找到你说的EnumProcessModules函数,能否展开说明一下,我实在是没办法了。
有没有现成的函数,可以我把dll的名字作为参数输入,直接就返回这个dll的基址啊?
如果我问外行请不要见笑,一个星期前对这一切还一无所知。。。 简单一点,自身载入一次就可以获得地址.不过可能准确性不能达到100%
复杂点,历遍该进程的模块,名称为指定的 ...
ceoguang 发表于 2011-9-1 12:09 http://autoitx.com/images/common/back.gif
版主你好,感谢回复。
能否将用到的相关函数名告诉我一下,我好去查帮助文档。
谢谢。 回复 4# yd111070
我说的那两个函数 帮助文档中找不到的,MSDN上有。
EnumProcessModules
GetModuleFileNameEx
记得在UDF区 有这两个函数的示例,自己搜吧。 版主你好,感谢回复。
能否将用到的相关函数名告诉我一下,我好去查帮助文档。
谢谢。
yd111070 发表于 2011-9-1 13:44 http://www.autoitx.com/images/common/back.gif
3#说得很清楚了. 回复 6# pusofalse
Func _MemoryModuleGetBaseAddress($iPID, $sModule)
If Not ProcessExists($iPID) Then Return SetError(1, 0, 0)
If Not IsString($sModule) Then Return SetError(2, 0, 0)
Local $PSAPI = DllOpen("psapi.dll")
;Get Process Handle
Local $hProcess
Local $PERMISSION = BitOR(0x0002, 0x0400, 0x0008, 0x0010, 0x0020) ; CREATE_THREAD, QUERY_INFORMATION, VM_OPERATION, VM_READ, VM_WRITE
If $iPID > 0 Then
Local $hProcess = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $iPID)
If $hProcess Then
$hProcess = $hProcess
EndIf
EndIf
;EnumProcessModules
Local $Modules = DllStructCreate("ptr")
Local $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
If $aCall > 0 Then
Local $iModnum = $aCall / 4
Local $aTemp
For $i = 1 To $iModnum
$aTemp =DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $hProcess, "ptr", Ptr(DllStructGetData($Modules, 1, $i)), "wstr", "", "dword", 260)
If $aTemp = $sModule Then
DllClose($PSAPI)
Return Ptr(DllStructGetData($Modules, 1, $i))
EndIf
Next
EndIf
DllClose($PSAPI)
Return SetError(-1, 0, 0)
EndFunc
感谢楼上所有大侠的无私分享! 回复pusofalse
unique009 发表于 2011-9-3 21:07 http://www.autoitx.com/images/common/back.gif
真是非常感谢,对我帮助非常大!!!
祝你开心快乐每一天! GlobalData.dll这个文件就我所知是金仕达的,期货的 估计楼主想做自动交易
页:
[1]