Ja über ne Pipe oder einen Socket
League of Legends ingame Chat
-
- [C#]
- jonasX
-
-
-
Mach doch ne dll draus und ich übergebe nur den Text der gesendet werden soll.
-
Die Dll muss aber in den LoL Prozess injected werden. Bedeutet also dass du die Funktion nicht so ohne weiteres in dein Programm "laden" kannst und dann aufrufen kannst.
-
-
Und was ist wenn man direkt ASM code in C# ausführe ?
Könnte das hilfreich sein? (ASM in C# habe ich überhaupt keine Ahnung...) -
Du stellst dir das zu einfach vor. Du musst eine DLL in den Prozess injizieren, und das geht nur mit statischen DLLs. Die .NET DLLs funktionieren da, da diese keinen ausführbaren Code enthalten sondern nur diesen ByteCode-Interpreter-Krams.
Ist die DLL einmal im Prozess injiziert, arbeitet sie alleine. Sie gehört quasi zum Prozess (League of Legends.exe). Du musst der DLL nur sagen, was sie tun soll und das geht, wie dongdong schon sagte, über einen Socket oder ne Pipe.
Erzähl mal was du sonst noch so vorhast. Nur Chat-Nachrichten senden klingt nicht spektakulär genug^^
Gruß
florian0 -
Naja okay, dann veröffentliche ich mal meine ganze Idee...
Ich lese aus den LoL Logs alle Player namen die im Spiel vorhanden sind aus.
Dann gehe ich auf LoLking.net suche die entsprechenden Elo werte mit den Wins und Losses. (funktioniert alles komplett schon)Dann sollen die Spieler namen mit der Elo im Chat geschrieben werden im format:
florian0: dongdong spielt Rayze Top Elo: 1530 aktuelle Elo: 1378 wins: 142 losses: 234
Awesome spielt Kayle Top Elo: 340 aktuelle Elo: 10 wins: 1 losses: 2222 -
-
Also willst du zb wenn man !player1 ne kleine info über den player1 in den chat geschrieben bekommen?
-
Wenn es nur das ist, und während dem Spiel keinerlei weitere Daten ausgegeben werden sollen, dann kann man diese Infos auch in ne Textdatei legen und diese dann von der injizierten DLL auslesen lassen. Danach braucht die DLL ja nichtsmehr tun, sie muss eben nur zur richtigen Zeit injected werden (nach Spielbeginn, oder vorher und dann eben zur richtigen Zeit selbstständig "handelt".
Gruß
florian0 -
Also willst du zb wenn man !player1 ne kleine info über den player1 in den chat geschrieben bekommen?
Ja so ca.
Wenn es nur das ist, und während dem Spiel keinerlei weitere Daten ausgegeben werden sollen, dann kann man diese Infos auch in ne Textdatei legen und diese dann von der injizierten DLL auslesen lassen. Danach braucht die DLL ja nichtsmehr tun, sie muss eben nur zur richtigen Zeit injected werden (nach Spielbeginn, oder vorher und dann eben zur richtigen Zeit selbstständig "handelt".
Gruß
florian0Können wir so machen. Ist nicht ganz schön aber funktioniert.
Machst du das mit einem FileSystemWatcher das er jeder textdatei nimmt die neu hinzugefügt wird (Also brauchst du nen ordner indem alle textdaten reinkommen)? Das wäre am einfachsten denke ich. -
-
So dachte ich das eigentlicht nicht. Ich dachte du legst die Daten in ner Textdatei ab und injectest dann die DLL. Die DLL liest die Textdatei aus und schreibt den Kram in den Chat.
Danach hast du eben keinen Zugriff mehr auf die DLL und kannst danach nichts mehr ausgeben. Wenn du das willst, ist die Socketlösung die bessere.
Gruß
florian0 -
Also muss ich bei jedem neue Game die DLL neu injecten.
-
Zitat
Also muss ich bei jedem neue Game die DLL neu injecten.
Selbstverständlich, die DLL injected sich nicht von selbstGesendet von meinem GT-I9100 mit Tapatalk 2
-
-
Selbstverständlich, die DLL injected sich nicht von selbst
Naja, hatte da auch gerade was falsches im Kopf... Dachte man könne die DLL einmal injecten und die DLL überprüft selber ob neuer text kommt mit einem FileSystemWather o.ä.
Aber da der Process nach jedem Game sowieso weg ist, also auch die DLL, muss sie sowieso neu geladen werden.
-
wie wäre es mit ner dll die du in den launcher machst und diese dll läd bei jedem game die 1. dll in den client?
-
Selbstverständlich, die DLL injected sich nicht von selbst
Wenn man sie bei AppInit einträgt schon
Aber die DLL jedes mal neu zu injecten ist wohl das kleinste Problem.wie wäre es mit ner dll die du in den launcher machst und diese dll läd bei jedem game die 1. dll in den client?
Das wäre dann der oben erwähnte FlashHook ... Der AirClient ist in ActionScript geschrieben, ka ob man da was hooken kann.
-
-
Wenn man sie bei AppInit einträgt schon
Ich wollte schon "in der Regel" dabei schreiben, hab gewusst das jmd. mit sowas kommt ;D
Das wäre dann der oben erwähnte FlashHook ... Der AirClient ist in ActionScript geschrieben, ka ob man da was hooken kann.
Ich vermute mal intern wird da auch irgendwo die WinApi zum starten eines Prozesses aufgerufen und die WinApi kann man immer hooken. -
Programm ist soweit fertig. Fehlt nur noch die DLL-Injection. Und die DLL
-
Hey,
falls noch einer dran arbeitet:PHP- //bUTL9R ChatHook, credits to florian0 from stagetwo
- //=====================================================
- // Includes
- //=====================================================
- #include "Manager.h"
- void CallChat(char* Text);
- //==================================================================
- // Important Variables
- //==================================================================
- DWORD dwEAX = 0; //EAX register wich is not static and needs to be retrived by GetEAX, otherwhise SendMessage will crash the game!
- DWORD dwChatAddress; //Where to "hook" the chat function with our GetEAX function
- DWORD dwCallOrigSendMessage = 0; //Address to call the original SendMessage from the game itself
- DWORD dwJumpBack;
- void CreateConsole()
- {
- AllocConsole();
- freopen( "CONOUT$", "wb", stdout );
- }
- void CheckHotkeys()
- {
- while (true)
- {
- Sleep(10);
- if (GetAsyncKeyState(VK_NUMPAD1) &1)
- {
- CallChat("easy");
- }
- if (GetAsyncKeyState(VK_NUMPAD2) &1)
- {
- printf("Sending GG\n");
- CallChat("/all GG!");
- if (dwEAX == 0 || dwCallOrigSendMessage == 0)
- {
- return;
- }
- CallChat("/all GG!");
- CallChat("/all GG!");
- CallChat("/all GG!");
- CallChat("/all GG!");
- CallChat("/all GG!");
- CallChat("/all GG!");
- CallChat("/all GG!");
- CallChat("/all GG!");
- }
- if (GetAsyncKeyState(VK_NUMPAD3) &1)
- {
- printf("call sendChat with troll\n");
- CallChat("/all I molest rubber chicken!");
- }
- if (GetAsyncKeyState(VK_NUMPAD4) &1)
- {
- CallChat("/all B1tch where you going?!");
- }
- if (GetAsyncKeyState(VK_NUMPAD5) &1)
- {
- CallChat("/all Not even close baby!");
- }
- if (GetAsyncKeyState(VK_NUMPAD6) &1)
- {
- CallChat("/all My favorite poker card? The ACE!");
- }
- if (GetAsyncKeyState(VK_NUMPAD7) &1)
- {
- CallChat("/all Nope, not on my watch!");
- }
- }
- }
- //==================================================================
- // CallChat
- //Our CallChat function, wich calls the original CallChat function with our text parameter
- //==================================================================
- void CallChat(char* Text)
- {
- //http://www.stagetwo.eu/index.php?page=Thread&threadID=156383&pageNo=3
- // call to SendMessage: 0045F270
- if (dwEAX == 0 || dwCallOrigSendMessage == 0)
- {
- MessageBox(NULL, "You dumbfuck want me to crash?!", "Error", MB_OK);
- return;
- }
- //you need to use the chat once manually (write hello or something), since we need 2 addresses
- __asm
- {
- mov eax, dwEAX
- mov edx, dwCallOrigSendMessage
- push Text
- mov ecx, eax
- call edx
- }
- }
- //==================================================================
- // GetEAX
- //==================================================================
- __declspec(naked) void GetEAX()
- {
- __asm
- {
- mov dwEAX, eax
- mov dwCallOrigSendMessage, edx
- push ecx
- mov ecx, eax
- call edx
- }
- //We got eax, ad edx [address for original sendmessage function], so we restore the original code to stay as undetected as possible
- //orig code: 51 8B C8 FF D2
- FrameWork->WriteMemory((void *)dwChatAddress, (void *)"\x51\x8B\xC8\xFF\xD2", 5);
- //jump back to original code
- __asm
- {
- jmp [dwJumpBack]
- }
- }
- //==================================================================
- // InitializeChatHook
- //==================================================================
- void InitializeChatHook()
- {
- CreateConsole();
- //Chat address is inside League of Legends.exe. Modulebase is always 0x00400000
- //LolClient ModuleSize: 0B158000
- printf("Searching chat address!\n");
- dwChatAddress = FrameWork->FindPattern(0x00400000, 0x0B158000, (PBYTE)"\x51\x8B\xC8\xFF\xD2\xB0\x01", "xxxxxxx");
- if (dwChatAddress != 0)
- {
- printf("Found chat address: %x\n", dwChatAddress);
- }
- else
- {
- printf("Did not find chat address!\n");
- return;
- }
- FrameWork->MakeJMP((PBYTE)dwChatAddress, (DWORD)GetEAX, 5);
- dwJumpBack = dwChatAddress + 5; //Important, original game code continues there
- printf("Detoured function, ready to go.\n");
- CheckHotkeys();
- return;
- }
Sollte nach Updates weiterhin funktionieren. -