Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 18:15

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

Advertisement



Memory nach Addresse durchsuchen?

Discussion on Memory nach Addresse durchsuchen? within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Feb 2010
Posts: 19
Received Thanks: 1
Memory nach Addresse durchsuchen?

Hi ich habe einen Hook der zu Programmstart Änderungen an ein paar Addressen macht (danach aber nichts mehr).
Derweil funktioniert das ganz gut, nur halt eben für die eine Version des Programmes (statische Addressen).

Da ich den Hook aber auch für andere Versionen kompatibel machen will stellt sich mir nun die Frage wie ich möglichst effizient diese Addressen herausfinden kann ohne statische Addressen zu benutzen, sowie eine sichere Addresse für eine code cave.

Eine erste mögliche Idee wäre, dass ich einfach von der Base Address beginnend vorwärts suche und dabei jede Wert bei der jeweiligen Addresse mit den von mir gesuchen Werten vergleiche bis jeder Wert übereinstimmt.
Hier drängt sich mir aber noch die Frage auf, wie ich herausfinden kann wieviel Speicher das executable module einnimmt damit ich die Suche eingrenzen kann.

Freue mich über konstruktive Antworten
Zapeth is offline  
Old 05/12/2013, 19:25   #2


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Am Anfang eines jeden Moduls befindet sich der . Durch das Feld e_lfanew kommst du auf den . In diesem steht das Feld OptionalHeader.SizeOfImage. Dieses gibt die gesamte Modulgröße an. Wenn du weißt, dass sich deine gesuchte Adresse garantiert nicht in der Code-Section befindet, oder du genau weißt, in welcher Section sich deine Adresse befindet, dann kannst du die durchgehen, die direkt an den NtHeader anschließen. In diesen findet du nützliche Informationen zu jeder Section des Moduls (Startadresse, Größe, Charakteristika, also ob es Code enthält etc). Vermutlich kannst du deine Adresse ja auf eine Section einschränken, dann musste nur noch diese durchsuchen.
Wenn umliegende Adressen deiner gesuchten Adresse bestimmte statische Werte haben, kannst du es auch mit einem Patternscan probieren.
Allerdings sollte es für jede dynamische Adresse irgendwie Zeiger geben, weil der Origignal-Code ja auch irgendwie an diese Adresse rankommen muss (er wird ja nicht jedesmal auf gut Glück suchen, wenn er z.B. das Leben eines Spielers verändern will). Die wohl eleganteste Variante wäre, diese Pointer zu finden (können auch über verschiedene Ebenen gehen, muss kein Direktpointer sein) und sie in deinem Code zu implementieren, um dein Ziel zu erreichen.
Ich hoffe, dass das geholfen hat
Mit freundlichen Grüßen
Jeoni

P.S.: Bei Fragen, kannst du mir gerne eine PN schreiben.
Jeoni is offline  
Thanks
1 User
Old 05/12/2013, 20:22   #3
 
elite*gold: 0
Join Date: Feb 2010
Posts: 19
Received Thanks: 1
Quote:
Originally Posted by Jeoni View Post
Vermutlich kannst du deine Adresse ja auf eine Section einschränken, dann musste nur noch diese durchsuchen.
Wenn umliegende Adressen deiner gesuchten Adresse bestimmte statische Werte haben, kannst du es auch mit einem Patternscan probieren.
Und diese Suche soll ich dann so gestalten wie ich es bereits erwähnt habe?
Und kann ich das genauso für meine Code Cave machen? Im Prinzip suche ich dort ja nur nach einer Addresse mit lauter Nullen aber gibts da auch eine Section wo ich danach suchen muss (damit ich nicht irgendwo was reinschreibe wo später was vom Programm reingeschrieben wird )

Quote:
Originally Posted by Jeoni View Post
Allerdings sollte es für jede dynamische Adresse irgendwie Zeiger geben, weil der Origignal-Code ja auch irgendwie an diese Adresse rankommen muss (er wird ja nicht jedesmal auf gut Glück suchen, wenn er z.B. das Leben eines Spielers verändern will). Die wohl eleganteste Variante wäre, diese Pointer zu finden (können auch über verschiedene Ebenen gehen, muss kein Direktpointer sein) und sie in deinem Code zu implementieren, um dein Ziel zu erreichen.
Die Werte an den Addressen sind nicht dynamisch aber die Offsets unterscheiden sich halt bei den Versionen, deshalb muss ich danach suchen.

