Überschreiben von Funktionen im eigenen Prozess
-
Hmm ich glaube ich hab mich falsch ausgedrückt , soviel ist mir klar aber mir geht es darum nun die NormaleFunction aufzurufen sodass automatisch meine OverwritingFunction aufgerufen wird.
//Sobald die Funktion überschrieben ist soll die nächste Zeile die Funktion //OverwritingFunction aufrufen,dasss heißt das die NormalFunction eigentlich //nicht mehr existiert NormalFunction();Das ist der Zweck mir ist klar das ich mit einem Funktionszeiger auf alle void(void) Funktionen zeigen kann
-
Damit meine ich das der Speicherbereich der alten Funktion komplett überschrieben wurde , sodass NormalFunction() dasselbe ist wie OverwritingFunction()
-
Dezimiert schrieb:
Damit meine ich das der Speicherbereich der alten Funktion komplett überschrieben wurde , sodass NormalFunction() dasselbe ist wie OverwritingFunction()
Warum sollte das gehen? Das ist auch bei Detours nicht so. Da wird nur ein Zeiger in der Symboltabelle umgebogen.
-
Ok ich kenne mich mit der Funktionsweise von Detour leider nicht gut, da ich vorhatte es lieber selbst zu schreiben, dass einzige was ich brauche ist eine Nachricht, welche geschickt wird sobald die eigentliche Funktion aufgerufen wird.
Ich hatte vor in diesem Fall z.b. eine vordefinierte Funktion von Windows zu hooken und somit zusätzliche Fehlerabfragen einzubauen, oder anderweitige Sachen. Also habe ich mir überlegt , dasss eine Funktion immer aufgerufen wird , wenn der IP(Instruction Pointer) auf die Addresse zeigt an welcher die Funktion steht.Ich dachte nun es wäre das einfachste die orginale Funktion zu überschreiben, sodass meine eigene Funktion an der Stelle steht , an welche der Instruction Poingter beim Aufruf der Original Funktion zeigt. Aber ich danke dir Tachyon. Leider kann ich mit deinem Post nicht ganz so viel anfangen , da ich jetzt trotzdem nicht weiß wie ich meine Funktion hooken soll.
-
Du musst mal etwas konkreter beschreiben, was Du machen willst. Wo sind z.B. die Funktionen definiert? Hast Du zwei Prozesse, von denen einer, in einem anderen irgendwie irgendwelche Funktionsaufrufe abfangen soll? Befindet sich das alles im gleichen Prozess? Sind da irgendwelche APIs und Libs im Spiel? Kommt alles von Dir, oder ist da irgendwelchen 3rd-Party Zeugs im Spiel, auf das Du keinen Einfluss hast? Fragen über Fragen...
-
Ich habe selbst einen UDP Server geschrieben , welcher mit 10 clienten gleichzeitig arbeiten, da über den Server bis zu 512 mb geschickt werden hat jeder Client einen Thread. Dieser Thread bearbeitet sämtliche Messages, er fängt außerdem disconnects eines Clienten ab.Da ich nur auf großen Umwegen sozusagen in den Thread reinkomme , hatte ich vor eine Art Debug Programm zu schreiben. Dieses fängt durch das hooken der Funktion sendto alle Dateien ab welche gesendet werden sollen überprüft den Inhalt auf Fehler und schickt sie weiter. Da der Server schon geschrieben ist und ich nicht mehr an den Quellcode rankomme um den Code zu ändern und Fehler abzufangen, muss ich ein Programm schreiben , welches sich in den Server einklinkt und alle gesendeten Daten erstmal abfängt. Da bei dem Server ungefähr jedes 1000 Paket verlorengeht muss ich an die Pakete rankommen. Mein Betriebssystem ist Windows 7 sodass RAW-Sockets auch nicht der Bringer sind.
Ich hoffe das waren genug Infos.Ich wollte damit anfangen erstmal selbstgeschriebene Funktionen zu hooken und dann später zu WINAPI Funktionen überzugehen.
-
Ich habe die Addresse von sendto logischerweise da der Prozess die ws2_32.dll geladen hat und die dll denselben speicherbereich nutzt wie die exe kann ich durch den & operator abfragen wo sendto steht.Das Einklinken mit der Dll ist kein Problem allerdings die Funktion zu hooken schon , und da ich gerne auch was dabei lernen würde wollte ich das selbstschreiben. Der Server ist von mir.
-
Dezimiert schrieb:
Ich habe die Addresse von sendto logischerweise da der Prozess die ws2_32.dll geladen hat und die dll denselben speicherbereich nutzt wie die exe kann ich durch den & operator abfragen wo sendto steht[...]
Verstehe ich nicht. Ich denke, Du hast keinen Quellcode. Ansonsten: Ist die Adresse den wirklich immer gleich? Address space layout randomization und so?
-
Ja aber ich habe den Server ja geschrieben,deswegen habe ich nen großteil des Quellcodes noch im Kopf,aber für gezielte Fehlersuche im Programm reicht es nicht.Ich lade die ws2_32.dll von hand im sever, da ich nur wenige Funktionen brauche. Die Addresse ist egal da die Dll wie gesagt den selben Speicherbereich hat, include ich in die Dll "winsock2.h"
und bekomme so immer die Addresse der send Funktion raus:
unsigned long addr=reinterpret_cast<unsigned long>(&send);
Da mein Server ja aufjeden Fall ws2_32.dll geladen hat steht die Funktion send auch auf jedenfall im Speicher
-
So habe mittlerweile eine Lösung gefunden geht leider nur mit WriteProcessMemory sonst gibts ne AccessViolation. Die Lösung war an den anfang der zu hokkenden Funktion den assemblerbefehl _asm jmp ziel zu setzen vielen Dank für eure Hilfe.