Pointer in Script einbauen gefailt ?

07/01/2012 17:50 Copex™#1
Hey Com,

Hab mal versucht in einen 0815 Hack Script den Pointer einzubauen,
jedoch ist es gefailt und wen ich jetzt auf den Button klicke , hat es keine Wirkung,meine Frage ist nun was habe ich falsch gemacht ?:rtfm:
PHP Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include<pointer.au3>
#RequireAdmin
SetPrivilege("SeDebugPrivilege"1)
#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("******"30270192124)
GUISetIcon("C:\Program Files (x86)\****\******", -1)
$Checkbox1 GUICtrlCreateCheckbox("60"1689717)
$Checkbox2 GUICtrlCreateCheckbox("70"16409717)
$Button1 GUICtrlCreateButton("Do It!"136815349)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
          $pid 
WinGetProcess("METIN2")
$openmem _MemoryOpen($pid)
$baseadress _MemoryModuleGetBaseAddress($pid,"metin2client.exe")
$testoffset1 "444" offset neben dem metin2client.bin
    $testoffset2 
"25E" ;das obere offset
    $testoffset3 
"0002B9D0" ;steht neben dem metin2client.bin+[wert]
    Global 
$AOffset[3]
$AOffset[0] = 0
$AOffset
[1] = Dec($testoffset1)
$AOffset[2] = Dec($testoffset2)
$Aaddress "0x" Hex($baseadress Dec($testoffset3))

EndSwitch
WEnd
Func _Hack
()
    
ToolTip ("warte auf Metin2" ,0,0)
    
$PID ProcessExists("metin2client.exe")
    
ProcessWait($PID)
    
ToolTip ("Metin2 wurde Indifiziert." ,0,0)
    
$OPEN _MemoryOpen($PID)
    If 
GUICtrlRead($Checkbox1) = 1 Then
    _MemoryWrite
(0x*****,$OPEN,60,"byte[2]")
EndIf

If 
GUICtrlRead($Checkbox2) = 1 Then
    _MemoryWrite
(0x*****,$OPEN,70,"byte[2]")
    EndIf
EndFunc 
MFG °Elite_Shooter
07/01/2012 18:16 Logtetsch#2
Ich glaube ich trau meinen Augen nicht. Das ist der größte C&P Müll, den ich in meinem ganzen Leben gesehen habe. Ich guck mal was sich machen lässt und pack das Script dann nach einem Edit in den Anhang.

€: Tut mir leid, aber ich blick da erlich nicht durch.
07/01/2012 18:19 Copex™#3
Ok , danke !

ich warte dann .
07/01/2012 18:21 Logtetsch#4
Wie schon gesagt, blicke ich nicht hindurch. Wenn du mir den Pointer schickst, könnt ich das dann machen.
07/01/2012 18:30 Copex™#5
Wie den Pointer ? meinst du nur den Script vom Pointer ?
07/01/2012 18:39 -STORM-#6
Ich nehme an, du hast den Pointer mit CE gefunden.
Also einfach in CE Rechtsklick, Copy, und dann so hier einfügen.
07/01/2012 18:40 Logtetsch#7
Hast du keinen Pointer? Du musst doch einen Pointer haben, damit das Script funktioniert. Der Pointer ist schätzungsweise 80% der Arbeit. Wenn du nicht ordentlich Pointer suchen kannst, kann ich dir auch nicht helfen.
07/01/2012 18:48 Copex™#8
die Pointer habe ich mit CE gefunden , die stehen doch im Script , das Problem ist doch nur der aufbau des Scripts oder nicht ? =/.


Base Address .....................Offset0..Offset 1


"metin2client.exe"+0002B9D0... 444......25E
07/01/2012 18:55 Logtetsch#9
Der Aufbau des Scripts ist kompletter Schrott und gehört aus dem Internet gelöscht.
Mach mal einen Screenshot von deinem Pointer, oder du machst es sowie -STORM- erwähnt hat und postest uns diesen.
07/01/2012 18:57 Copex™#10
Base Address .....................Offset0..Offset 1


"metin2client.exe"+0002B9D0... 444......25E
07/01/2012 19:16 Logtetsch#11
Hab mal schnell etwas gebastelt. Musst die Werte noch für dich anpassen.

PHP Code:
#region Abfrage
if ProcessExists ("metin2client.exe") = False Then
        MsgBox 
(64,"Error","Metin2 konnte nicht gefunden werden! Bitte starten sie Metin2")
        Do
            
Sleep (200)
        
Until ProcessExists ("metin2client.exe") = True
EndIf
#endregion

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Pointer.au3>
#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("Vorlage"18064192124)
$Button1 GUICtrlCreateButton("Change"45207525)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

#region Offsets
Global $Offset[3] = [00x4440x25E]
#endregion

#region Baseaddresse herausfinden
Global $Pid ProcessExists ("metin2client.exe")
Global 
$Open _MemoryOpen ($Pid)
Global 
$Baseaddresse _MemoryModuleGetBaseAddress ($Pid"metin2client.exe") + 0x0002B9D0
Global $Close _MemoryClose ($Open)
#endregion

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

        Case 
$Button1
            $Open 
_MemoryOpen ($Pid)
            
$WriteValue _MemoryPointerWrite ($Baseaddresse$Open$Offset"Dein Wert""Datentyp des Wertes ; Ist nicht unbedingt erzwingend")
            if @
error False Then
                MsgBox 
(0,"","Wert wurde erfolgreich geändert!")
            EndIf
            
$Close _MemoryClose ($Open)

    EndSwitch
WEnd 
07/01/2012 19:39 Copex™#12
Ok , vielen danke <3

