C asm code overwrite

06/18/2016 10:34 maxi39#1
Moin,


angenommen ich habe an der adresse 0x00401340 den beginn einer funktion. also z.b.: CPU Disasm
Address Hex dump Command Comments
00401340 /$ 55 PUSH EBP
00401341 |. 89E5 MOV EBP,ESP
00401343 |. 8B45 08 MOV EAX,DWORD PTR SS:[ARG.1]
00401346 |. 83C0 03 ADD EAX,3
00401349 |. 5D POP EBP
0040134A \. C3 RETN

/*die funktion bekommt ein integer übergeben , addiert 3 hinzu und gibt das ergebnis wieder zurück.*/
jetzt habe ich eine andere funktion geschrieben, die auch einen integer übergeben bekommt und einen zurück gibt und diese mit einer dll in das code segment eingeschleust.
wie kann man jetzt an der stelle 0x00401340 den befehl "push ebp" mit einem jmp befehl überschreiben , also "jmp 0xadressevonneuerfunktion" ,sodass meine neue funktion aufgerufen wird ?
06/18/2016 10:55 Jeoni#2
Hallo,
ich gehe Mal von Grundkenntnissen in C aus, sonst rate ich zur Aneignung dieser. Habe zumindest keine Lust auf Spoonfeeding. Prinzipiell helfen tue ich natürlich dennoch.

Der Code liegt vermutlich in einem Speicherbereich, welcher standardmäßig nicht beschreibbar ist. Darum muss man sich zuerst kümmern. Hierfür ist [Only registered and activated users can see links. Click Here To Register...] zu verwenden. Danach kannst du den Speicherbereich einfach beschreiben. Ein (long near) jmp belegt 5 Byte:
1) statischer Opcode 0xE9
2) 4 byte Zielbeschreibung. Dies ist allerdings nicht die absolute Zieladresse, sondern ein Delta, was sich wie folgt berechnet: <Zieladresse> - (<Adresse vom jmp> + <Länge der jmp-Instruktion = 5>)
Das einfach reinschreiben. Dann die alten Berechtigungen mit VirtualProtect wiederherstellen und fertig. Wird nun die Originalfunktion aufgerufen, springt die erste Instruktion zu deiner Funktion, die dann stattdessen ausgeführt wird.
Mit freundlichen Grüßen
Jeoni
06/18/2016 16:18 maxi39#3
Quote:
Originally Posted by Jeoni View Post
Hallo,
ich gehe Mal von Grundkenntnissen in C aus, sonst rate ich zur Aneignung dieser. Habe zumindest keine Lust auf Spoonfeeding. Prinzipiell helfen tue ich natürlich dennoch.

Der Code liegt vermutlich in einem Speicherbereich, welcher standardmäßig nicht beschreibbar ist. Darum muss man sich zuerst kümmern. Hierfür ist [Only registered and activated users can see links. Click Here To Register...] zu verwenden. Danach kannst du den Speicherbereich einfach beschreiben. Ein (long near) jmp belegt 5 Byte:
1) statischer Opcode 0xE9
2) 4 byte Zielbeschreibung. Dies ist allerdings nicht die absolute Zieladresse, sondern ein Delta, was sich wie folgt berechnet: <Zieladresse> - (<Adresse vom jmp> + <Länge der jmp-Instruktion = 5>)
Das einfach reinschreiben. Dann die alten Berechtigungen mit VirtualProtect wiederherstellen und fertig. Wird nun die Originalfunktion aufgerufen, springt die erste Instruktion zu deiner Funktion, die dann stattdessen ausgeführt wird.
Mit freundlichen Grüßen
Jeoni
es funktioniert , danke
hier der code: