Wie man Werte Einfriert

05/03/2011 02:35 freehuntx#1
Ich habe mal kurz gegoogelt, und rausgefunden, wie man mit autoit werte einfrieren kann ohne schleifen, sondern wie cheat engine.


So.

Dar ich im moment eine Verbindung von 10 kb/s habe, werde ich leider keine bilder einfügen können.



Fangen wir an.


Erstmal braucht ihr die Adresse eures wertes.

In meinem Beispiel ist es "319" aus dem cheat engine tutorial step 5.

Ich nehme an ihr habt die adresse.
(Ich denke es ist egal ob es ein ponter ist, dar durch diese methode der pointer genoppt wird, und der wie wir wissen immer gleich ist.)

Macht einen Rechtsklick auf eure adresse, und wählt "Find out what writes to this adress"

Ändert euren wert. Den wert in cheatengine ändern funktioniert nicht. In meinem Beispiel drücke ich "Change Value".

In dem cheatengine debugging fenster solltet ihr nun eine adresse sehen können.

Rechtsklick -> Show this adress in disassembler

Nun seht ihr den Pointer, in assesembler.

Und wie wir in der markerten zeile unter der spalte "bytes "sehen, Besteht die adresse aus 2 bytes. (2 zahlen = 1 byte)

Beispiel.

89 = 1 byte/byte
89 10 = 2 bytes
89 10 46 = 3 bytes

usw.

Nun.

in meinem beispiel hat die zeile die adresse 00421daa.

Und dar es 2 bytes sind heißt das.

00421daa = 89
00421dab = 10

hier ein beispiel zu 3 bytes

00421daa = 89
00421dab = 10
00421dac = 46

Die adresse für jeden byte +1 (In hexformat)

Um den pointer zu freezen müssen wir wie gesagt, die adresse nopen.

Der wert für den befehl nop = 90

Also müssen wir den wert von 00421daa und 00421dab in 90 ändern.

Wenn ihr dass per autoit macht, ist die adresse gefreezt und ändert sich nicht.

Wollt ihr sie aber z.B. auf 99 Freezen, müsst ihr vorher vom wer den pointer finden, ihn in euer script einauen und auf 99 setzen, und danach die adresse nopen.

Um den Freeze rückgängig zu machen einfach wieder die adressen auf die Standart werte stellen.

also 00421daa in 89 und 00421dab in 10

Dann ist es wieder unfreezd.



Hoffe ihr versteht das tutorial und wisst etwas damit anzufangen.





