[HowTo] Api-Hooking -- Interesse?

Ein HowTo zum API-Hooking?

  • Klar,ich werde es aufjedenfall lesen!

    Abstimmungen: 0 0,0%
  • Knnst du gerne machen,werds aber warscheinlich nicht lesen!

    Abstimmungen: 0 0,0%
  • Unsinn,man braucht dazu kein HowTo.

    Abstimmungen: 0 0,0%
  • Bitte nicht,wer weiß was Kiddies damit anstellen?!

    Abstimmungen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    0
Problem mit dem COde

Also zuerst einmal Hallo, dies ist mein erster Beitrag hier im Board, und der ist natürlich gleich wieder eine (wahrs.) dumme Frage. :D
Ich programmiere mit Delphi (vorher jahrelang VB6*duck*) und bin erst seit kurzem in die Tiefen der etwas systemnäheren Programmierung eingestiegen. Das Tutorial hat mir sehr gut gefallen und ist mir vom Prinzip her auch verständlich. Ich habe jetzt einmal versucht das gleiche in Delphi zu machen.
Und wie man es sich hätte denken können:
Es funktioniert nicht richtig. :(
Das Umbiegen der Funktion auf die Check-Funktion funktioniert tadellos, aber wenn ich new_address aufrufen will, kommt folgender Fehler:
Exception EAccessViolation in module API_hook_real2.exe at 0000874D.
Ich habe schon alles versucht, beim ersten Mal hatte ich das Tutorial etwas freier interpretiert, als der Fehler da auch schon auftrat, habe ich es noch einmal ganz genau nach Vorlage probiert, was aber auch nichts geändert hat. Vllt ist es ein ganz einfacher Fehler der entweder durch meine Blödheit, oder den etwas "dörti" Code von Xalon (sieht für mich so aus :D) hervorgerufen wird.
Mein Code sieht so aus: (Konsolenanwedung)



Code:
program API_hook_real2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows;


procedure new_adress(i : Integer);
begin
  asm
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  end;
end;

procedure Output(I : Integer);
begin
If i = 5 Then WriteLn('HA Ha..5 Geht doch!');
If i <> 5 Then WriteLn('Kein Problem! ' + IntToStr(i) + ' ist eine erlaubte Zahl.');
end;


procedure check(I : Integer);
begin
WriteLn('CHECKED ' + IntToSTr(i));
new_adress(i); //Fehlerquelle
end;

function SprungOffset(Absprung : Pointer; Ziel : Pointer) : Integer;
begin
Integer(Absprung) := Integer(Absprung) + 5;
Integer(Result)   := Integer(ziel) - Integer(Absprung);
end;




procedure hook_function(source_function : Pointer;
                       bytes_to_save : Integer;
                       new_adress : Pointer;
                       instead_call : Pointer;
                       ProcessID : Cardinal) ;
var
hProz : Cardinal;
byteq : integer;
temp_adress : array[0..10] of Pointer;
i : Integer;
rw : Cardinal;
sprungweite : Integer;
sprungweite2 : Integer;
begin
rw := 0 ;
hProz := OpenProcess(PROCESS_ALL_ACCESS,False, ProcessID);
temp_adress[0] := source_function;
temp_adress[1] := new_adress;
For i := 0 To (bytes_to_save) Do begin
  //erstes Byte wird gelesen
  ReadProcessMemory(hProz, source_Function, @byteq, SizeOf(byteq),rw );
  //und in die neue Funktion Eingefügt
  WriteProcessMemory(hProz,new_adress, @byteq, sizeOf(byteq),rw);
  //dann wird die neue Adresse um eins Erhöht
  new_adress := Pointer(Integer(new_adress) + 1);
  byteq := $90;
  //die Stelle in der Original Funktion wird mit NOP überschrieben
  WriteProcessMemory(hProz,source_function, @byteq, sizeOf(byteq),rw);
  source_function := Pointer(Integer(source_function) + 1);
end;

source_function := temp_adress[0];
byteq := $E9;
//JUMP SCHREIBEN AN DER ORIGINALFUNKTION
WriteProcessMemory(hproz, source_function, @byteq, sizeof(byteq), rw);
sprungweite := sprungoffset(source_function,instead_call);
source_function := Pointer(Integer(source_function) + 1);
WriteProcessMemory(hproz, source_function, @sprungweite, sizeof(Sprungweite), rw);
//JUMP SCHREIBEN BEI DEN GESICHERTEN BYTES
byteq := $E9;
new_adress := temp_adress[1];  //wiederherstellen
new_adress := Pointer(Integer(new_Adress) + Integer(bytes_to_save));//erhöhen
//einen JMP zu der "Anstatt"funktion schreiben
WriteProcessMemory(hproz,new_adress,@byteq,sizeof(byteq),rw);
new_adress := Pointer(Integer(new_adress) + 1);//erhöhen
//Die Sprungweite hinter den JMP schreiben
sprungweite2 := sprungoffset(Pointer(Integer(temp_adress[1]) + Integer(bytes_to_save)), Pointer(Integer(temp_adress[0]) +5 ));
WriteProcessMemory(hproz, new_adress, @sprungweite2, sizeof(sprungweite2), rw);
Closehandle(hProz);
end;
begin
  Hook_FunctioN(@output, 6, @new_Adress, @Check, GetCurrentProcessID);
  output(4);
  output(5);
  ReadLn;
end.
Danke im Voraus...
.garfield
 
Da haste schon recht, der Code suckt (aber er funzt ;) )

