yd111070 发表于 2011-9-1 12:00:25

请教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的基址,请大家帮帮忙,非常感谢。

ceoguang 发表于 2011-9-1 12:09:56

简单一点,自身载入一次就可以获得地址.不过可能准确性不能达到100%
复杂点,历遍该进程的模块,名称为指定的DLL则取址.

pusofalse 发表于 2011-9-1 13:28:00

如果是Au3自身进程加载了GlobalData.dll,可以用Kernel32.dll中的GetModuleHandle获取 GlobalData.dll的基址。如果是其他进程加载,调用Psapi.dll中的EnumProcessModules枚举所有加载的模块,配合调用GetModuleFileNameEx获取模块名称。

yd111070 发表于 2011-9-1 13:41:53

如果是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的基址啊?
如果我问外行请不要见笑,一个星期前对这一切还一无所知。。。

yd111070 发表于 2011-9-1 13:44:15

简单一点,自身载入一次就可以获得地址.不过可能准确性不能达到100%
复杂点,历遍该进程的模块,名称为指定的 ...
ceoguang 发表于 2011-9-1 12:09 http://autoitx.com/images/common/back.gif
版主你好,感谢回复。
能否将用到的相关函数名告诉我一下,我好去查帮助文档。
谢谢。

pusofalse 发表于 2011-9-1 14:06:55

回复 4# yd111070

我说的那两个函数 帮助文档中找不到的,MSDN上有。

EnumProcessModules
GetModuleFileNameEx

记得在UDF区 有这两个函数的示例,自己搜吧。

ceoguang 发表于 2011-9-1 16:13:38

版主你好,感谢回复。
能否将用到的相关函数名告诉我一下,我好去查帮助文档。
谢谢。
yd111070 发表于 2011-9-1 13:44 http://www.autoitx.com/images/common/back.gif
3#说得很清楚了.

unique009 发表于 2011-9-3 21:07:03

回复 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


lzmyst 发表于 2011-9-5 16:50:52

感谢楼上所有大侠的无私分享!

yd111070 发表于 2011-9-5 17:48:28

回复pusofalse
unique009 发表于 2011-9-3 21:07 http://www.autoitx.com/images/common/back.gif

真是非常感谢,对我帮助非常大!!!
祝你开心快乐每一天!

unique009 发表于 2011-9-5 19:08:44

GlobalData.dll这个文件就我所知是金仕达的,期货的

unique009 发表于 2011-9-5 19:13:06

估计楼主想做自动交易
页: [1]
查看完整版本: 请教autoit如何获取dll进程基址?