manlty 发表于 2010-9-17 02:05:24

如何算出一个程序的某数据所在的内存地址?菜鸟求助高手

需要基址?图中基址在每次运行程序的时候都不同的,如何算?

manlty 发表于 2010-9-17 09:06:02

难道au3平台的短板正是在对第三方程序的内存操作上?

foboy 发表于 2010-9-17 17:10:09

这个不是靠算的,似乎应该是用基址加偏移量取得这个地址

manlty 发表于 2010-9-17 20:49:37

本帖最后由 manlty 于 2010-9-17 20:56 编辑

楼上朋友,au3的程序如何知道这个基址?基址也是变化的,每次运行该程序,分配的基址都不同

liufenglg 发表于 2010-9-18 16:45:29

希望知道结果..

ebhb 发表于 2010-9-18 19:13:34

基址需要自己用CE找的,你那个地址是基址加上偏移,不知道转了几层后才到这个地址。

ebhb 发表于 2010-9-18 19:14:46

给你一个基址应用例子,原来玩抗日时候找的。

ebhb 发表于 2010-9-18 19:15:29

;#Include <Memory.au3>
$CurProcID = ProcessExists("ClientGUI_r.exe") ; 取得PID供内存调用
$Handle = _MemoryOpen($CurProcID);使用UDF取得PID的内存操作句柄
MsgBox(0, "指南", $CurProcID)
MsgBox(0, "指南", $Handle)
$Address1=0x014e7684   ;基址--战斗状态
$Address1 = _MemoryRead("0x" & Hex($Address1+0x28), $Handle) ;读取基址数据
$Address1 = _MemoryRead("0x" & Hex($Address1+0x2c), $Handle) ;读取基址数据
$Address1 = _MemoryRead("0x" & Hex($Address1+0xa5), $Handle) ;读取基址数据

$Address2=0x018ccec4   ;红
$Address2 = _MemoryRead("0x" & Hex($Address2+0x34), $Handle)
$Address2 = _MemoryRead("0x" & Hex($Address2+0xe4), $Handle)

$Address3=0x018ccec4   ;最大红
$Address3 = _MemoryRead("0x" & Hex($Address3+0x34), $Handle)
$Address3 = _MemoryRead("0x" & Hex($Address3+0xdc), $Handle)

$Address4=0x018ccec4   ;兰
$Address4 = _MemoryRead("0x" & Hex($Address4+0x34), $Handle)
$Address4 = _MemoryRead("0x" & Hex($Address4+0xf8), $Handle)

$Address5=0x018ccec4   ;最大兰
$Address5 = _MemoryRead("0x" & Hex($Address5+0x34), $Handle)
$Address5 = _MemoryRead("0x" & Hex($Address5+0xf0), $Handle)
MsgBox(0, "指南", $Address5)

While 1
$zd = _MemoryRead("0x" & Hex($Address1), $Handle) ;获得战斗状态
$hy = _MemoryRead("0x" & Hex($Address2), $Handle)
$zdh = _MemoryRead("0x" & Hex($Address3), $Handle)
$ly = _MemoryRead("0x" & Hex($Address4), $Handle)
$zdl = _MemoryRead("0x" & Hex($Address5), $Handle)
If $zd=0 Then
if $hy<$zdh then
send("{f1}")
EndIf
if $ly<$zdl Then
        send("{f2}")
        EndIf
EndIf
sleep (1000)

Wend


Func _MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)
    If Not ProcessExists($iv_Pid) Then
      SetError(1)
      Return 0
    EndIf
    Local $ah_Handle =
    If @Error Then
      SetError(2)
      Return 0
    EndIf
    Local $av_OpenProcess = DllCall($ah_Handle, 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)
    If @Error Then
      DllClose($ah_Handle)
      SetError(3)
      Return 0
    EndIf
    $ah_Handle = $av_OpenProcess
    Return $ah_Handle
EndFunc

;=================================================================================================
Func _MemoryRead($iv_Address, $ah_Handle, $sv_Type = 'dword')
    If Not IsArray($ah_Handle) Then
      SetError(1)
      Return 0
    EndIf
    Local $v_Buffer = DllStructCreate($sv_Type)
    If @Error Then
      SetError(@Error + 1)
      Return 0
    EndIf
    DllCall($ah_Handle, 'int', 'ReadProcessMemory', 'int', $ah_Handle, 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
    If Not @Error Then
      Local $v_Value = DllStructGetData($v_Buffer, 1)
      Return $v_Value
    Else
      SetError(6)
      Return 0
    EndIf
EndFunc

;=================================================================================================
Func _MemoryClose($ah_Handle)
    If Not IsArray($ah_Handle) Then
      SetError(1)
      Return 0
    EndIf
    DllCall($ah_Handle, 'int', 'CloseHandle', 'int', $ah_Handle)
    If Not @Error Then
      DllClose($ah_Handle)
      Return 1
    Else
      DllClose($ah_Handle)
      SetError(2)
      Return 0
    EndIf
EndFunc
;=================================================================================================
Func _MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword')
If Not IsArray($ah_Handle) Then
SetError(1)
      Return 0
EndIf
Local $v_Buffer = DllStructCreate($sv_Type)
If @Error Then
SetError(@Error + 1)
Return 0
Else
DllStructSetData($v_Buffer, 1, $v_Data)
If @Error Then
   SetError(6)
   Return 0
EndIf
EndIf
DllCall($ah_Handle, 'int', 'WriteProcessMemory', 'int', $ah_Handle, 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If Not @Error Then
Return 1
Else
SetError(7)
      Return 0
EndIf
EndFunc

manlty 发表于 2010-9-19 01:26:51

基址需要自己用CE找的,你那个地址是基址加上偏移,不知道转了几层后才到这个地址。
ebhb 发表于 2010-9-18 19:13 http://www.autoitx.com/images/common/back.gif


我是尝试用CE查找,可能我太菜了吧,只能找到这个地方,1楼图中画红圈的那个是基址吧(也就是相当于你例子里的$adress1吧?)    不过每次运行这个程序,这个基址都是不同的!纠结中...高手能帮我吗?谢谢了!方便的话最好能加你qq,通过qq指导一下,或者发给你程序,帮我做个例子试试,想解决这个问题很久了。汇编和CE运用水平太菜了,怎么也找不出来真正的不变的基址。

netegg 发表于 2010-9-19 05:07:26

官网搜NomadMemory,有一套从基址读写内存的函数

manlty 发表于 2010-9-19 14:31:13

那些函数我知道的,不过做不出来的

ebhb 发表于 2010-9-19 17:37:22

每次地址都变,那就说明你的基址没找正确啊,所谓基址就是不随计算机启动而变动,也不随计算机的改变而变动。

amnesiac 发表于 2010-9-21 08:18:06

努力学习中

lanfengc 发表于 2010-9-22 18:26:00

软件的数据在内存中和游戏的不太一样。 大部分游戏都是通过基址和偏移来生成当前角色的各种信息数据。而常见的应用软件的数据大部分都是以常量存在的,找的时候不如游戏的好找。

yiruirui 发表于 2010-9-22 23:30:54

每次地址都变,那就说明你的基址没找正确啊,所谓基址就是不随计算机启动而变动,也不随计算机的改变而变动。真理!
页: [1] 2
查看完整版本: 如何算出一个程序的某数据所在的内存地址?菜鸟求助高手