Hallo,
ich spiele etwas mit der uallCollection von brechi rum und bin sehr begeistert,
jedoch bin ich auf zwei Fragen gestoßen, bei denen ich absolut nicht mehr weiter komme...
Aber hier erstmal die Zwei Programm die ich verwende, als erstes der Zielprozess und danach das
Programm mit dem ich injiziere:
Die zwei Fragen stehen dann darunter.
Hier die Project1.exe:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils; //für FloatToStr, sleep
var i:Integer;
function Funktion1 (arg:double):double; //stdcall;
begin
WriteLn('Function: Much easier to find me this way! '+ FloatToStr(arg));
result := arg;
end;
procedure Funktion2 (); //stdcall;
begin
WriteLn('Function2: This is function2.');
end;
begin
{ TODO -oUser -cConsole Main : Hier Code einfügen }
WriteLn('starting...');
while (true) do
begin
sleep(2500);
Funktion1(3.14);
sleep(2500);
Funktion2();
end;
end.
Hier die InjectMe.exe (ist etwas abgeändert von dem Example "Simple Wallhack with SelfInjection"):
Delphi-Quellcode:
program InjectMe;
{$APPTYPE CONSOLE}
uses
uallDisasm in 'uallCollection\uallDisasm.pas',
uallDisasmEx in 'uallCollection\uallDisasmEx.pas',
uallHook in 'uallCollection\uallHook.pas',
uallKernel in 'uallCollection\uallKernel.pas',
uallProcess in 'uallCollection\uallProcess.pas',
uallUtil in 'uallCollection\uallUtil.pas' , //;
SysUtils, //benötigt für FloatToStr
Dialogs; //für showmessage
var
OriginalFunction: function (a:Double): Double; stdcall;
function callbackUmleitung(a:Double): Double; stdcall;
begin
//Writeln('original function: argument = '+FloatToStr(a) ); //bringt Project1.exe zum absturz...
a:=50.1337;
Result := OriginalFunction(a); //Wert wurde erfolgreich geändert und die Ursprüngliche Funktion wird aufgerufen (mit dem neuen Wert)
end;
function DllMain(p: pointer): integer; stdcall;
var Address : DWORD;
begin
Address := $00408198; //ist: function Funktion1 (arg:double):double; //stdcall;
// showmessage('bla'); //bringt Project1.exe zum absturz...
// Writeln('DllMain started'); //bringt Project1.exe zum absturz...
//hook installieren:
uallHook.HookCode(Pointer(Address),@callbackUmleitung,@OriginalFunction); //funktioniert!
end;
procedure Main;
var dwPID: DWord;
begin
Writeln('press END-key to stop monitoring!');
Writeln('searching for the exe...');
repeat
dwPID := uallProcess.FindProcess('Project1.exe');
Sleep(100);
until (dwPID <> 0) or (GetAsyncKeyState(VK_END) < 0);
if (dwPID <> 0) then
begin
Writeln('exe found...');
uallHook.InjectMe(dwPID,@DllMain);
Writeln('...injected...');
end else
begin
Writeln('Aborted by user. Press RETURN to close.');
end;
ReadLn;
end;
begin
Main;
end.
Funktioniert soweit auch ganz ok, ABER wenn ich in der Funktion callbackUmleitung ein Writeln mache:
Writeln('original function: argument = '+FloatToStr(a) );
Stürzt die Zielanwendung (also Project1.exe) ab... Weiß jemand wieso das so ist? Und kann man das trotzdem irgendwie ausführen lassen? Denn wenn ich in C++ mit MS detour die gleiche Funktion detoure, kann ich dort auch in der Fremden Konsole etwas ausgeben (also dort geht folgendes) :
std::cout << "original function: argument = "<< a << std::endl;
und zwar ohne den Zielprozess zum absturz zu bringen...
Ich habe noch eine zweite Frage: Geht das alles nicht auch einfacher mit: uallHook.HookCode?
Also kann man nicht auch in uallHook.HookCode irgendwie den Prozess mit Pointer übergeben?
Sonst habe ich sowas nur bei
DLL's gesehen, also ala
@origMessageBoxA := GetProcAddress(LoadLibrary('user32.dll'),'MessageB oxA');
uallHook.HookCode(@origMessageBoxA,@callbackMessag eBoxA,@newMessageBoxA);
Nun Frag ich mich, kann man sowas nicht auch mit *.exe-Dateien machen? Quasi sowas wie:
Code:
Address := $00408198;
dwPID := uallProcess.FindProcess('Project1.exe');
@PointerToFunction := GetProcAddress(dwPID,Address); //klar, dass das so nicht wirklich geht, aber gibt es hier etwas äquivalentes?
uallHook.HookCode(@PointerToFunction,@callbackUmleitung,@OriginalFunction);
Über google hab ich leider nichts gefunden, bin darum über jede Hilfe sehr Dankbar!
LG