(Autoit) Wie Pointer auslesen ?

11/01/2008 10:22 Haygu#1
Hiho...
Ich progge gerade an einem bot und habe nur ein problem...

Ich hab mit CE nen pointer für die HP gefunden...
In diesem fall: game.dat+0037CC28 offset: 13C
Hab aber bis jetzt keine funktionierende möglichkeit gefunden das in Autoit auszulesen...

Kann mir pls einer verraten wie das geht ?
11/01/2008 13:10 wadimwadim#2
damit müsste es gehen
Code:
Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

If IsArray($av_Offset) Then
If IsArray($ah_Handle) Then
Local $iv_PointerCount = UBound($av_Offset) - 1
Else
SetError(2)
Return 0
EndIf
Else
SetError(1)
Return 0
EndIf

Local $iv_Data[2], $i
Local $v_Buffer = DllStructCreate('dword')

For $i = 0 to $iv_PointerCount

If $i = $iv_PointerCount Then
$v_Buffer = DllStructCreate($sv_Type)
If @Error Then
SetError(@Error + 2)
Return 0
EndIf

$iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(7)
Return 0
EndIf

$iv_Data[1] = DllStructGetData($v_Buffer, 1)

ElseIf $i = 0 Then
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(7)
Return 0
EndIf

$iv_Data[1] = DllStructGetData($v_Buffer, 1)

Else
$iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(7)
Return 0
EndIf

$iv_Data[1] = DllStructGetData($v_Buffer, 1)

EndIf

Next

$iv_Data[0] = $iv_Address

Return $iv_Data

EndFunc
11/01/2008 13:22 link#3
Dann progg das mal so, dass du einfach an der Base Adresse (addiere die Base Adresse des Moduls einfach dazu) 4 Bytes ausliest, und zu diesem Wert, den du dann erhältst, einfach das Offset addierst.
Dann hast du deine Adresse. Falls du die Base Adresse des Moduls dynamisch herausfinden möchtest, hier eine kleine Beispielfunktion (allerdings nicht in AutoIt, da ich diese Sprache nicht beherrsche):

Code:
GetDllBase proc dwPID:DWORD, pName:DWORD
    local hMod:DWORD
    local me32:MODULEENTRY32
    invoke CreateToolhelp32Snapshot, TH32CS_SNAPMODULE, dwPID
    cmp eax, INVALID_HANDLE_VALUE
    je @@end
    mov [me32.dwSize], size MODULEENTRY32
    invoke Module32First, hMod, offset me32
    test eax, eax
    jz @@e
@@l:
    invoke lstrcmpi, offset me32.szExeFile, pName
    test eax, eax
    jnz @f
    mov eax, [me32.modBaseAddr]
    jmp @@e
@@:
    invoke Module32Next, hMod, offset me32
    test eax, eax
    jnz @@l
@@e:
    push eax
    invoke CloseHandle, hMod
    pop eax
    ret
GetDllBase endp
11/01/2008 14:41 Haygu#4
Quote:
Originally Posted by wadimwadim View Post
damit müsste es gehen
Code:
Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

If IsArray($av_Offset) Then
If IsArray($ah_Handle) Then
Local $iv_PointerCount = UBound($av_Offset) - 1
Else
SetError(2)
Return 0
EndIf
Else
SetError(1)
Return 0
EndIf

Local $iv_Data[2], $i
Local $v_Buffer = DllStructCreate('dword')

For $i = 0 to $iv_PointerCount

If $i = $iv_PointerCount Then
$v_Buffer = DllStructCreate($sv_Type)
If @Error Then
SetError(@Error + 2)
Return 0
EndIf

$iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(7)
Return 0
EndIf

$iv_Data[1] = DllStructGetData($v_Buffer, 1)

ElseIf $i = 0 Then
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(7)
Return 0
EndIf

$iv_Data[1] = DllStructGetData($v_Buffer, 1)

Else
$iv_Address = '0x' & hex($iv_Data[1] + $av_Offset[$i])
DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $iv_Address, 'ptr', DllStructGetPtr($v_Buffer), 'int', DllStructGetSize($v_Buffer), 'int', '')
If @Error Then
SetError(7)
Return 0
EndIf

$iv_Data[1] = DllStructGetData($v_Buffer, 1)

EndIf

Next

$iv_Data[0] = $iv_Address

Return $iv_Data

EndFunc
:rolleyes: Soweit war ich auch schon...

Nur egal wie ichs mache kommt immer 0 raus (und es ist nicht 0 ^^)
So hab ichs probiert:

Code:
#Include <NomadMemory.au3>
$pid = WinGetProcess("Game")
$info = _MemoryOpen($pid)
$leben = _MemoryPointerRead (0x0037CC28, $info, 0x0000013C)

MsgBox(1, "nix", $leben)

Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

;Aus platzgründen weggeschnitten

EndFunc
Und so:
Code:
#Include <NomadMemory.au3>
$pid = WinGetProcess("Game")
$info = _MemoryOpen($pid)
$leben = _MemoryPointerRead (0x0037CC28, $info, 316) ; Offset als dec

MsgBox(1, "nix", $leben)

Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

;Aus platzgründen weggeschnitten

EndFunc
Immer 0
11/04/2008 03:17 scbiz#5
Du kannst den ASM Teil ignorieren, um den Beitrag von link zu verstehen ist er nicht erforderlich. Befolge einfach seinen Anweisungen... :rolleyes:
10/13/2009 22:49 LastChance_#6
Quote:
Originally Posted by Haygu View Post
Code:
#Include <NomadMemory.au3>
$pid = WinGetProcess("Game")
$info = _MemoryOpen($pid)
$leben = _MemoryPointerRead (0x0037CC28, $info, 0x0000013C)

MsgBox(1, "nix", $leben)

Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

;Aus platzgründen weggeschnitten

EndFunc
Und so:
Code:
#Include <NomadMemory.au3>
$pid = WinGetProcess("Game")
$info = _MemoryOpen($pid)
$leben = _MemoryPointerRead (0x0037CC28, $info, 316) ; Offset als dec

MsgBox(1, "nix", $leben)

Func _MemoryPointerRead ($iv_Address, $ah_Handle, $av_Offset, $sv_Type = 'dword')

;Aus platzgründen weggeschnitten

EndFunc
Immer 0
Hab das gleiche Problem... nur wird bei mir nichts angezeigt!

Code:
Dim $Offset[2] = [0x10, 0xa9fc]
		$pid = WinGetProcess("Mahjong Titans")
		$ProcessInformation = _MemoryOpen($pid)
		$punkte = _MemoryPointerRead (0x048E708, $ProcessInformation, $Offset)
		_MemoryClose($ProcessInformation)

		GUICtrlSetData($l_Punkte, $punkte)
Hat jemand ne Lösung für das Problem?
10/13/2009 23:20 MrSm!th#7
schon mal auf das datum gesehen? -.-