Einzelnen Beitrag anzeigen

InfixIterator

Registriert seit: 25. Nov 2007
16 Beiträge
 
#1

uallCollection bringt Zielprozess mit WriteLn zum absturz...

  Alt 22. Dez 2012, 00:52
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
  Mit Zitat antworten Zitat