Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 06:47

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Eine kleine Frage zu DirectInput / DirectX

Discussion on Eine kleine Frage zu DirectInput / DirectX within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1

 
NoTeefy's Avatar
 
elite*gold: 173
Join Date: Jun 2014
Posts: 286
Received Thanks: 57
Question Eine kleine Frage zu DirectInput / DirectX

Guten Abend miteinander

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.
	}
Nun stellt sich mir die Frage: Um eigene Tastenschläge übergeben zu können, müsste ich diese im Buffer modifizieren. Nur wie setzen sich diese auseinander? Wie sieht der Code einer Taste in einem byte[257] aus?

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!
NoTeefy is offline  
Old 04/01/2016, 00:55   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
lass dir doch einfach mal ausgeben was in dem buffer so drinsteht

kannst dir ja mal buffer[DIK_ENTER] ausgeben lassen und dann die enter taste drücken und gucken was passiert
in der dinput.h findeste btw. auch die restlichen definierten codes - allerdings das beachten was oben in dem link steht.

in meiner sig ist btw. nen hookingtutorial von mir, da wird u.a. directinput gehookt
Dr. Coxxy is offline  
Old 04/01/2016, 02:16   #3

 
NoTeefy's Avatar
 
elite*gold: 173
Join Date: Jun 2014
Posts: 286
Received Thanks: 57
Question

Quote:
Originally Posted by Dr. Coxxy View Post
lass dir doch einfach mal ausgeben was in dem buffer so drinsteht

kannst dir ja mal buffer[DIK_ENTER] ausgeben lassen und dann die enter taste drücken und gucken was passiert
in der dinput.h findeste btw. auch die restlichen definierten codes - allerdings das beachten was oben in dem link steht.

in meiner sig ist btw. nen hookingtutorial von mir, da wird u.a. directinput gehookt
Erst einmal vielen lieben Dank für die Antwort. Dein Tutorial habe ich vor 2 Tagen entdeckt und interessiert durchgelesen - echt toll, wirklich
Ich bin mittlerweile selbst darauf gekommen die Keys im Buffer zu setzen, nur bringt das nicht wirklich was :/
Was habe ich entdeckt: Wenn ich den Buffer leer sende kommt kein Key von mir mehr an - DirectInput muss also etwas damit zu tun haben. Wenn ich manuell eine Taste drücke kommt es in den Buffer (also vom Spiel aus). Wenn ich nun aber selber nicht drücke und meine DLL das für mich erledigt (der Buffer ist genau gleich wie beim manuellen Drücken gefüllt und auch für die gleich lange Zeit) passiert leider absolut nichts. Woran liegt das? Der Buffer ist in beiden Fällen (manuell und programmiert) für 4 GetState-Abfragen gedrückt. Pro Sekunde kommen um die 30 Abfragen vom Spiel.
Nun bekomme ich langsam die Befürchtung, dass das Spiel mehrere Inputmöglichkeiten abgleicht... Kann das überhaupt sein und falls ja: Welche Varianten kommen da noch in Frage? Und wäre es nicht einfacher/sinnvoller die Send-/Empfangstelle des Spiels herauszufinden? Dadurch könnte ich ja dann meine modifizierten Texte mit einem call an die gleiche Funktion senden oder sehe ich das falsch?
NoTeefy is offline  
Old 04/01/2016, 07:32   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
wäre eigtl. seltsam, wenn er, wenn der buffer leer ist keine keys mehr erkennt, aber wenn du selber welche setzt er sie nicht registriert - biste sicher, dass du alles richtig gemacht hast? zeig mal kompletten code vom hook, wo du wie tasten sendest. - tipp, es kann gut sein, dass du tasten für einen bestimmten zeitraum "gedrückt halten" musst, damit sie registriert werden.
Dr. Coxxy is offline  
Old 04/01/2016, 13:59   #5

 
NoTeefy's Avatar
 
elite*gold: 173
Join Date: Jun 2014
Posts: 286
Received Thanks: 57
Quote:
Originally Posted by Dr. Coxxy View Post
Ich habe es extra so gemacht, dass er die Tasten eine bestimmte Zeit lang drückt und dann wartet und dann die nächste Taste simuliert.
Aktuell ist es noch ein Endlooslop, welcher folgendes machen soll (achja btw: Wenn ich manuell extrem schnell drücke wird nur ein einziger GetState Call mit Inhalt gemacht und selbst den erkennt das Spiel):
{ENTER} /g tEst {ENTER}{ENTER}

Code in meinem Thread
Code:
while (true) {
		add_log("Starting Cycle again");
		KEYTOWRITE = DIK_RETURN;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_SLASH;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_G;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_G;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_SPACE;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_T;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_E | DIK_LSHIFT;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_S;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_T;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_RETURN;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		KEYTOWRITE = DIK_RETURN;
		Sleep(100);
		KEYTOWRITE = 0x00;
		Sleep(1000);
		Sleep(10);
	}
