找回密码
 加入
搜索
查看: 7577|回复: 11

[AU3基础] 请教autoit如何获取dll进程基址?

  [复制链接]
发表于 2011-9-1 12:00:25 | 显示全部楼层 |阅读模式
本帖最后由 yd111070 于 2011-9-1 13:14 编辑

想读出一个程序中的一段数据,首先用ce定位,查到数据放的地址是“0136b738”,双击后弹出对话框中写着"GlobalData.dll+1B738"。
前一个“0136b738”地址,每次重启程序都会变化,应该不是我要的。
后一个"GlobalData.dll+1B738",每次重启程序后,用ce重新指向此程序,便会自动指向我要的数据。
所以我想,后一个"GlobalData.dll+1B738"地址才是我要的。
下面要做的也就是想办法获得每次程序运行时,GlobalData.dll的基址,可是找了好几天资料,就是查不到有什么方法可以获得GlobalData.dll的基址,请大家帮帮忙,非常感谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-9-1 12:09:56 | 显示全部楼层
简单一点,自身载入一次就可以获得地址.不过可能准确性不能达到100%
复杂点,历遍该进程的模块,名称为指定的DLL则取址.
发表于 2011-9-1 13:28:00 | 显示全部楼层
如果是Au3自身进程加载了GlobalData.dll,可以用Kernel32.dll中的GetModuleHandle获取 GlobalData.dll的基址。如果是其他进程加载,调用Psapi.dll中的EnumProcessModules枚举所有加载的模块,配合调用GetModuleFileNameEx获取模块名称。
 楼主| 发表于 2011-9-1 13:41:53 | 显示全部楼层
如果是Au3自身进程加载了GlobalData.dll,可以用Kernel32.dll中的GetModuleHandle获取 GlobalData.dll的基址 ...
pusofalse 发表于 2011-9-1 13:28


版主你好,感谢热心回复。
是有其他程序加载GlobalData.dll,我要用autoit做的就是简单的读出这个软件中的一个数据。
经过ce的搜索,这个数据每次都是在GlobalData.dll这个地址加上1B738的偏移量。
所以我现在很苦恼,因为我不会找出GlobalData.dll的地址。。。
我在autoit的帮助并没有找到你说的EnumProcessModules函数,能否展开说明一下,我实在是没办法了。
有没有现成的函数,可以我把dll的名字作为参数输入,直接就返回这个dll的基址啊?
如果我问外行请不要见笑,一个星期前对这一切还一无所知。。。
 楼主| 发表于 2011-9-1 13:44:15 | 显示全部楼层
简单一点,自身载入一次就可以获得地址.不过可能准确性不能达到100%
复杂点,历遍该进程的模块,名称为指定的 ...
ceoguang 发表于 2011-9-1 12:09

版主你好,感谢回复。
能否将用到的相关函数名告诉我一下,我好去查帮助文档。
谢谢。
发表于 2011-9-1 14:06:55 | 显示全部楼层
回复 4# yd111070

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

EnumProcessModules
GetModuleFileNameEx

记得在UDF区 有这两个函数的示例,自己搜吧。
发表于 2011-9-1 16:13:38 | 显示全部楼层
版主你好,感谢回复。
能否将用到的相关函数名告诉我一下,我好去查帮助文档。
谢谢。
yd111070 发表于 2011-9-1 13:44

3#说得很清楚了.
发表于 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[0] Then
            $hProcess = $hProcess[0]
        EndIf
    EndIf
    
    ;EnumProcessModules
    Local   $Modules = DllStructCreate("ptr[1024]")
    Local   $aCall = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $hProcess, "ptr", DllStructGetPtr($Modules), "dword", DllStructGetSize($Modules), "dword*", 0)
    If $aCall[4] > 0 Then
        Local   $iModnum = $aCall[4] / 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[3] = $sModule Then
                DllClose($PSAPI)
                Return Ptr(DllStructGetData($Modules, 1, $i))
            EndIf
        Next
    EndIf
    
    DllClose($PSAPI)
    Return SetError(-1, 0, 0)
    
EndFunc
发表于 2011-9-5 16:50:52 | 显示全部楼层
感谢楼上所有大侠的无私分享!
 楼主| 发表于 2011-9-5 17:48:28 | 显示全部楼层
回复  pusofalse
unique009 发表于 2011-9-3 21:07


真是非常感谢,对我帮助非常大!!!
祝你开心快乐每一天!
发表于 2011-9-5 19:08:44 | 显示全部楼层
GlobalData.dll这个文件就我所知是金仕达的,期货的
发表于 2011-9-5 19:13:06 | 显示全部楼层
估计楼主想做自动交易
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-10 22:41 , Processed in 0.083946 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表