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?