![]() |
"Hooken", der Jumpbefehl etc
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Mein langfristiges Ziel ist ein API-Hook. Jedoch bin ich gerade selbstständig etwas am rumspielen und am rumprobieren. Das ganze hat wahrscheinlich nicht viel mit API-Hooks zu tun aber das ist jetzt nicht wichtig. ;) Ich knall euch einfach Code vorn Kopf:
Delphi-Quellcode:
Erreichen will ich, das zur procedure "DerAndere" gejumpt wird, wenn man "Opfer" aufruft.
procedure DerAndere;
begin ShowMessage('Da bin ich!'); end; procedure Opfer; begin ShowMessage('Opfer!'); end; procedure TForm1.Button2Click(Sender: TObject); var hProc: THandle; br: Cardinal; jmp: Pointer; begin GetMem(jmp,5); hProc := OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID); try PByte(jmp)^ := $E9; inc(PByte(jmp)); PCardinal(jmp)^ := Cardinal(@DerAndere); dec(PByte(jmp)); WriteProcessMemory(hProc,@Opfer,jmp,5,br); finally FreeMem(jmp); CloseHandle(hProc); end; end; procedure TForm1.Button3Click(Sender: TObject); begin Opfer; end; nach dem Button2-Klick steht auch ein Jump Befehl am Anfang der Opfer-Procedure, der auch ausgeführt wird, aaaber schaut euch das Bild im Anhang an. Die Adresse wird immer als relative Adresse aufgefasst... dadurch hüpft er natürlich ins Nirvana, was nicht gewollt ist.
Delphi-Quellcode:
Da funktioniert es ja auch.. Wobei ich den entstandenen OpCode nicht verstehe:
asm
jmp DerAndere end;
Code:
E9 ist klar... aber $23FFFFFF ist
E923FFFFFF jmp DerAndere
:arrow: nicht die Adresse von der Procedure :arrow: und ein relativer Sprung kanns auch nicht sein :arrow: viel zu weit weg! Also wie mache ich das? (Ich weiß, das ich den "Abstand" zwischen "Opfer" und "DerAndere" ausrechnen könnte und dann doch relativ springen könnte, das will ich aber nicht!) Gruß Neutral General |
Re: "Hooken", der Jumpbefehl etc
warum verwendest du dann den asm-befehl für den realtiven jump wenn du das gar nicht willst? Dein Api-Hook hat auch einen Schönheitsfehler. Du überschreibst den Inhalt der alten Methode so das du diese nicht mehr aufrufen kannst.
Das eigentliche Prinzip ist folgendes. Api-Hook heißt hooken von Apifunktionen. Diese Funktionen werden durch laden der DLL eingebunden und per GetProcAddress gesucht. Wird eine Funktion in der DLL nicht exportiert kann man von außerhalb auch nicht einfach abfragen wo sie liegt. Alle anderen exportierten Funktionen sind aufgelistet. Wenn du diese Auflistung änderst (also die Adressen zum Funktionsnamen) brauchst du nicht den Inhalt der Funktionen überschreiben. |
Re: "Hooken", der Jumpbefehl etc
Öh weil ich dachte, das es vom Befehl her keinen Unterschied gibt, kenne nur $E9 ...
Was wäre denn richtig? |
Re: "Hooken", der Jumpbefehl etc
mov eax, Adresse
call eax Edit: Naja die Methode ist schon okay. Inline Hooking halt .. das Einzige, was noch geändert werden muss, ist, dass du dir die ersten Bytes der Funktion sicherst, damit du sie bei einem Aufruf widerherstellen kannst. |
Re: "Hooken", der Jumpbefehl etc
und
Delphi-Quellcode:
geht nicht?
call adresse
|
Re: "Hooken", der Jumpbefehl etc
Nein, weil call ein Register oder eine Konstante als Operand erwartet.
|
Re: "Hooken", der Jumpbefehl etc
Zitat:
woher hast du die bytefolge? wenn sie direkt aus der datei ist. musst du erstmal die richtung der bytes korrigieren => $FFFFFF23, was, wenn ich mich nicht verrechnet habe -221 sein dürfte. sprich er würde 221 bytes zurückspringen. die richtigen far-jumps funktionieren wie zacherl sagt. ich bezweifel abergerade, dass du das so hooken kannst...wenn ich deinen code richtig verstehe überschreibst du am procedure-einsprungspunkt die ersten 5 bytes mit einem neuen Jump, richtig? müsste es dann nicht heißen @adresse-@opfer-5 um den sprung zu berechnen? HTH Frank |
Re: "Hooken", der Jumpbefehl etc
Denn call-Opcode gegen den jmp-Opcode zu tauschen geht ohne Probleme, allerdings musst du dann nach der Zieladresse noch ein ret setzen.
|
Re: "Hooken", der Jumpbefehl etc
So wie ich es gepostet habe wird es in allen Inline Hook Funktionen, die ich bisher gesehen habe verwendet. Google mal nach Inline Hook .. da findest du einige Units, die du als Vorlage verwenden könntest. uallHook verwendet glaube ich mitunter auch Inline Hooks, soweit ich mich erinnere. Dort findest du allerdings auch noch die IAT Hook, die Trap Hook und die Table Hook Methoden.
|
Re: "Hooken", der Jumpbefehl etc
@Zacherl: Danke für die Tipps. Wobei ich hier in dem Thread eigentlich gar nicht so direkt aufs hooken selbst eingehn wollte ;)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz