Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 01:36

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



char array vom pointer mit srcpy changen

Discussion on char array vom pointer mit srcpy changen within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
char array vom pointer mit srcpy changen

Hey zusammen,
also habe ein kleines problem das grad unnormal nervt

Habe in einem game ein pointer der auf ein char array zeigt
der pointer ist
DWORD* F = (DWORD*)0x0076BBD8; // hier der pointer

auf dem pointer ist jetzt ein char array drauf, nehmen wir einfach als beispiel
"hey"

so jetzt wollte ich mit strcpy z.b "bye" drauf speichern
strcpy((char*)F, "bye");


naja habe das schonmal so gemacht bei nem anderen server und da hatte das so funktioniert :S aber wenn ich das jetzt mache crasht mein game..
jemand vielleicht eine ahnung woran das liegt?
Slade100 is offline  
Old 04/07/2015, 17:44   #2

 
snow's Avatar
 
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
Das kann viele Gründe haben, z.B. könnte der char-Zeiger auf eine schreibgeschützte Region zeigen oder der Zeiger ist nicht konstant.

Warum castest du die Adresse erst gewaltsam zu einem DWORD-Zeiger und dann zu einem char-Zeiger? Warum nicht char *F = reinterpret_cast<char *>(0x00...);?
snow is offline  
Thanks
1 User
Old 04/07/2015, 20:06   #3
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Quote:
Originally Posted by snow View Post
Das kann viele Gründe haben, z.B. könnte der char-Zeiger auf eine schreibgeschützte Region zeigen oder der Zeiger ist nicht konstant.

Warum castest du die Adresse erst gewaltsam zu einem DWORD-Zeiger und dann zu einem char-Zeiger? Warum nicht char *F = reinterpret_cast<char *>(0x00...);?
danke erstmal auf die antwort, naja mache das mit dem dword weil ich das immer so mache^^ ich werde gleich mal deine methode probieren
also schreibgeschützt ist die nicht, weil ich die value mit der cheat engine auch verändere und alles klappt
naja probiere mal kurz das mit char *F = reinterpret_cast<char *>(0x00...);

Edit: ach ich verzweifel xD crasht genau im selben moment, iwie liegts am strcpy :/ kennst du vielleicht eine gute alternative dazu?
Slade100 is offline  
Old 04/07/2015, 20:50   #4


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Bist du überhaupt im selben Adressraum, wie der Zielprozess, also wird dein Code im Zielprozess ausgeführt? Wenn du von extern arbeitest, kannste das so eh vergessen und musst auf (WPM) zurückgreifen.
Davon abgesehen arbeitet CheatEngine auch von extern (oder wahlweise mit einem Treiber, soweit ich weiß), wodurch es ebenfalls WPM nutzt.
Bei WPM ist es egal, ob die Speicherregion, auf die man schreiben will, schreibgeschützt ist. Will man den Schreibschutz intern abschalten, nutzt man in der Regel .
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 04/07/2015, 21:53   #5
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Quote:
Originally Posted by Jeoni View Post
Bist du überhaupt im selben Adressraum, wie der Zielprozess, also wird dein Code im Zielprozess ausgeführt? Wenn du von extern arbeitest, kannste das so eh vergessen und musst auf (WPM) zurückgreifen.
Davon abgesehen arbeitet CheatEngine auch von extern (oder wahlweise mit einem Treiber, soweit ich weiß), wodurch es ebenfalls WPM nutzt.
Bei WPM ist es egal, ob die Speicherregion, auf die man schreiben will, schreibgeschützt ist. Will man den Schreibschutz intern abschalten, nutzt man in der Regel .
Mit freundlichen Grüßen
Jeoni
erstmal danke, aber da ich mit einer dll injection arbeite kann ich doch soweit ich weiß auf virtualprotect und wpm verzichten oder nicht?
Slade100 is offline  
Old 04/07/2015, 22:18   #6


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Auf WriteProcessMemory, ja.
Wenn die Region, in der sich besagter String befindet aber tatsächlich schreibgeschützt ist, darfst du nicht auf VirtualProtect verzichten. Sobald auf schreibgeschützten Speicher geschrieben wird (hier durch strcpy), wird eben eine Exception geworfen wird ("Access Violation", Code 0xC0000005), die sich, da sie nicht abgefangen wird, als Crash äußert.
Du musst also VirtualProtect nutzen, um die Berechtigungen der Speicherregion so zu ändern, dass du drauf schreiben darfst. Anschließend bestenfalls die Berechtigungen mit VirtualProtect wieder zurücksetzen.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 04/08/2015, 21:07   #7
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
danke dir habs gemacht und hat auch geklappt nur eine kleine frage habe ich + etwas das mir merkwürdig vorkommt^^
also meine frage erstmal, also habe das hier

