在AutoIt如何讀取記憶體,可能是大家比較關心的一個問題,俺在此給出示例:
首先,是必需的兩個函數,你可以把下面的代碼複製到腳本中,也可以單獨保存為檔案,比如取名為Memory.au3,然後再用#include指令引入。下面是代碼:- ==============
- ===================================================================================
- 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
- ;=
- =========================================================================
- =======================
複製代碼 其次,在腳本中的使用:- ;引入函數定義
- #include "Memory.au3"
- ;定義記憶體基址
- $Address = 0x008bab4c
- ;定義記憶體偏移地址
- $Off_Hp = 0x254
- ;獲取遊戲句柄
- $CurProcID=WinGetProcess("Element")
- ;獲取記憶體讀寫句柄
- $Handle = _MemoryOpen($CurProcID)
- ;錯誤處理
- If $Handle=0 then
- MsgBox(4096,"錯誤提示","打開遊戲內存錯誤。")
- Exit
- EndIf
- ;讀取記憶體數據
- $HP = _MemoryRead("0x" & Hex($Address+$Off_Hp), $Handle)
- ;關閉記憶體句柄
- _MemoryClose($CurProcID)
複製代碼 查到人物HP後,剩下的就是根據HP的實時變化,再做相應的腳本就行了。
OK,到此,遊戲中的人物HP就從記憶體中讀取出來了,至於什麼遊戲具體什麼地址,偏移量多少,這些要用其他軟體(比如討論區提供的CE軟體)來查找出來。這個就與AutoIt無關了。 |