Und danke, das hat schonmal sehr geholfen
mfg Zapeth
Zapeth is offline  
Old 05/12/2013, 20:34   #4


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Zum Thema Code Caves: Warum allozierst du nicht Speicher mithilfe von malloc oder new? Den daraus resultierenden Speicher kannste in jedem Fall mit deinen Sachen beschreiben (ggf noch mit VirtualAlloc Execute-Rechte geben), ohne dass die Funktionalität des Programms leidet, weil du wichtige Codes oder Daten überschreibst.
Zu den Adressen: Ok, also es geht nur um Versionsunterschiede? Hier könnte man entweder einen Patternscan machen (mit einem eindeutigen Pattern) oder tatsächlich jede Adresse abprüfen. Bei letzterer Methode allerdings musst du aufpassen: Wenn du nach dem Wert 100 suchst, gibt es evtl mehrere, also musst du ein paar Funde überspringen (muss natürlich eine statische Anzahl an Funden sein) oder eben weitere statische Werte in der nähe Suchen und die abprüfen. Also zum Beispiel, wenn der nächste integer 50 sein soll eben auch <Adresse>+4 nach 50 prüfen (was ja quasi schon ein Patternscan ist). In jedem Fall ist aber nicht garantiert, dass du deine Adresse in jeder Version findest. Pattern können sich verändern und die Anzahl der 'übersprungenen' Ergebnisse auch.
Hoffe, dass ist hilfreich, auch wenn dieser Post in meinen eigenen Augen irgendwie etwas verwirrt aussieht
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 05/12/2013, 21:31   #5
 
