Wo ist der fehler? Solitär hack

03/03/2013 15:07 trible22#1
hallo liebes team.
ich suche jetzt schon wieder so lange nach dem fehler und finde ihn einfach nicht ._. der wert will sich im spiel nicht verändern obwohl der pointer stimmt.

Code:
#RequireAdmin
;#include <NomadMemory.au3>
#include <MemoryPointer.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;~ SetPrivilege("SeDebugPrivilege", 1)

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Solitär Hack", 290, 100, 0, 0) ;121
$Input1 = GUICtrlCreateInput("", 8, 8, 121, 21)
$Button1 = GUICtrlCreateButton("Hack Points", 136, 6, 80, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Freeze Points Ingame", 136, 32, 140, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

$Offset1=0x10
$Offset2=0x58
$Offset3=0x68
$Offset4=0x244
$MO=_MemoryOpen(ProcessExists("Solitaire.exe"))
$Baseadress=_MemoryGetBaseAddress($MO)
$1=_MemoryRead($Baseadress+0x000bb0e8, $MO)

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = -3
            Exit
        Case $Button1
            $write = _MemoryWrite($1, $MO, GUICtrlRead($Input1), 'dword')
        Case $Button2
            $Read = _MemoryRead($1, $MO, 'dword')
            AdlibRegister($write = _MemoryWrite($1, $MO, $Read, 'dword'), 100)
    EndSelect
WEnd
MFG Trible22
03/03/2013 15:16 -STORM-#2
Du definierst Offsets, aber verwendest sie überhaupt nicht.
Poste am besten mal nen Screenshot des Pointers in CE.
03/03/2013 15:37 trible22#3
Quote:
Originally Posted by -STORM- View Post
Du definierst Offsets, aber verwendest sie überhaupt nicht.
Poste am besten mal nen Screenshot des Pointers in CE.
hmm sieht der code besser aus?
Code:
#RequireAdmin
;#include <NomadMemory.au3>
#include <MemoryPointer.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;~ SetPrivilege("SeDebugPrivilege", 1)

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Solitär Hack", 290, 100, 0, 0) ;121
$Input1 = GUICtrlCreateInput("", 8, 8, 121, 21)
$Button1 = GUICtrlCreateButton("Hack Points", 136, 6, 80, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Freeze Points Ingame", 136, 32, 140, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

$Offset1=0x10
$Offset2=0x58
$Offset3=0x68
$Offset4=0x244
$MO=_MemoryOpen(ProcessExists("Solitaire.exe"))
$1=_MemoryRead(0x000bb0e8, $MO)

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = -3
            Exit
        Case $Button1
            $write = _MemoryWrite($1, $MO, GUICtrlRead($Input1), 'dword')
        Case $Button2
            $Read = _MemoryRead($1+$Offset1+$Offset2+$Offset3+$Offset4, $MO, 'dword')
            AdlibRegister($write = _MemoryWrite($1, $MO, $Read, 'dword'), 100)
    EndSelect
WEnd
Screenshot :
[Only registered and activated users can see links. Click Here To Register...]
03/03/2013 19:12 -STORM-#4
Zum besseren Verständnis verzichte ich erstmal darauf, Funktionen wie MemoryPointerRead/-Write zu verwenden, obwohl das Beispiel dadurch natürlich unnötig lang ist.

Die Addresse im Kommentar stammt vom Screenshot. Bis auf die Baseaddresse verändern die sich wohl bei jedem Spielstart. Die Kommentare dienen also nur dazu, das Script besser mit dem Screenshot zu vergleichen.
Code:
Func _ReadPoints()
	$PID = ProcessExists("solitaire.exe") ;// Prozess finden - nicht sinnvoll, falls Solitaire mehrfach geöffnet ist
	$open = _MemoryOpen($PID) ;// Prozess Handle öffnen
	$Process_Base = _MemoryModuleGetBaseAddress($PID, "solitaire.exe") ;// Adresse auf Screenshot nicht angezeigt
	$Pointer_Base = $ProcessBase + 0xBB0E8 ;// Adresse auf Screenshot nicht angezeigt
	$Pointer_Address1 = _MemoryRead($Pointer_Base, $open) ;// 0x54CEF0
	$Pointer_Address2 = _MemoryRead($Pointer_Address1 + 0x10, $open) ;// 0x662A210
	$Pointer_Address3 = _MemoryRead($Pointer_Address2 + 0x58, $open) ;// 0xFF5F0
	$Pointer_Address4 = _MemoryRead($Pointer_Address3 + 0x68, $open) ;// 0x54A080
	$Pointer_Address5 = $Pointer_Address4 + 0x244 ;// 0x54A2C4 (PointsAddress !)
	$Points_Value = _MemoryRead($Pointer_Address5, $open)
	_MemoryClose($open) ;// Process Handle wieder schließen
	Return $Points_Value
EndFunc

Func _WritePoints($Points_newValue)
	$PID = ProcessExists("solitaire.exe") ;// Prozess finden - nicht sinnvoll, falls Solitaire mehrfach geöffnet ist
	$open = _MemoryOpen($PID) ;// Prozess Handle öffnen
	$Process_Base = _MemoryModuleGetBaseAddress($PID, "solitaire.exe") ;// Adresse auf Screenshot nicht angezeigt
	$Pointer_Base = $ProcessBase + 0xBB0E8 ;// Adresse auf Screenshot nicht angezeigt
	$Pointer_Address1 = _MemoryRead($Pointer_Base, $open) ;// 0x54CEF0
	$Pointer_Address2 = _MemoryRead($Pointer_Address1 + 0x10, $open) ;// 0x662A210
	$Pointer_Address3 = _MemoryRead($Pointer_Address2 + 0x58, $open) ;// 0xFF5F0
	$Pointer_Address4 = _MemoryRead($Pointer_Address3 + 0x68, $open) ;// 0x54A080
	$Pointer_Address5 = $Pointer_Address4 + 0x244 ;// 0x54A2C4 (PointsAddress !)
	_MemoryWrite($Pointer_Address5, $open, $Points_newValue)
	_MemoryClose($open) ;// Process Handle wieder schließen
	Return 1
EndFunc
Außerdem wird Adlibregister so wohl nicht funktionieren. Für Solitär ist ein Einfrieren des Wertes vermutlich aber sowieso nicht nötig.

Edit:
Mir ist noch aufgefallen, dass das GUI so wohl nicht funktioniert.
Verwende Switch statt Select (Select wird nur einmal durchlaufen trotz While-Schleife -> nach einem geklickten Button passiert nichts mehr, Switch wird immer wieder in der While-Schleife durchlaufen), schreib die zu überprüfende Variable hinter die Switch-Anweisung und schreib jeweils zur den zu überprüfenden Wert hinter die Cases. Sähe dann so aus:
Code:
$msg = GUIGetMsg()
    Switch $msg
        Case -3
            Exit
        Case $Button1
            ;// Anweisungen für Button1
        Case $Button2
            ;// Anweisungen für Button2
    EndSwitch