Einzelnen Beitrag anzeigen

Spielie96
(Gast)

n/a Beiträge
 
#1

Hilfe bei legalem Packet Sniffer benötigt

  Alt 12. Dez 2019, 16:25
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!!
  Mit Zitat antworten Zitat