auch dafür das du mich ertragen musstest xD ^^
07/01/2012 19:55 KDeluxe#13
Mal wieder nur kopiert... Natürlich auch vom erst besten Müll, der dir in die Augen sprang.

Das einzige was richtig funktioniert ist die von Koda erzeugte GUI. Der Rest ist einfach nur unbrauchbar.
Fangen wir mal bei den ersten selbst geschrieben Zeilen an:
Code:
$pid = WinGetProcess("METIN2")
$openmem = _MemoryOpen($pid)
$baseadress = _MemoryModuleGetBaseAddress($pid,"metin2client.exe")
Was ist hier falsch? Im Grunde nichts, dennoch furchtbar schlecht. Bevor du in diesem Fall die Variable $pid verwendest solltest du vorher entweder prüfen, ob das Fenster "METIN2" vor dem Funktionsaufruf WinGetProcess() existiert, oder der Wert der Variable > -1 ist (besser).
Bevor du das Handle benutzt, welches von _MemoryOpen() zurück gegeben wird, solltest du auch prüfen, ob es gültig ist. Dafür kannst du einfach das Makro "@error" verwenden. Tritt kein Fehler bei der Durchführung von _MemoryOpen() auf bekommst du auch ein gültiges Handle.


Code:
$testoffset1 = "444" ; offset neben dem metin2client.bin
$testoffset2 = "25E" ;das obere offset
$testoffset3 = "0002B9D0" ;steht neben dem metin2client.bin+[wert]
Global $AOffset[3]
$AOffset[0] = 0
$AOffset[1] = Dec($testoffset1)
$AOffset[2] = Dec($testoffset2)
$Aaddress = "0x" & Hex($baseadress + Dec($testoffset3))
Unnötige Variablen zu verwenden ist immer schlecht. Für diese wird Platz im Arbeitsspeicher reserviert. Mehr unnötige Variablen bedeuten also, dass unnötiger Weise nutzlos Speicher reserviert wird.
Die Offsets als Text zu verwenden um diese anschließend mittels Funktion in ein brauchbares "Format" zu bringen ist auch sinnlos, du kannst die Offsets gleich als Hexadezimalzahl angeben (z. B. $Offset = 0x666).


Code:
ToolTip ("warte auf Metin2" ,0,0)
$PID = ProcessExists("metin2client.exe")
ProcessWait($PID)
ToolTip ("Metin2 wurde Indifiziert." ,0,0)
$OPEN = _MemoryOpen($PID)
Gut gedacht, dass war es dann aber schon. Das Script funktioniert so zwar wenn der Prozess schon läuft, wird dieser nach dem Script gestartet funktioniert es nicht.
Du lässt dir zuerst die Prozess ID zurück geben. Existiert der Prozess zu dieser Zeit nicht, erhältst du den Rückgabewert 0. Anschließend möchtest du auf einen einen Prozess warten, der nie gestartet wird. Zumindest in der Theorie. ProcessWait() akzeptiert als Parameter keine Prozess ID, du musst den Namen angeben, den du bei ProcessExists() verwendet hast.
Richtig, dennoch schlecht und nicht empfehlenswert, wäre es so:
Code:
$PID = ProcessWait("metin2client.exe")
Beim Handle (sprich $OPEN) wieder das selbe wie oben schon erklärt.


Code:
If GUICtrlRead($Checkbox1) = 1 Then
_MemoryWrite(0x*****,$OPEN,60,"byte[2]")
Erst einmal möchte ich anmerken: Ganz schön egoistisch... Hilfe erwarten, aber relevantes, was anderen evtl. helfen könnte, zu entfernen. Dabei beziehe ich mich mal auf die Adresse. Außerdem kommt es sowieso nicht vor, dass jemand die Adresse aus deinem Script gefunden hätte, deshalb ist es meiner Meinung nach nicht nur egoistisch sondern auch noch banal. Egal.
"=" ist eigentlich ein Zuweisungsoperator, zum vergleichen sollte man "==" verwenden. Bei AutoIt nicht weiter tragisch, dennoch sollte man es sich ruhig angewöhnen.
Ich kenne mich mit Metin überhaupt nicht aus, betrachte es also als Frage.
Möchtest du wirklich ein "byte" Array der Größe 2 ändern, oder ist die Adresse zwei Byte groß? Wenn letztes zutreffen würde, müsstest du hier "short" bzw. "WORD" verwenden.

Zu guter Letzt sollte man noch erwähnen, dass du die Funktion "_Hack" nie aufrufst, also unnötiger Code. Selbes trifft auf den Pointer, da du ihn nicht verwendest.


Ich habe mit den Infos aus deinem Script mal folgendes gebastelt:
Da der Pointer nicht verwendet wurde, habe ich statt _MemoryWrite() einfach mal _MemoryPointerWrite() mit dem Pointer verwendet.


Logtetschs Lösung zeigt auch ein paar Mängel (mein Lösungsvorschlag gefällt mir nebenbei bemerkt selber nicht), aber das spare ich mir jetzt mal.
07/02/2012 07:19 Copex™#14
bitte einmal einen Post vorher schauen , wurde schon gelöst , aber ein thanks bekommst du für deine Mühe.
07/02/2012 07:58 KDeluxe#15
Das ist mir durchaus bewusst, ich habe das Script von Logtetsch gesehen. Den Grund warum, ich dennoch geantwortet habe, kannst du dem letzten Satz entnehmen.
Einfaches kopieren bringt außerdem nicht wirklich viel, ich habe alle Fehler einzeln angeschrieben und etwas dazu gesagt, was für Lernzwecke auf jeden Fall besser sein dürfte.