Code in meiner eigenen DeviceState
Code:
memcpy(buffer, lpvData, cbData);
if (KEYTOWRITE > 0x00) {
	//add_log("User is pressing key: %x", KEYTOWRITE);
	buffer[KEYTOWRITE] = 0x80;
}
else if (KEYTOWRITE == 0x00 && LASTKEY > 0x00) {
	for (int i = 0; i < sizeof(buffer); ++i) {
		buffer[i] = 0x00;
	}
	//add_log("User released key: %x", KEYTOWRITE);
}
else {
	//nothing
	//add_log("Nothing happened: %x", KEYTOWRITE);
}
memcpy(lpvData, buffer, cbData);
//add_log("Enterkey: %d", buffer[DIK_RETURN]);
temp = pGetDeviceState(lpDevice, cbData, lpvData);
LASTKEY = KEYTOWRITE;
return temp;
}
EDIT: So, ich habe nun noch ein wenig experimentiert und beide Fälle miteinander kombiniert. Da ich über Spy++ gesehen habe, dass bei meinen Tasteneingaben Windows Messages versendet werden habe ich diese auch integriert. Nun sendet meine DLL gleichzeitig die Windows und DirectInput Calls und trotzdem passiert nichts. Wenn ich manuelle Eingaben mache funktioniert alles korrekt. Was ist hier der Fehler? Gibt es noch mehr Inputvarianten als Windows-Messages und DirectInput?
Hier noch eine Veranschaulichung:
NoTeefy is offline  
Old 04/04/2016, 12:52   #6

 
NoTeefy's Avatar
 
elite*gold: 173
Join Date: Jun 2014
Posts: 286
Received Thanks: 57
Weiss da keiner weiter? :/
Ich bin echt am verzweifeln...
NoTeefy is offline  
Old 04/10/2016, 22:48   #7

 
NoTeefy's Avatar
 
elite*gold: 173
Join Date: Jun 2014
Posts: 286
Received Thanks: 57
Bump, stehe immer noch vor dem gleichen Problem :/
NoTeefy is offline  
Old 04/11/2016, 18:08   #8
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
ka, ohne jetzt selber dazusitzen und zu testen halt schwierig.
kannst mal versuchen obs in inem anderem spiel funktioniert, also das problem nur bei dem spiel auftritt und es generell funktioniert.
ansonsten mal nur 1en in den buffer schreiben (0xFF), oder mit nem debugger tracen und gucken was er mit den daten macht, etc.
Dr. Coxxy is offline  
Old 04/20/2016, 00:31   #9

 
NoTeefy's Avatar
 
elite*gold: 173
Join Date: Jun 2014
Posts: 286
Received Thanks: 57
Quote:
Originally Posted by Dr. Coxxy View Post
ka, ohne jetzt selber dazusitzen und zu testen halt schwierig.
kannst mal versuchen obs in inem anderem spiel funktioniert, also das problem nur bei dem spiel auftritt und es generell funktioniert.
ansonsten mal nur 1en in den buffer schreiben (0xFF), oder mit nem debugger tracen und gucken was er mit den daten macht, etc.
Ja aber ist das denn überhaupt die richtige Angehensweise? Ich habe ja extra meine Fragen aufgeschrieben und diese kannst du mir wohl auch nicht wirklich beantworten... Wäre es nicht sinnvoller den Hook im Programm zu finden, bei welchem die Chats empfangen/gesendet werden? Oder denke ich da falsch? Was könnten weitere Fehlerquellen sein? Kann ein Spiel auch den DirectInput verwenden aber die KeyInputs trotzdem mit der Hardware abgleichen?
NoTeefy is offline  
Reply

Tags
d3dx9, directinput, directx, game hacking, hook


Similar Threads Similar Threads
Nur eine kleine Frage :)
03/17/2016 - Metin2 Private Server - 5 Replies
Hallo Liebe Community, Und zwar hätte ich nur eine kleine Frage vielleicht kann es mir ja einer beantworten. Und zwar geht es um die Kori files, die Files sind ja so ganz gut aber da wo ich angefangen hab mit Servern ( das war noch damals Daroo ) ging das Waffen und Rüstungen einfügen noch ganz easy. Einfach item_proto einfügen die icons halt item_list alles reinhauen und in Datenbank noch die querys. Aber jetzt bei den Kori files ist es alles anders und mann kann sie auch nicht...
Eine kleine frage
03/24/2011 - Metin2 Private Server - 8 Replies
also was muss ein root server haben für MT2 is ja klar für 2000-3000 spielern?? also was für nen system usw bitte auflisten gebe auch danke :)
Eine kleine Frage
10/23/2010 - AutoIt - 1 Replies
Hallo Ich habe ein AutoIt script wenn ich sie über die Go Taste öffne kommt alles was sein muss aber wenn ich Compile mache zeigt er mir nur noch die hälfte was mache ich falsch
Eine kleine frage??
09/07/2010 - WarRock - 2 Replies
Gibt es eigendlich einne hack oder dinar hack wo der dinar hack geht also ich hab nen hack da geht der aber man kann nichts kaufen mit dem money danke für antworten:D



All times are GMT +1. The time now is 06:48.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.