Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hilfe bei legalem Packet Sniffer benötigt (https://www.delphipraxis.net/202833-hilfe-bei-legalem-packet-sniffer-benoetigt.html)

Spielie96 12. Dez 2019 15:25

Hilfe bei legalem Packet Sniffer benötigt
 
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!!

TurboMagic 12. Dez 2019 21:32

AW: Hilfe bei legalem Packet Sniffer benötigt
 
Die Exceptions, bedeutet die, dass der normale Stack übergelaufen ist? Falls ja, gibt es da zuviele Recursionen oder geht es um einen Exception-Stack?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 Uhr.

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