Hast du das ganze schon mal mitm OllyDebugger geladen und dann geschaut was er genau macht?
So hab ich jedenfalls den Code im Tut debuggt und es is gar nicht so schwer wie man denkt.

mfg
Xalon
 
Ich kenne mich damit nicht besonders gut aus, aber soweit ich nachvollziehen konnte, wird in das NOP-Array durchaus geschrieben.

Olly zeigt mir aber als Fehlermeldung :
Access Violation when Writing to [00000004]

Diese Meldung kommt wiederholt, wahrs. bei jedem Durchgang der For-Schleife, mit exakt der selben Adresse.
//edit:
das ist die neue_adresse funktion
Olly markiert stets dabei folgende Zeile:
Code:
0040874C  /$ 55             PUSH EBP
0040874D  |. 0000           ADD BYTE PTR DS:[EAX],AL <- Die hier!
0040874F  |. 0000           ADD BYTE PTR DS:[EAX],AL
00408751  |. 00E9           ADD CL,CH
00408753  |. 1A00           SBB AL,BYTE PTR DS:[EAX]
00408755  |. 0000           ADD BYTE PTR DS:[EAX],AL
00408757  |. 90             NOP
00408758  |. 90             NOP
00408759  |. 90             NOP
0040875A  |. 90             NOP
0040875B  |. 90             NOP
0040875C  |. 90             NOP
0040875D  |. 90             NOP
0040875E  |. 90             NOP
0040875F  |. 90             NOP
00408760  |. 90             NOP
00408761  |. 90             NOP
00408762  |. 90             NOP
00408763  |. 90             NOP
00408764  |. 90             NOP
00408765  |. 90             NOP
00408766  |. 90             NOP
00408767  |. 90             NOP
00408768  |. 90             NOP
00408769  |. 90             NOP
0040876A  \. C3             RETN
 
Hmm Stimmt, die Originalfunktion sieht in Wirklichkeit so aus:
Code:
0040876C  /$ 55             PUSH EBP
0040876D  |. 8BEC           MOV EBP,ESP
0040876F  |. 6A 00          PUSH 0
00408771  |. 6A 00          PUSH 0
00408773  |. 53             PUSH EBX
00408774  |. 8BD8           MOV EBX,EAX
00408776  |. 33C0           XOR EAX,EAX
00408778  |. 55             PUSH EBP
00408779  |. 68 FD874000    PUSH API_hook.004087FD
0040877E  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00408781  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00408784  |. 83FB 05        CMP EBX,5
00408787  |. 75 19          JNZ SHORT API_hook.004087A2
00408789  |. A1 04934000    MOV EAX,DWORD PTR DS:[409304]
0040878E  |. BA 14884000    MOV EDX,API_hook.00408814                ;  ASCII "HA Ha..5 Geht doch!"
00408793  |. E8 C4BBFFFF    CALL API_hook.0040435C
00408798  |. E8 DBA8FFFF    CALL API_hook.00403078
0040879D  |. E8 06A2FFFF    CALL API_hook.004029A8
004087A2  |> 83FB 05        CMP EBX,5
004087A5  |. 74 3B          JE SHORT API_hook.004087E2
004087A7  |. 68 30884000    PUSH API_hook.00408830                   ;  ASCII "Kein Problem! "
004087AC  |. 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
004087AF  |. 8BC3           MOV EAX,EBX
004087B1  |. E8 5ED5FFFF    CALL API_hook.00405D14
004087B6  |. FF75 F8        PUSH DWORD PTR SS:[EBP-8]
004087B9  |. 68 48884000    PUSH API_hook.00408848                   ;  ASCII " ist eine erlaubte Zahl."
004087BE  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
004087C1  |. BA 03000000    MOV EDX,3
004087C6  |. E8 55BAFFFF    CALL API_hook.00404220
004087CB  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004087CE  |. A1 04934000    MOV EAX,DWORD PTR DS:[409304]
004087D3  |. E8 84BBFFFF    CALL API_hook.0040435C
004087D8  |. E8 9BA8FFFF    CALL API_hook.00403078
004087DD  |. E8 C6A1FFFF    CALL API_hook.004029A8
004087E2  |> 33C0           XOR EAX,EAX
004087E4  |. 5A             POP EDX
004087E5  |. 59             POP ECX
004087E6  |. 59             POP ECX
004087E7  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
004087EA  |. 68 04884000    PUSH API_hook.00408804
004087EF  |> 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
004087F2  |. BA 02000000    MOV EDX,2
004087F7  |. E8 14B7FFFF    CALL API_hook.00403F10
004087FC  \. C3             RETN
aber warum das so ist, kann ich wirklich nicht erraten. :(
 
Zurück
Oben