Hallo,
ich habe eine
DLL die als AntiCheat-Schutz in einem Spiel dienen soll. Für dieses Spiel gibt es sehr viele Packet Editors (oder eher gesagt Packet Senders), die eine bestimmte Adresse aufrufen. Um zu verhinden dass die Cheater nun ihre PEs injizieren möchte ich bei dieser Adresse gerne prüfen, ob der Aufruf aus der Haupt-EXE oder aus einer geladenen
DLL kommt.
Delphi-Quellcode:
function GetModuleFromAddress(Address: Pointer):
string;
var
Res: HMODULE;
Name:
array[0..100]
of AnsiChar;
begin
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, Address, Res);
GetModuleBaseName(GetCurrentProcess, Res,
Name, 100);
Result :=
string(AnsiString(
Name));
end;
procedure OnSendPacket(Ret: Pointer);
stdcall;
var
F: TextFile;
begin
AssignFile(F, '
C:\test.txt');
Append(F);
Writeln(F, GetModuleFromAddress(Ret));
CloseFile(F);
end;
procedure SendPacket;
stdcall;
asm
mov eax, [ebp]
mov eax, [eax+$04]
push eax
call OnSendPacket
mov eax,$00BF0044
jmp dword ptr [SendPacketRet]
end;
[...] hier wird noch der Speicher modifiziert und ein JMP zu SendPacket() erstellt.
Mein eigentliches Ziel habe ich erreicht - der Name steht in der Textdatei. Leider geht dabei irgendwas kaputt und die Pakete werden vom Spiel nicht mehr weiterverarbeitet
Ich habs leider mit Assembler nicht so, ich vermute das geschieht durch den Aufruf der Delphi-Funktion OnSendPacket, welche dann irgendwelche Register verändert?
Zur Info, das Paket was der Client dann verarbeiten soll wird in ecx gespeichert.