| Autor |
Beitrag |
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 06.11.07 08:22
Hi
ich möchte eine DLL injecten und dort con ein paar Programmstellen in eine Funktion von meiner DLL springen ("call hook")
Die Funktion soll ungefähr so aussehen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure hook; POP lok.Variable //return offset finden PUSHAD if(lok.Variable=Wert1) then Call Funktion1 else if(lok.Variable=Wert2) then Call Funktion2 else Call Funktion3; POPAD //Hier dann Originalanweisung ausführen If(lok.Variable=Wert1) then ...//Code1 ... JMP lok.Variable+5 //und zurück |
nur pseudomäßig
jetzt weiß ich nicht, wie ich das genau umsetze
alles in ASM coden? Weil Delphi fügt ja nen HAufen Zeug dazu...
Was muss die Prozedur sein? STDCALL? oder was? wo ist da der unterschied?
Wie Kriege ich dieses return offset? (ist ja das oberste nach dem funktionsaufruf)
dann ist es ja so, dass bei manchen funktionen die paramter in eax,edx...und bei anderen nur auf dem stack sind. entsprechend müssten ja auch meine Funktion1..FUnktion3 sein. wie kann ich das machen?
für ein paar bsp und Tips was ich noch beachten muss wäre ich dankbar
Moderiert von jasocul: allg. Code-Tags hinzugefügt
Moderiert von jasocul: Topic aus Algorithmen, Optimierung und Assembler verschoben am Di 06.11.2007 um 08:30
Zuletzt bearbeitet von Flamefire am Mi 07.11.07 15:27, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 06.11.07 16:54
Siehe uallCollection.
Zum Aufbau: Wo willst Du hooken? Beliebige Codestellen oder aufgerufene Funktionen ersetzen?
Außerdem: Man macht meist für jede gehookte Funktion eine eigeneHook-Funktion.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 06.11.07 19:46
uall bringt mir nix...
ich nehm lieber das eigene ^^
es sind beliebige codestellen
ich möchte eben mehrere codestellen hooken und dann auf eine zugehörige funktion umleiten
na gut es dürfte auch gehen mit jede codestelle auf eine andere funktion
ok
bleibt noch die frage, wie ich das mit dem stdcall und damit mit den paramtern schaffe und wie ich den stack und die register unverändert lasse (be ner normalen codecave reicht ja ein pushad/popad)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 06.11.07 21:39
Brauchst Du in deiner Hook-Funktion irgendwas Spezielles an Parametern? Wenn Nein, ist die Aufrufkonvention egal.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 07.11.07 13:40
doch ich brauche was spezielles
teilweise sind es calls die ich hooke (parameter werden vorher gepusht)
und anderereseits sind es codestellen (da brauch ich dann die register)
aber frage steht noch: wie kann ich verhindern dass register/stack verändert werden?
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 07.11.07 20:03
so hab jz mal was probiert:
der code (teil) in ne dll gepackt und injected an ne stelle wo ne messagbox aufgerufen wird
ich ruf erst mal nur ne 2. auf
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure got(s:String);stdcall; begin showmessage(s); end;
procedure testen;cdecl;asm pop ret pushad cmp ret,pinject je go @@go:MOV EAX,DWORD PTR SS:[EBP-4] push eax call got popad MOV EAX,DWORD PTR SS:[EBP-4] Call $004042D0 mov ret,$0044F05F jmp ret end;
procedure DLLMain(); var asmarray:array[0..5] of Byte; begin asmarray[0]:=$E8; PCardinal(@asmarray[1])^ := Cardinal(@testen) - Cardinal(pinject) - 5; WriteBytes(Ptr(pinject),@asmarray,Length(asmarray)); end; |
Frage:
wie kann ich den Call ordnetlich machen? der Call $004042D0 bringt den fehler: "ungültige kombination opcode und operanden"
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 09.11.07 13:09
Wenn Du Calls hooken willst, nimmst Du einfach den Call-Befehl und schreibst diesen auf die Adresse deiner Methode um. Diese hat als Parameter-Signatur genau die gleichen Paramter wie die eigentliche Funktion auch.
Für das Hooking von Code-Stellen nimmste nen Code Overwrite-Hook (uallCollection). und nutzt dann eine zweistufige Hook-Funktion: Der erste Teil kümmert sich drum, die Register zu sichern und auf'n Stack zu legen und ruft dann im zweiten Teil deine eigentliche Hook-Procedure auf, die als Parameter die auf dem Stack befindlichen Register erwartet.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Fr 09.11.07 13:23
das mit den codestellen macht meine funktioon ja:
sichern der register
aufruf funktion
restoren der register
originalcode
und zurück
aber wie kann ich einen call auf ein offset machen?
Hab jetzt so:
mov tmp,$47687223
call tmp
gehts anders?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 09.11.07 13:33
Den Original-Call-Opcode überschreiben.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Fr 09.11.07 13:40
was?
das ist der original code:
Quelltext 1: 2:
| MOV EAX,DWORD PTR SS:[EBP-4] <--Das wird mit Call auf meine funktion überschrieben Call $004042D0 |
jetzt möchte ich den originalcode noch ausführen
aber delphi meckert ja bei Call $004042D0
BTW: kannst vl gleich bei meinem andren Thema gucken? hängt damit zusammen: www.delphi-forum.de/viewtopic.php?t=78088
|
|
AHT
      
Beiträge: 207
|
Verfasst: Sa 10.11.07 15:28
Er meint den OPCODE suche mal in der ASM Hilfe nach Opcode und arbeite etwas mit einem Disassembler, dann wird es klarer.
Microsoft verwendet in vielen System-DLLs einen Trick: Die ersten Bytes einer Funktion werden mit Sinnlosem Code ausgestattet - die können also gefahrlos überschrieben werden (scheinbar um Firewall- und Anti-Viren-Programmherstellern das schreiben von Hooks zu erleichtern).
In der Regel wird das dann so gemacht, dass die ersten Bytes an der mit GetProcAddress ermittelten Einsprungsadresse einer Funktion mit dem Opcode eines Jumpbefehls auf die eigene Prozedur überschrieben werden. "Zurückgejumpt" werden muss dann erst wieder auf die Bytes, die sinnvollen Code enthalten. Welche Bytes sinnvollen Code enthalten, ist abhängig von der jeweiligen Windowsversion. Das ganze nennt sich Inline-Hooking.
Neben dem Inline-Hooking gibt es dann noch das IAT-Hooking. Dabei wird im Header der geladenen DLL der Vertweis auf die Einsprungsadresse überschrieben. Kernelmode Hooks verwenden in der Regel diese Methode.
Gruß
AHT
|
|
|