VirtualProtect((LPVOID)(F), 7, PAGE_EXECUTE_READWRITE, &OldProtection);

strcpy((char*)F, "7654321");

VirtualProtect((LPVOID)(F), 7, OldProtection, NULL);

habe für dwsize 7 genommen da es 7 chars hat, bin mir aber nicht ganz sicher ob das so richtig durchdacht ist^^, ich dachte mir halt ein char hat 1 byte und da das 7 sind, nehm ich 7.. klappen tuts auch nur ka obs so optimal ist, oder ich gerade scheiße gebaut habe

naja was ich merkwürdig finde ist das ich nachdem ich das einmal gemacht habe, dannach direkt strcpy((char*)F, "1234567"); aufrufen kann ohne wieder virtualprotect aufzurufen, ich sollte doch mit
VirtualProtect((LPVOID)(F), 7, OldProtection, NULL);

die adresse wie zu beginn schreibgeschützt haben, aber wieso ist das nicht der fall? wäre das der fall müsste es doch wieder crashen so wie vorher .. :S
Slade100 is offline  
Old 04/08/2015, 21:46   #8


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
1.) Du (bzw. dein strcpy Aufruf) schreibst 8 byte / chars. Die 7, die du siehst und dann noch den Nullterminator.
VirtualProtect arbeitet aber generell pageweise. Protection existiert halt nicht pro Byte, sondern pro Page, was 0x1000 Bytes sind.
2.) Dein 2. VirtualProtect-Aufruf schlägt fehl, was du auch am Rückgabewert sehen würdest, würdest du ihn auswerten / ausgeben.
Der Grund dafür ist, dass der letzte Parameter nicht NULL / nullptr sein darf.
dazu:
Quote:
If this parameter is NULL or does not point to a valid variable, the function fails.
Selbst wenn du also die alte Protection im 2. Aufruf nicht brauchst (weil sie ja aller Wahrscheinlichkeit nach eh PAGE_EXECUTE_READWRITE ist), musst den Parameter dennoch entsprechend füllen, damit die Funktion nicht fehlschlägt.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 04/09/2015, 00:26   #9
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Quote:
Originally Posted by Jeoni View Post
1.) Du (bzw. dein strcpy Aufruf) schreibst 8 byte / chars. Die 7, die du siehst und dann noch den Nullterminator.
VirtualProtect arbeitet aber generell pageweise. Protection existiert halt nicht pro Byte, sondern pro Page, was 0x1000 Bytes sind.
2.) Dein 2. VirtualProtect-Aufruf schlägt fehl, was du auch am Rückgabewert sehen würdest, würdest du ihn auswerten / ausgeben.
Der Grund dafür ist, dass der letzte Parameter nicht NULL / nullptr sein darf.
dazu:
Selbst wenn du also die alte Protection im 2. Aufruf nicht brauchst (weil sie ja aller Wahrscheinlichkeit nach eh PAGE_EXECUTE_READWRITE ist), musst den Parameter dennoch entsprechend füllen, damit die Funktion nicht fehlschlägt.
Mit freundlichen Grüßen
Jeoni
daran das das fehlschlägt hätte ich garnicht gedacht, ich wunder mich gerade nur wie viele leute das im internet falsch machen ^^ das mit dem NULL wird so oft am ende genutzt , naja danke dir sehr für die hilfe werde das dann mal so probieren
DWORD OldProtection;
DWORD NewProtection;

