Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dll trainer (https://www.delphipraxis.net/107811-dll-trainer.html)

k4ni 2. Feb 2008 16:15


dll trainer
 
hallo DP,

Ich habe in einem anderen forum in einem thread gesehen wie man eine art dll trainer machen kann.
Also hab ich schonmal etwas simpeles getestet:
Delphi-Quellcode:
library debugger;

uses
  SysUtils,
  Classes;

{$R *.res}
procedure Random()stdcall;assembler;
asm
mov byte ptr [$008B0108],$74
end;

exports
  Random;

begin
end.
"$008B0108" ist einfach ne addresse die ich genommen hab von dem spiel MineSweeper.
Opcode "jne 008b010a". 75 = "jne" und 74 = "je".
Also wenn ich mit einem dll-injector (ich hab Cheat Engine benützt) die dll injecte und die function bzw. die procedure Random aufrufe ändert er den opcode genau so wie ich es wollte zu "je 008b010a".

Doch ich will diese dll injecten ohne eine function auf zu rufen.
Dann mit einer normalen delphi Anwedung durch einen buttonklick die procedure aufrufen, da bin ich auf dllmain gekommen.

Und dann bin ich zu diesem code gekommen:
Delphi-Quellcode:
library debugger;

uses
  SysUtils,
  Classes,
  Windows;

{$R *.res}


procedure DllMain(reason: integer) ;
var
  buf : array[0..20] of char;
  loader : string;
begin
   case reason of
     DLL_PROCESS_ATTACH:
     begin
       GetModuleFileName(0, buf, SizeOf(buf)) ;
       loader := buf;
       if Pos('winmine.exe', loader) > 0 then
         ExitCode := -1
     end;
     DLL_PROCESS_DETACH:
     begin
       //DLL unloading...
     end;
   end;
end; (*DllMain*)

procedure Random()stdcall;assembler;
asm
mov byte ptr [$008B0108],$74  //75 = jne, 74 = je (short jumps)
end;

exports
  GodMode;

begin
   DllProc := @DllMain;
   DllProc(DLL_PROCESS_ATTACH) ;


   //more DLL code here...
end.
Erstmal zusammenfassung:
Ich will eine dll in einen prozess injecten (MineSweeper/winmine.exe) ohne eine function oder eine procedure zu laden (bis jetzt). Das injecten erstmal mit Cheat Engine.
Dann mit einer delphi anwendung die procedure "Random" die auch in exports steht aufrufen.

Mit dem zuletzt geposted-dem code hab ich mit einer andwendung die export function geladen und durch ein buttonclick ausgeführt.
So:
Delphi-Quellcode:
procedure Random(); external 'debugger.dll' name 'Random';

procedure TForm1.Button1Click(Sender: TObject);
begin
Random();
end;
Doch das funktioniert nicht. Muss ich das anderst machen oder ist das alles komplett falsch?

sirius 2. Feb 2008 16:29

Re: dll trainer
 
Du bist mit deiner Anwendung im falschen Adressraum.

du musst einen code in den anderen Process schreiben (writeProcessMemory) der die DLL lädt. Das ist nicht viel und dürfte auch schon mehrmals in der DP stehen. Suche mal danach. Evtl brauchst du bloß createremotthread aufrufen.
Dabei das HAndle des anderen Processes übergeben, als Startadresse die Adresse der Funktion Loadlibray und als Parameter den mit writeprocessmemory erstellten String der DLL.

k4ni 2. Feb 2008 16:33

Re: dll trainer
 
hey sirius,

Das mit WriteProcessMemory hab ich alles schon gemacht und hat auch klasse geklappt.
Doch ich finde das mit der dll besser bzw. leichter. Das einzige problem ist nur, das ich nicht weis, wie ich die procedure aufrufen kann und sie es nur in dem bestimmtem prozess macht in dem sie ist. (die dll)

sirius 2. Feb 2008 16:46

Re: dll trainer
 
Eine DLL musst du eben unter dem Process laden. Das funktioniert nicht in deinem. Und dazu musst du eben auch ein wenig code in den Process injezieren. Deine Funktion direkt zu injezieren wäre wenger Aufwand als eine DLL erst nachzuladen.

Neotracer64 2. Feb 2008 16:59

Re: dll trainer
 
Du könntest jetz nach dem injecten direkt die Funktion Random mit CreateRemoteThread von deiner Anwendung aus, ausführen.
Aber wieso packst du nicht alles gleich in die Dll?
Ein Dialog mit Button und schon hast du nicht das problem.

sirius 2. Feb 2008 17:12

Re: dll trainer
 
(So jetzt hab ich mal 5 Minuten mehr Zeit)
Etwas so:
Delphi-Quellcode:
procedure injectDLL(ProcessID:Cardinal;const DLLName:string);
var lib:hmodule;
    hProcess:Thandle;
    Dest,StartThread:Pointer;
    temp:cardinal;
begin
  lib:=getmodulehandle('kernel32.dll');
  StartThread:=getprocAddress(lib,Pchar(DLLName));

  hProcess:=openprocess(Process_ALL_ACCESS,false,ProcessID);
  Dest:=virtualallocEX(hProcess,nil,length(DLLName)+1,MEM_COMMIT or MEM_RESERVE,PAGE_READONLY);
  WriteProcessMemory(HProcess,Dest,Pchar(DLLName),length(DLLName)+1,temp);
  CreateRemoteThread(hProcess,nil,0,StartThread,Dest,0,temp);
end;
(ungetestet; ohne Fehlerbehandlung)
Ich bin mir sicher, dass es den Code so oder ähnlich schon in der DP gibt. Hab ihn grad nicht gefunden.

Edit: Und wie du siehst, ist es in deinem fall besser (solange die DLL so klein bleibt) den Code direkt umzuschreiben.

k4ni 3. Feb 2008 01:12

Re: dll trainer
 
danke, damit kann ich ja dann auch von dem prozess lesen indem sie injected ist ne?
Wenn ja, wie könnte ich das als string an eine application senden ? Und wie empfangen?

sirius 3. Feb 2008 11:34

Re: dll trainer
 
Ja, das geht zum Beispiel über Messages oder Memory Mapped Files. Oder auch Sockets. Musst dich halt für eine Kommunikationsart entscheiden.
Pipes würden auch gehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz