Da ich im geschäftlichen Umfeld nur mit Java, Shellsprachen und Websprachen arbeite, habe ich mich die letzten Tage privat mit C++ beschäftigt. Der grundsätziche Aufbau ist mir nun bewusst und vieles kann ich von anderen Sprachen ableiten. Nun habe ich mich intensiver mit DirectInput-Hooks in Zusammenhang mit DirectX-Games beschäftigt und bin gerade an einem Punkt, an dem ich nicht mehr weiter weiss.
Natürlich habe ich auch schon recherchiert und einige tolle Erklärungen/Anleitungen gefunden (auch eine von EPVP). Nun noch kurz zu meinen Überlegungen/Zielen:
Ziel
Ich möchte eine Serverquery in einem Spiel programmieren. Die Query sollte auf Chatcommands reagieren und dementsprechend Funktionen an mein Backend weiterleiten. So könnte ich meine Applikationen über das Spiel steuern lassen.
Überlegungen vor dem Programmieren
Ich habe mir mit meiner bisherigen Erfahrung mit Computersprachen folgendes Szenario überlegt: Die wohl eleganteste Lösung wäre ein Proxy. Diesen könnte ich zwischen meinen Server und das Spiel hängen und die damit austauschenden Pakete kontrollieren/modifizieren. Nun geht es bei meinem Spiel um ein MMORGP und da wird es wahrscheinlich relativ schwierig sein den Algorithmus der Pakete herauszufinden. Soweit so gut, was bleibt also noch übrig? Ich könnte versuchen die Hooks des Senden/Empfangen von Nachrichten zu finden. Dies wäre wohl die schönste Lösung neben dem Proxy. Nur habe ich da folgendes Problem: Wie zur Hölle finde ich solche Hooks? Ich bin da leider viel zu unerfahren und finde keine guten Erklärungen zu der Vorangehensweise bei solchen Aufgaben
Was bleibt mir also noch übrig? - Ja, da müsste ich mich jetzt wohl auf die altbekannte Key-Input Variante beschränken. Wieso nicht einfach als erstes einen einfachen Sender programmieren? Damit könnte ich von meinen Applikationen aus Nachrichten ins Spiel transferieren. Soweit so gut; ich habe also mit der Keyinput-Variante angefangen. Schnell wurde mir klar, dass ich bei dem Spiel etwas komplexere Methoden verwenden muss (die normalen SendInput, SendMessage, ... Methoden gehen nicht). Aus diesem Grund habe ich mich in Direct X bzw DirectInput-Hooks eingelesen und angefangen mir einen Hook mit einer Trampoline zu schreiben.
Aktueller Stand
Mein Hook wird korrekt injected und erkennt alle meine Eingaben. Ich kann die Eingaben abfangen und weitergeben. Nun hänge ich bei folgendem Problem: Wie kann ich die Tastenschläge modifizieren?
In meiner eigenen DeviceState-Funktion bekomme ich mein Input-Device mit der zugehörigen Startadresse der Input-Data und deren Länge. Über diese Startadresse finde ich also den Speicherort des aktuellen Tastendruck-Codes (zumindestens habe ich das so verstanden) und kann ihn auslesen. Laut einem Beispiel wird das folgendermassen gemacht:
Code:
static BYTE buffer[256]; //Buffer, in welchem der Tastencode abgelegt werden kann HRESULT temp = DI_OK; //standardmässige Antwort (wird vom Originalhook erwartet) if (!Freeze) { temp = pGetDeviceState(lpDevice, cbData, lpvData); // Aufruf der Originalfunktion und dessen Antwort memcpy(buffer, lpvData, cbData); //Der Tastencode wird für eine spätere Verwendung in den Buffer kopiert } else { memcpy(lpvData, buffer, cbData); //Der letzte Tastencode (welcher im Buffer gespeichert ist) wird anstelle des neuen Codes weitergegeben. }
Ich entschuldige mich für den längeren Text, aber ich glaube so versteht man mich am besten. Ich wäre natürlich sehr erfreut wenn eine der ersteren Varianten möglich wäre und man mich da auf den richtigen Weg leiten könnte (Wie kann ich die Pakete entschlüsseln und modifizieren oder wie finde ich einen Send/Receive-Hook von Nachrichten?).
Falls etwas nicht klar sein sollte -> Einfach fragen. Ich versuche alles so genau wie möglich zu erklären und erhoffe mir hier eine kleine Hilfe damit ich endlich weiterkomme.
Vielen Dank im Voraus!