Hallo,
ich habe ein kleines Problem und ich hoffe sehr, dass ihr mir dabei helfen könnt. Ich habe vor einigen Wochen einen Auftrag angenommen, für den meine Firma einige sicherheitstechnische Aspekte eines älteren MMORPG prüfen muss. Wir sind hiermit schon fast durch und es fehlen nur noch ein paar Kleinigkeiten. Wir benötigen für die letzte Testreihe noch einen Packet Sniffer für
eingehende Pakete. Leider ist unser hausinterner Experte auf dem Gebiet seit Montag für längere Zeit krankgeschrieben und es bleibt somit an mir hängen.
Ich bin also hergegangen und habe den von ihm entwickelten Packet Editor (für ausgehende Pakete) beim Pointer/Hook angepasst. Leider funktioniert es nicht wirklich... das Script gibt zwar sämtliche Rückmeldungen aus, allerdings crasht der Client des Spiels bei der Übermittlung des abgefangenen Paketes an die ursprüngliche Funktion. Das integrierte AntiCheat-System wurde bereits umgangen und greift nicht. X32dbg gibt vor dem Crash folgende Meldung aus: "Erste Ausnahme [First chance
exception] bei 701FB224 (C00000FD, EXCEPTION_STACK_OVERFLOW)!".
Ich bin in diesem Bereich überhaupt kein Experte, allerdings vermute ich, dass der Fehler irgendwie mit dem Move der Funktion im Memory zusammenhängt. Ich kann hier leider keine detaillierten Informationen zum Script preisgeben, da diese auch in den falschen Händen landen könnten.
Folgendes kann ich preisgeben:
Code:
procedure PlaceHook(ReplacementAddress: Pointer);
begin
NearJmpSpliceRec.ReplAddr := ReplacementAddress;
InitNearJmpSpliceRec(Pointer(NativeUInt(GetModuleHandleA('XXXXX.dll')) + $XXXXXX), @Proxy);
end;
procedure Proxy(Message: PNetworkMessage; Login: Boolean); stdcall;
begin
try
begin
SpliceNearJmp(NearJmpSpliceRec.FuncAddr, NearJmpSpliceRec.OldData);
TSendToServerNew(NearJmpSpliceRec.ReplAddr)(Message, Login);
// Call original func
TSendToServerNew(NearJmpSpliceRec.FuncAddr)(Message, Login); //<-- Hier steigt das Script aus ohne in die
Exception zu springen.
SpliceNearJmp(NearJmpSpliceRec.FuncAddr, NearJmpSpliceRec.NewData);
end;
except
on E :
Exception do
begin
MessageBox(0, PChar(E.ClassName+' error raised, with message : '+E.Message), '', MB_TOPMOST);
end;
end;
end;
procedure SpliceNearJmp(FuncAddr: Pointer; NewData: TNearJmpSpliceRec);
var
OldProtect: DWORD;
begin
VirtualProtect(FuncAddr, SizeOf(TNearJmpSpliceRec), PAGE_EXECUTE_READWRITE, OldProtect);
try
Move(NewData, FuncAddr^, SizeOf(TNearJmpSpliceRec));
finally
VirtualProtect(FuncAddr, SizeOf(TNearJmpSpliceRec), OldProtect, OldProtect);
FlushInstructionCache(GetCurrentProcess, FuncAddr, SizeOf(TNearJmpSpliceRec));
end;
end;
Gerne zahle ich auch für einen Fachkundigen, der sich dem Problem annehmen möchte und einen vollständigen Einblick in das Script erhält. Das Script muss schnellstmöglich - spätestens bis morgen gegen 16:30 - fertiggestellt werden, damit wir unsere Fristen einhalten können.
Wir wurden mit der Prüfung des Online-Spiels durch den Publisher beauftragt. Es steht somit keine Computersabotage im Raum und die Entwicklung und das Testen des Online-Spiels durch uns ist somit legal.
Vielen Dank im Voraus!!