找回密码
 加入
搜索
查看: 11509|回复: 20

[AU3基础] AU3定义内存基址的问题

 火.. [复制链接]
发表于 2010-5-6 07:33:43 | 显示全部楼层 |阅读模式
本帖最后由 116154801 于 2010-5-7 05:58 编辑

本贴已经解决,请查看11楼得知结果。







以下我怎么样都是读取都是0,不知道为什么,是不是我人品问题。有人能帮帮我吗?
;定义内存基址
$Address = 0x00FF0F90
;定义内存偏移地址
$Off_Hp = 0x310

;获取游戏句柄
$CurProcID=WinGetProcess("步骤")
;获取内存读写句柄
$Handle = _MemoryOpen($CurProcID)
;错误处理
If $Handle=0 then
MsgBox(4096,"错误提示","打开游戏内存错误。")
Exit
EndIf
;读取内存数据
$HP = _MemoryRead("0x" & Hex($Address+$Off_Hp), $Handle)
MsgBox(0,"",$HP)

;关闭内存句柄
_MemoryClose($CurProcID) 





;=================================================================================================
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

;=================================================================================================

本帖子中包含更多资源

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

×
 楼主| 发表于 2010-5-6 07:38:00 | 显示全部楼层
有人帮帮忙吗?小弟无敬感激
发表于 2010-5-6 08:14:15 | 显示全部楼层
帮你顶一个
 楼主| 发表于 2010-5-6 08:26:32 | 显示全部楼层
3Q,有说能进来帮帮忙呢?
发表于 2010-5-6 10:20:38 | 显示全部楼层
这个东西不懂,帮顶
 楼主| 发表于 2010-5-6 19:18:19 | 显示全部楼层
有人吗?????
发表于 2010-5-6 21:15:32 | 显示全部楼层
$HP = _MemoryRead("0x" & Hex($Address+$Off_Hp), $Handle)
问题应该出现在这里
发表于 2010-5-6 21:21:41 | 显示全部楼层
$HP = _MemRead($Handle,  $Address+$Off_Hp,  "Byte")

评分

参与人数 1金钱 +40 贡献 +10 收起 理由
116154801 + 40 + 10 谢谢你

查看全部评分

 楼主| 发表于 2010-5-7 00:30:35 | 显示全部楼层
回复 8# 298311657


    _MemRead
我没有这个函数呢,能发出来给我们学习学习吗?谢谢你了
发表于 2010-5-7 00:38:57 | 显示全部楼层
你这个俺基本上是帮不上啥忙的。
 楼主| 发表于 2010-5-7 00:42:27 | 显示全部楼层
已经解决了,谢谢大家的支持。更谢谢 298311657  大哥。下面是我解决的,我多加了一条查找基址数据,结果就是 查找到的基址数据+偏移地址=要找的真实地址了。
;定义内存基址
$Address = 0x00FF0F90
;定义内存偏移地址
$Off_Hp = 0x310
;~ 01F228B0
MsgBox(0,"",Hex($Address+$Off_Hp))



;获取游戏句柄
$CurProcID=WinGetProcess("步骤")
;获取内存读写句柄
$Handle = _MemoryOpen($CurProcID)
;错误处理
If $Handle=0 then
    MsgBox(4096,"错误提示","打开游戏内存错误。")
    Exit
EndIf

$HP1 = _MemoryRead("0x" & Hex($Address), $Handle,   "int")

;读取内存数据
$HP = _MemoryRead("0x" & Hex($HP1+$Off_Hp), $Handle,   "int")
;~ $HP = _MemRead($Handle,  $Address+$Off_Hp,  "Byte")
MsgBox(0,"",$HP)

;关闭内存句柄
_MemoryClose($CurProcID) 
        


;=================================================================================================
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

;=================================================================================================
 楼主| 发表于 2010-5-7 00:45:04 | 显示全部楼层
我再顶,不要让新人们错过了。
 楼主| 发表于 2010-5-7 01:17:03 | 显示全部楼层
这方法我用到其他地方就可以,用在奇迹上,就读不出来,CE就可以读出来。你说奇怪不奇怪。
发表于 2010-5-7 01:30:55 | 显示全部楼层
如果是2 字节怎么办?
发表于 2010-5-7 02:13:42 | 显示全部楼层
普通的还比较好读一点,如果需要注入读取,就不知道怎么搞了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 14:04 , Processed in 0.087387 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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