Hier mal ein BeispielScript, um euch zu zeigen wie es funktioniert.

Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Cheat Engine Tutorial", 177, 42, 192, 124)
$Button1 = GUICtrlCreateButton("Freezen", 8, 8, 75, 25)
$Button2 = GUICtrlCreateButton("Unfreezen", 96, 8, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$PID = ProcessExists("Tutorial-i386.exe")
$OPEN = _MemoryOpen($PID)


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Freeze()
		Case $Button2
			UnFreeze()

	EndSwitch
WEnd



Func Freeze()
	_MemoryWrite(0x00421daa, $OPEN, "0x90", 'byte[1]')
    _MemoryWrite(0x00421dab, $OPEN, "0x90", 'byte[1]')
EndFunc

Func UnFreeze()
	_MemoryWrite(0x00421daa, $OPEN, "0x89", 'byte[1]')
    _MemoryWrite(0x00421dab, $OPEN, "0x10", 'byte[1]')
EndFunc
05/05/2011 20:53 MrSm!th#2
Cheat Engine freezt aber in einer Schleife.
05/06/2011 19:19 LordKill#3
wie MrSm!th es sagt du schreibst den Wert nur für den einen Moment, wenn das programm sich jede paar sekunden aktualisiert, ist der wert nur einen kurzen moment geändert oder gefreezt müsstest das dann anders aufbauen.
Kannst ja in der hauptschleife ne überprüfung einer variablen machen, die beim klicken des buttons geändert wird somit in der While das dann beschrieben wird. Und das unfreeze ist auch kein unfreeze sondern auch nur das gleiche was ich oben gesagt hab.

ungefähr so:

PHP Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Region ### START Koda GUI section ### Form=
Global $var1 0
$Form1 
GUICreate("Cheat Engine Tutorial"17742192124)
$Button1 GUICtrlCreateButton("Freezen"887525)
$Button2 GUICtrlCreateButton("Unfreezen"9687525)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$PID ProcessExists("Tutorial-i386.exe")
$OPEN _MemoryOpen($PID)


While 
1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            Freeze
()
        Case 
$Button2
            UnFreeze
()

    EndSwitch
    If 
$var1 1 then 
        _MemoryWrite
(0x00421daa$OPEN"0x90"'byte[1]')
        
_MemoryWrite(0x00421dab$OPEN"0x90"'byte[1]')
    EndIf
WEnd



Func Freeze
()
    
$var1 1
EndFunc

Func UnFreeze
()
    
$var1 0
EndFunc 
05/06/2011 21:30 MrSm!th#4
Nein, seine Methode ist schon richtig, er überschreibt den Code, der den Wert ändert, das funktioniert.
Ist nur durch viele Anti Cheat Systeme detected; ich wollte auch nur erwähnen, dass CE es wohl in einer Schleife macht.

Du hast wohl nicht ganz verstanden, dass er Code damit ändert und keinen Wert. Den Code muss er natürlich nur einmal überschreiben.

Aber ok,
Quote:
Um den pointer zu freezen müssen wir wie gesagt, die adresse nopen.
Sätze wie sowas leiten auch ziemlich in die Irre.
freehuntx, formulier es richtig oder gar nicht.
05/06/2011 22:23 SCORNI#5
Ja ist schon ganz richtig das CE das in einer Schleife macht, und wenn ich mich noch erinnere nur alle 500 MS.
05/07/2011 01:06 lolkop#6
Quote:
Originally Posted by LordKill View Post
wie MrSm!th es sagt du schreibst den Wert nur für den einen Moment, wenn das programm sich jede paar sekunden aktualisiert, ist der wert nur einen kurzen moment geändert oder gefreezt müsstest das dann anders aufbauen.
Kannst ja in der hauptschleife ne überprüfung einer variablen machen, die beim klicken des buttons geändert wird somit in der While das dann beschrieben wird. Und das unfreeze ist auch kein unfreeze sondern auch nur das gleiche was ich oben gesagt hab.

ungefähr so:

PHP Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Region ### START Koda GUI section ### Form=
Global $var1 0
$Form1 
GUICreate("Cheat Engine Tutorial"17742192124)
$Button1 GUICtrlCreateButton("Freezen"887525)
$Button2 GUICtrlCreateButton("Unfreezen"9687525)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$PID ProcessExists("Tutorial-i386.exe")
$OPEN _MemoryOpen($PID)


While 
1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            Freeze
()
        Case 
$Button2
            UnFreeze
()

    EndSwitch
    If 
$var1 1 then 
        _MemoryWrite
(0x00421daa$OPEN"0x90"'byte[1]')
        
_MemoryWrite(0x00421dab$OPEN"0x90"'byte[1]')
    EndIf
WEnd



Func Freeze
()
    
$var1 1
EndFunc

Func UnFreeze
()
    
$var1 0
EndFunc 
es gibt immernoch leute die nicht verstanden haben was der computer eigentlich im hintergrund macht :s

der threadersteller hat tatsächlich die "magie" des inline asm erkannt, und es gibt hier echt noch leute die das ganze anzweifeln :s
05/07/2011 02:36 PenGuin :O#7
Quote:
Originally Posted by lolkop View Post
es gibt immernoch leute die nicht verstanden haben was der computer eigentlich im hintergrund macht :s

der threadersteller hat tatsächlich die "magie" des inline asm erkannt, und es gibt hier echt noch leute die das ganze anzweifeln :s
"Inline ASM" ist in AutoIt grad am Kommen :D
(Smith, nicht schlagen :<)
Wobei man C++ dafür verwenden sollte.
05/09/2011 06:57 freehuntx#8
Ich dachte immer Ce Friert werte auf diese weise o.0

Dar nach dem Freezen, selbst wenn man CE Geschlossen hat, der wert sich nicht geändert hat.

Und wenn ihr mal einen Wert freezt und in die memory schaut , seht ihr dass der Pointer Genoppt ist.

@MrSm!th
Ich bin deiner nicht würdig und verstehe nichts vom Programmieren. Deshalb kann ich dir bezüglich "formulier es richtig oder gar nicht." nicht dienen. Ich entschuldige mich vielmals dass ich so dumm bin und mir nie die zeit genommen habe c++ zu lernen.

Mission Complete.


und Werte in einer schleife zu ändern ist in autoit als würde ein mensch ein sofa schleppen.

1 geht ja noch, aber bei 2 wirds schwer.




Quote:
Originally Posted by LordKill View Post
wie MrSm!th es sagt du schreibst den Wert nur für den einen Moment, wenn das programm sich jede paar sekunden aktualisiert, ist der wert nur einen kurzen moment geändert oder gefreezt müsstest das dann anders aufbauen.
Kannst ja in der hauptschleife ne überprüfung einer variablen machen, die beim klicken des buttons geändert wird somit in der While das dann beschrieben wird. Und das unfreeze ist auch kein unfreeze sondern auch nur das gleiche was ich oben gesagt hab.

ungefähr so:

PHP Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Region ### START Koda GUI section ### Form=
Global $var1 0
$Form1 
GUICreate("Cheat Engine Tutorial"17742192124)
$Button1 GUICtrlCreateButton("Freezen"887525)
$Button2 GUICtrlCreateButton("Unfreezen"9687525)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

$PID ProcessExists("Tutorial-i386.exe")
$OPEN _MemoryOpen($PID)


While 
1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            Freeze
()
        Case 
$Button2
            UnFreeze
()

    EndSwitch
    If 
$var1 1 then 
        _MemoryWrite
(0x00421daa$OPEN"0x90"'byte[1]')
        
_MemoryWrite(0x00421dab$OPEN"0x90"'byte[1]')
    EndIf
WEnd



Func Freeze
()
    
$var1 1
EndFunc

Func UnFreeze
()
    
$var1 0
EndFunc 
Naja Wennschon dannschon:

Code:
 If $var1 = 1 then 
        _MemoryWrite(0x00421daa, $OPEN, "0x90", 'byte[1]')
        _MemoryWrite(0x00421dab, $OPEN, "0x90", 'byte[1]')
elseif $var1 = 0 then
        _MemoryWrite(0x00421daa, $OPEN, "0x89", 'byte[1]')
        _MemoryWrite(0x00421dab, $OPEN, "0x10", 'byte[1]')
   EndIf
05/09/2011 10:15 lolkop#9
Quote:
Originally Posted by PenGuin :O View Post
"Inline ASM" ist in AutoIt grad am Kommen :D
ich bin jetzt seit ca. 6 jahren mit autoit vertraut (damals durch ein mmorpg darauf gekommen) und mir ist kein zeitpunkt bekannt, zudem autoit nich in der lage war mit winapis umzugehen...

zudem ich nicht verstehe warum du denn inline asm in anführungszeichen gesetzt hast.
05/09/2011 16:05 MrSm!th#10
Wenn du aber mal versuchst, mit CE Werte zu freezen, die sehr sehr schnell überschrieben werden, wirst du merken, dass es doch in einer Schleife passieren muss.
Das siehst du zb. bei S4 an den Koordinaten. Würdest du einfach den Code noppen (nicht den Pointer!) müsste man ja genau an einer Stelle bleiben. Du bewegst dich aber immer ein Stück und wirst dann wieder zurück an die alte Stelle teleportiert (sieht man ganz schön, wenn man fällt).
Habe auch schon in CE bemerkt, dass Werte ab und zu wieder zurückgesprungen sind und dann wieder zum eingefrorenen Wert wurden.
Deutet also ziemlich auf eine Schleife hin ;)

