Einzelnen Beitrag anzeigen
Alt 13.01.08, 11:57   #41 (permalink)
.garfield
 
Registriert seit: 13.01.08
Karma: 4
.garfield Leistung: Facit NTK
Standard 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.
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:
Zitat:
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 ) 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
Angehängte Dateien
Dateityp: rar api_hook_problem.rar (2,2 KB, 4x aufgerufen)
.garfield ist offline   Mit Zitat antworten