if(VirtualProtect((LPVOID)(F), 0x1000, PAGE_EXECUTE_READWRITE, &OldProtection))
strcpy((char*)F, "7654321");
else
cout << "Virtualprotect failed" << endl;
if(VirtualProtect((LPVOID)(F), 0x1000, OldProtection, &NewProtection))
cout << " successfully adding back oldprotection to Virtualprotect" << endl;
else
cout << " Virtualprotect failed on puting oldprotection back " << endl;

und bin fest davon überzeugt das es klappen wird mal schauen

edit: funzt perfekt, bin dir sehr dankbar für deine geleistete hilfe kann von mir aus geclosed werden
Slade100 is offline  
Old 04/09/2015, 09:43   #10


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Du brauchst nicht unbedingt 2 Variablen. Kannst ja beim zweiten Aufruf auch wieder einen Pointer auf OldProtection übergeben, wenn du die Variable danach nicht mehr brauchst.
Das mit dem pageweise schrieb ich nur als Nebeninformationen. Wenn du hier 0x1000 übergibst, und die Region, deren Protection du ändern willst, nicht gerade am Anfang einer Page anfängt, änderst du so (unnötigerweise) mehr als eine Page, weil VirtualProtect "merkt", dass die Region, deren Protection du verändern willst, sich über mehr als eine Page zieht.
Als Größe 8 zu nehmen war schon richtig. War, wie gesagt, nur als Nebeninformation gedacht
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 04/09/2015, 11:57   #11
 
elite*gold: 0
Join Date: Oct 2007
Posts: 856
Received Thanks: 35
Quote:
Originally Posted by Jeoni View Post
Du brauchst nicht unbedingt 2 Variablen. Kannst ja beim zweiten Aufruf auch wieder einen Pointer auf OldProtection übergeben, wenn du die Variable danach nicht mehr brauchst.
Das mit dem pageweise schrieb ich nur als Nebeninformationen. Wenn du hier 0x1000 übergibst, und die Region, deren Protection du ändern willst, nicht gerade am Anfang einer Page anfängt, änderst du so (unnötigerweise) mehr als eine Page, weil VirtualProtect "merkt", dass die Region, deren Protection du verändern willst, sich über mehr als eine Page zieht.
Als Größe 8 zu nehmen war schon richtig. War, wie gesagt, nur als Nebeninformation gedacht
Mit freundlichen Grüßen
Jeoni
aso ok dann sollte das jetzt gelungen sein danke
Slade100 is offline  
Reply


Similar Threads Similar Threads
Multilevel Pointer hacken per Array [Fehlersuche]
05/06/2012 - AutoIt - 12 Replies
Hi Den Wert folgendes Level4-Pointers möchte ich mit einem Autoit-Script hacken: Base: 1073EF88 Offset1: 1C Offset2: 10 Offset3: 4 Offset4: DE4 Dazu habe ich dieses Tutorial gefunden, was beschreibt, wie man den Pointer per Array verwendet:
Frage: Wie findet man zB UG Pointer?Speed pointer?
03/30/2010 - Kal Online - 2 Replies
kann mir einer sagen wie man UG/Speed pointer finden kann usw^^´ß#
[C] Pointer auf Array
08/26/2009 - General Coding - 3 Replies
Hallo, Ich habe folgendende Pointer deklariert: char *Menu0 = {"Gerd","Egon","Juergen&q uot;,"Karl","Hans-Dieter",&quo t;Hans-Guenther"}; char *Menu1 = {"Anna","Inge","Franziska ","Lisa","Maria"}; usw..
Nur eigenen Char changen?!
07/06/2008 - World of Warcraft - 4 Replies
Hi, ich hab mir gedacht das is doch irgendwie möglich sein mus das man nur sienen eigenen char changed - also das alle anderen Gnome noch gnome sind , und nur ich anderst bin - Weiss wer wie das funtzt oda ob das net Möglich is? Mfg. Sota Ty Im vorraus



All times are GMT +1. The time now is 01:37.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.