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:
) hervorgerufen wird.
Mein Code sieht so aus: (Konsolenanwedung)
Danke im Voraus...
.garfield
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:
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 ausException EAccessViolation in module API_hook_real2.exe at 0000874D.

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.
.garfield