p.s. C++ hat damit nichts zutun, eher ASM
05/09/2011 16:42 LordKill#11
fuuu okay ... habs mit asm vercheckt -.- aber jetzt steht das da auch mit nop etc ._.
05/09/2011 23:19 freehuntx#12
Quote:
Originally Posted by MrSm!th View Post
Wenn du aber mal versuchst, mit CE Werte zu freezen, die sehr sehr schnell überschrieben werden, wirst du merken, dass es doch in einer Schleife passieren muss.
Das siehst du zb. bei S4 an den Koordinaten. Würdest du einfach den Code noppen (nicht den Pointer!) müsste man ja genau an einer Stelle bleiben. Du bewegst dich aber immer ein Stück und wirst dann wieder zurück an die alte Stelle teleportiert (sieht man ganz schön, wenn man fällt).
Habe auch schon in CE bemerkt, dass Werte ab und zu wieder zurückgesprungen sind und dann wieder zum eingefrorenen Wert wurden.
Deutet also ziemlich auf eine Schleife hin ;)

p.s. C++ hat damit nichts zutun, eher ASM

Ich wollte damit sagen dass C++ geeigneter dafür ist als autoit.

Und wieso soll man denn nicht den Pointer Freezen?? dass ist doch der sinn..
verstehe ich nicht..

Naja was Koordinaten angeht...

In Crysis 2 habe ich einen OPK Geschrieben, in autoit, und beim testen der adressen, ist mir nicht aufgefallen dass mann zurückgesetzt wird...
Ich konnte mich keinen schritt bewegen.


Naja ich Finde Nopen besser als es mit einer schleife zu freezen.
Jedem die seine Meinung.
05/09/2011 23:22 MrSm!th#13
Problem ist, dass Codechanges wie Noppen von Anti Cheats wie XTrap detected werden.

Ich sagte nicht, man soll den Pointer nicht freezen, ich sagte, man noppt ihn nicht.
Nop ist ein ASM Befehl. Die Aussage "Einen Pointer noppen" macht einfach keinen Sinn, man kann höchstens den Code noppen, der den Pointer beschreibt, sodass dieser nicht mehr verändert wird, mehr wollte ich gar nicht mit dem ersten Post sagen.
05/10/2011 01:28 freehuntx#14
Ich drück mich eben dessöfteren falsch aus.
Aber ich denke der grundgedanke wird verstanden.

Und wegen der Detection..
Daran kann ich nichts ändern ^^

Ich rate eben zu diesem weg, einen wert zu freezen, wenn man es nicht mit anticheats zu tun hat.