找回密码
 加入
搜索
查看: 7705|回复: 16

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

 火.. [复制链接]
发表于 2010-9-17 02:05:24 | 显示全部楼层 |阅读模式
需要基址?图中基址在每次运行程序的时候都不同的,如何算?

本帖子中包含更多资源

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

×
 楼主| 发表于 2010-9-17 09:06:02 | 显示全部楼层
难道au3平台的短板正是在对第三方程序的内存操作上?
发表于 2010-9-17 17:10:09 | 显示全部楼层
这个不是靠算的,似乎应该是用基址加偏移量取得这个地址
 楼主| 发表于 2010-9-17 20:49:37 | 显示全部楼层
本帖最后由 manlty 于 2010-9-17 20:56 编辑

楼上朋友,au3的程序如何知道这个基址?基址也是变化的,每次运行该程序,分配的基址都不同
发表于 2010-9-18 16:45:29 | 显示全部楼层
希望知道结果..
发表于 2010-9-18 19:13:34 | 显示全部楼层
基址需要自己用CE找的,你那个地址是基址加上偏移,不知道转了几层后才到这个地址。
发表于 2010-9-18 19:14:46 | 显示全部楼层
给你一个基址应用例子,原来玩抗日时候找的。
发表于 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[2] = [DllOpen('kernel32.dll')]
    If @Error Then
        SetError(2)
        Return 0
    EndIf
    Local $av_OpenProcess = DllCall($ah_Handle[0], 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)
    If @Error Then
        DllClose($ah_Handle[0])
        SetError(3)
        Return 0
    EndIf
    $ah_Handle[1] = $av_OpenProcess[0]
    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[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], '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[0], 'int', 'CloseHandle', 'int', $ah_Handle[1])
    If Not @Error Then
        DllClose($ah_Handle[0])
        Return 1
    Else
        DllClose($ah_Handle[0])
        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[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], '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
 楼主| 发表于 2010-9-19 01:26:51 | 显示全部楼层
基址需要自己用CE找的,你那个地址是基址加上偏移,不知道转了几层后才到这个地址。
ebhb 发表于 2010-9-18 19:13



我是尝试用CE查找,可能我太菜了吧,只能找到这个地方,1楼图中画红圈的那个是基址吧(也就是相当于你例子里的$adress1吧?)    不过每次运行这个程序,这个基址都是不同的!纠结中...高手能帮我吗?谢谢了!方便的话最好能加你qq,通过qq指导一下,或者发给你程序,帮我做个例子试试,想解决这个问题很久了。汇编和CE运用水平太菜了,怎么也找不出来真正的不变的基址。
发表于 2010-9-19 05:07:26 | 显示全部楼层
官网搜NomadMemory,有一套从基址读写内存的函数
 楼主| 发表于 2010-9-19 14:31:13 | 显示全部楼层
那些函数我知道的,不过做不出来的
发表于 2010-9-19 17:37:22 | 显示全部楼层
每次地址都变,那就说明你的基址没找正确啊,所谓基址就是不随计算机启动而变动,也不随计算机的改变而变动。
发表于 2010-9-21 08:18:06 | 显示全部楼层
努力学习中
发表于 2010-9-22 18:26:00 | 显示全部楼层
软件的数据在内存中和游戏的不太一样。 大部分游戏都是通过基址和偏移来生成当前角色的各种信息数据。而常见的应用软件的数据大部分都是以常量存在的,找的时候不如游戏的好找。
发表于 2010-9-22 23:30:54 | 显示全部楼层
每次地址都变,那就说明你的基址没找正确啊,所谓基址就是不随计算机启动而变动,也不随计算机的改变而变动。真理!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 07:14 , Processed in 0.086096 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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