elite*gold: 0
Join Date: Feb 2010
Posts: 19
Received Thanks: 1
Quote:
Originally Posted by Jeoni View Post
Zum Thema Code Caves: Warum allozierst du nicht Speicher mithilfe von malloc oder new? Den daraus resultierenden Speicher kannste in jedem Fall mit deinen Sachen beschreiben (ggf noch mit VirtualAlloc Execute-Rechte geben), ohne dass die Funktionalität des Programms leidet, weil du wichtige Codes oder Daten überschreibst.
Stimmt, daran habe ich gar nicht gedacht
Aber wenn ich einen JMP zu einer Addresse in meinem hook machen will, wird der Befehl nicht mehr Speicher verbrauchen als wie wenn ich zu einer Addresse innerhalb des Speichers der .exe springe? Oder verbrauchen die einheitlich viel Speicher (solange es keine short jmp's sind)?

Und nachdem die Werte die ich suche größtenteils sowieso nur einmal in den entsprechenden Sections zu finden sind, schätze ich mal, dass die Eindeutigkeit kein großes Problem sein sollte

mfg, Zapeth
Zapeth is offline  
Old 05/12/2013, 21:40   #6


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,105
Received Thanks: 681
Soweit ich weiß, gibt es da keinen erhöhten Speicherverbrauch. Du kannst auch andere Methoden zum jumpen anwenden, die sind aber etwas größer.
Da gibt es
Code:
push <absolute Adresse deiner Code Cave>
ret
oder, wenn ein Register gerade unnütz ist (im Beispiel eax)
Code:
mov eax, <absolute Adresse deiner Code Cave>
jmp eax
Geht natürlich auch mit call statt jmp.
Direkte JMPs (also "jmp <Distanz>") sind in jedem Fall 5 Bytes lang: 1 Byte der "jmp" 4 Bytes die Distanz.
Bezieht sich alles auf 32Bit.
Hoffe, dass war das, was du suchtest
Jeoni
Jeoni is offline  
Thanks
1 User
Old 05/12/2013, 21:53   #7
 
elite*gold: 0
Join Date: Feb 2010
Posts: 19
Received Thanks: 1
Quote:
Originally Posted by Jeoni View Post
Hoffe, dass war das, was du suchtest
Jeoni
Soweit wars das, werde mich aber hier wieder melden falls unerwartete Probleme auftreten

Danke nochmal für die schnelle Hilfe
mfg Zapeth
Zapeth is offline  
Old 05/13/2013, 10:01   #8
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Quote:
Originally Posted by Zapeth View Post
Soweit wars das, werde mich aber hier wieder melden falls unerwartete Probleme auftreten

Danke nochmal für die schnelle Hilfe
mfg Zapeth
Sollte es zum Thema Code-Caves weitere Probleme geben, hilft dir vielleicht auch das:


Das Ganze wird zwar implementiert als AutoIt-Code, davor versuche ich aber alles so allgemein wie möglich zu beschreiben, damit es auch in jeder anderen Sprache derart umsetzbar sein sollte.
Shadow992 is offline  
Old 05/18/2013, 16:32   #9
 
elite*gold: 0
Join Date: Feb 2010
Posts: 19
Received Thanks: 1
OK hier bin ich wieder mit neuen Fragen (hatte leider in letzter Zeit viel zu tun und bin erst kürzlich dazu gekommen mich wieder diesem Projekt von mir zu widmen)

Das Suchen funktioniert ganz gut bis jetzt (und schnell genug ist es auch) allerdings habe ich jetzt Verständnisprobleme mit der Code Cave.
So wie ich es verstanden habe kann ich ja ganz einfach neuen Speicher allozieren mit zb new und den Pointer auf diesen Speicher dann für meine Code Cave verwenden.
VirtualAllocEx (so wie in Shadow's tutorial) müsste ich ja nur verwenden, wenn ich von außerhalb des Prozesses auf den Speicher zugreife was ja hier nicht der Fall ist oder?
Und was für einen Datentyp soll ich hier verwenden oder ist das egal?

Und ich müsste ja dann diesen Pointer auch in ASM-Code umwandeln damit ich einen JMP dorthin machen kann.
Also derzeit mache ich es ja so mit meiner Code Cave als statische Addresse:
Code:
// jump befehl zur code cave
JMP 010034A0

// der zugehörige bytecode, der in den speicher geschrieben wird:
E9 F6123B00
Wie kann ich also jetzt zur Laufzeit den ASM code mit der richtigen Addresse in Bytecode umwandeln damit ich ihn in den Speicher schreiben kann?
Zapeth is offline  
Old 05/18/2013, 21:38   #10
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Du hast keine Sprache angegeben, also C++

(len ist die Länge des Codes, der an deiner Adresse steht, mindestens 5, src ist die Adresse der Stelle die du hooken willst)
Code:
//erzeugt deine Code-Cave
uint8_t *jmp = (uint8_t*)malloc(len + 5);
//erzeugt ein Byte-Array auf den original-Code
uint8_t* byteSrc = reinterpret_cast<uint8_t*>(src);
//kopiert den originalen Code in deine Codecave
memcpy(jmp, src, len);
//Für unseren Jump zurück brauchen wir nur 5 Bytes, die letzten 5
jmp += len;
//Logisch, JMP-Byte
jmp[0] = 0xE9;
//Die Adresse der des Original-Codes wird in die Codecave geschrieben, zum Zurückspringen
*(uintptr_t *)(jmp + 1) = uintptr_t(byteSrc + len - jmp) - 5;
//Ursprungscode wird abgeändert auf JMP
byteSrc[0] = 0xE9;
//Die Adresse der Code-Cave wird an Originale Stelle geschrieben (deine Frage meint das hier)
*(uintptr_t *)(byteSrc + 1) = uintptr_t((uint8_t*)dst - byteSrc) - 5;
//Setzt den Rest im Ursprungscode auf 0x90, also NOP
for (uint32_t i = 5; i < len; i++)
{
	byteSrc[i] = 0x90;
}
Das ist vllt etwas heftig, sollte dir aber genauestens erklären, was abgeht bzw. abgehen sollte.
Achtung: ich habe sämtliche Zugriffsrechtsänderungen rausgenommen, natürlich muss src mit der Länge len auf PAGE_READWRITE gesetzt werden und dein Code, falls nicht direkt als ausführbar alloziert, natürlich auf PAGE_EXECUTE oder ähnliches

Ich hoffe, das hilft^^

Padmak
Padmak is offline  
Thanks
1 User
Old 05/18/2013, 22:05   #11
 
elite*gold: 0
Join Date: Feb 2010
Posts: 19
Received Thanks: 1
Quote:
Originally Posted by Padmak View Post
Du hast keine Sprache angegeben, also C++
Sry, dachte dass es nach der bisherigen Diskussion schon offensichtlich war.

Quote:
Das ist vllt etwas heftig, sollte dir aber genauestens erklären, was abgeht bzw. abgehen sollte.
Danke, das hilft mir in der Tat. Es war zwar mehr als verlangt aber das schadet ja nie

gruß, Zapeth
Zapeth is offline  
Old 05/18/2013, 22:39   #12
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
War auch relativ offensichtlich, ich habs nur nochmal dazugeschrieben für andere, die vielleicht mal auf diesen Thread stoßen
Freut mich dass ich dir helfen konnte, wenn du damit weitergehende Probleme haben solltest, schreib mir einfach 'ne PM, dann versuch ich dir zu helfen :P

Padmak
Padmak is offline  
Old 05/19/2013, 17:54   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Wenn man src die Execute-Berechtigung nimmt, endet das nicht schön.
MrSm!th is offline  
Old 05/19/2013, 18:07   #14
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Ich hab mal als Voraussetzung vorausgesetzt, dass er selbst merkt, dass der Code danach wieder auf exec zurückgesetzt werden muss.. war das zuviel verlangt?

Padmak
Padmak is offline  
Reply


Similar Threads Similar Threads
Excel Makro: Tabelle nach Wort durchsuchen und die gesamte Zeile löschen
10/26/2012 - Off Topic - 0 Replies
ohai! Sitze gerade an einer recht großen Excel Tabelle, und will alle Zeilen die in der ersten Spalte "Grundschule" enthalten komplett löschen. Mit der Suchen und Ersetzen funktion kann ich nur den Inhalt löschen wenn ich durch nichts ersetze (also das Feld leer lasse) also muss das denk ich mit nem Makro gehen. Hab absolut keine Ahnung davon, ich hoffe mir kann da jemand weiterhelfen. Tabelle sieht so aus: Schule Name/Random Info/Random Info/Random Info XXY...
Thema nach Benutzer durchsuchen?
08/20/2012 - Main - 4 Replies
Hey Leute, ich habe ein Thread in der Freebies Section auf und wollte fragen ob es möglich ist anzuzeigen zu lassen ob jemand in meinem Thread mehrfach gepostet hat. Ich hab keine Lust alles von Hand nachgucken, ich hab so'ein Verdacht das jemand mehrfach gepostet hat (was ich bei mir verboten hab da es eine verlosung ist)
[HowTo/Release] Memory durchsuchen und Referenzen finden
11/13/2011 - Metin2 Guides & Templates - 9 Replies
Hey Leute, ich bins mal wieder :D Dieses Mal jedoch mit einem kleinen "Progrämmchen" für die Programmierer unter euch.. Ich hab für die Analyse einer P-Server-Exe ein kleines Programm geschrieben, das nach den Referenzen auf eine bestimmte Adresse sucht Z.B. von wo aus eine Adresse 0xXXXXXXXX gecallt/gepusht/gejumpt wird Dazu hab ich 2 Funktionen geschrieben, einmal void* SearchByteArray(unsigned char* searchstr, DWORD startaddr, DWORD endaddr, DWORD len); sowie
Internetseite nach Wort durchsuchen
01/15/2011 - AutoIt - 1 Replies
Hallo, ich möchte ein Programm erstellen, mit dem ich bei facebook automatisch poken(anstupsen) kann. Ich hab das jetzt mit Pixelsearch gemacht, dass wenn es an der einen stelle so blau ist, zuerst auf das poke und dann auf diesen knopf poke gedrückt wird. Fuktioniert aber wenn jemand Geburtstag hat und das ein bisschen weiter unten steht nicht , oder wenn ich auf eine andere Seite geh, drückt er dort auf diesen link der dort steht. Meine Frage, ist es möglich, die Internetseite nach "Poke...
Datenbank nach Sachen schneller durchsuchen?
07/16/2010 - Metin2 Private Server - 8 Replies
Hey Com, da ich in der SuFu nichts darüber gefunden habe, wollte ich meine Frage einfach mal in einem Thread fragen. Ich möchte in der Datenbank ein Item finden, welches ich in meinem Inventar habe. Da es aber über 1800 Seiten sind, wollte ich Euch fragen, ob es einen schnelleren Weg gibt, diese eine Sache zu finden. Ich bedanke mich im Vorraus. Bitte kein Flame/ Spam. Danke.



All times are GMT +1. The time now is 18:16.


Powered by vBulletin®
Copyright ©2000 - 2025, 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 ©2025 elitepvpers All Rights Reserved.