| Autor |
Nachricht |
__username
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.02.2012
Beiträge: 79
|
__username Mitglied
18:31:16 27.02.2012 Titel: |
Detours 64bit - Der Versuch eines Anfangs |
Zitieren |
Hallo,
zunächst einmal sorry falls das das falsche Forum ist!
Habe gerade angefangen eine Funktion zu detouren (ich bin dabei es zu versuchen...). Unter 32bit ist das kein Problem, aber 64bit macht meine Nerven kaputt...
Naja, als ich mich so durch Internet gewühlt habe, ist mir klar geworden, warum Microsoft für eine DetourLib ca. 10.000$ verlangt...
Whatever, meine Theorie:
1. Adresse der Ziel-Funktion holen
2a. Am anfang der Funktion den Speicher durch einen absoluten Jump zur neuen Funktion ersetzen.
2b. Wie 2a, nur das der Jump relativ ist.
3. Fertig
Die Sicherung des alten Speichers ist mir (jetzt noch) egal.
Naja, das Problem beginnt beim Opcode für Jmp(Absolut), bzw. Jmp(Relativ) für x64. Im Internet lese ich dazu nämlich verschiedene...die Opcodes für 32bit kann ich ja nur verwenden, wenn ich mich im Bereich von 2GB bewege !?
Auch den Abstand der Funktionen bekomme ich nicht
| C++: | | int64 Abst = ((int64)Funk1 - (int64)Funk2); // falscher Abstand | |
Kann das so überhaupt funktionieren oder bin ich da auf dem Holzweg
Danke schonmal ! |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
20:15:59 27.02.2012 Titel: |
|
Zitieren |
Unter x64 git es auch nur 32Bit relativ Offsets:
| Code: | jmp OFFSET NewFnc - (OFFSET OrgFnc+5)
-> 0xE9 ?? ?? ?? ?? | |
So könnte man es z.B. mit jWasm machen:
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | fn GetModuleHandle,"user32.dll"
fn GetProcAddress,rax,"MessageBoxA"
mov rdi,rax
invoke VirtualProtect,rdi,5,PAGE_EXECUTE_READWRITE,ADDR dwProtect
mov BYTE ptr [rdi],0E9h
mov eax,edi
add eax,5
mov edx,OFFSET NewFunction
sub edx,eax
mov SDWORD ptr [rdi+1],edx
invoke MessageBoxA,0,0,0,0 | | |
|
|
|
 |
__username
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.02.2012
Beiträge: 79
|
__username Mitglied
20:45:52 27.02.2012 Titel: |
|
Zitieren |
Vielen dank erstmal !
Ja gut, aber mit 32bit kann ich nicht über 2gb hinaus... müsste ich da eine far call machen?
BTW: Weißt du warum Microsoft dafür 10k$ haben will? Würde mich echt interessieren, das muss ja ziemlich komplex sein... |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
22:37:08 27.02.2012 Titel: |
|
Zitieren |
| __username schrieb: | | Vielen dank erstmal !Ja gut, aber mit 32bit kann ich nicht über 2gb hinaus... müsste ich da eine far call machen? |
Nein, man muss einen Sprung mit einer absoluten Addresse machen. z.B.:
| Code: | mov rax,imm64
jmp rax | |
| __username schrieb: | | BTW: Weißt du warum Microsoft dafür 10k$ haben will? Würde mich echt interessieren, das muss ja ziemlich komplex sein... |
Ganz einfach: Microsoft stellt Software her und verkauft dies dann - sollte doch als Erklärung reichen?
Trivial ist es die Sache nicht: Du brauchst eine disassembler damit du die überschriebenen Befehle rettet bzw in einer, wie es bei Detours heißt, Trampolinfunktion benutzen kannst. |
|
|
|
 |
__username
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.02.2012
Beiträge: 79
|
__username Mitglied
15:11:33 28.02.2012 Titel: |
|
Zitieren |
|
 |
masm
Unregistrierter
|
masm Unregistrierter
16:36:25 28.02.2012 Titel: |
|
Zitieren |
| __username schrieb: | | Wegen den "verlorenen Befehlen": Kann ich nicht den überschriebenen Speicher (z.B. einfach mal 50Bytes), nachdem meine Funktion aufgerufen worden ist, zurückschreiben? | Das könnte man machen, ist aber eine sehr schlechte Lösung. | __username schrieb: | | Wo steckt der Fehler? | Du musst beachten, dass ein Debug Build andern Code erzeugt als ein Release Build: Funktionen werden z.B. über eine jump table aufgerufen. |
|
|
|
 |
__username
Mitglied
Benutzerprofil
Anmeldungsdatum: 10.02.2012
Beiträge: 79
|
__username Mitglied
18:29:28 28.02.2012 Titel: |
|
Zitieren |
Und sieh an, es funktioniert!
Du glaubst nicht wie sehr ich dir danke
Hab es jetzt folgendermaßen realisiert:
| C++: | BYTE b[] = {0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0xFF, 0xE0}; //mov RAX, adresse_von_blub | jmp RAX
VirtualProtect
MemCopy //adresse_von_blub nach b[2]
VirtualProtect //zurück
//läuft | |
Ich muss nur noch den alten Speicher sichern/später wiederherstellen, aber das ist kein Problem mehr.
Geht das so in Ordnung, oder gibts noch einen fatalen "Fehler"? |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|