Ingame Chat Nachrichten schicken! (LoL)

04/12/2016 16:05 Krabat2#1
Hallo :)
Wie ist es möglich mit einem Programm, Chat Nachrichten ingame zu versenden? Als Beispiel beim Spiel "League of Legends"
Es gibt zum Beispiel das Programm "Mk Jogo" wo man unter anderem 5 Nachrichten festlegen kann, die man mit einem shortcut dann sofot senden kann... so ähnlich soll das funktionieren.

Danke für Anregungen:;)
04/12/2016 21:04 .Verkauf´#2
Hallo,

da gibt es wie mir spontan einfallen zwei Methoden:

1.) Paket senden an den Server
2.) Funktion in dem Prozess finden, welche für das Senden der Nachrichten zuständig ist und dann callen

Beides läuft auf Reverse Engineering hinaus und später CodeInjection in Form einer DLL o.ä.
04/12/2016 21:06 _geforce_#3
Wenn es nur um nachrichten schicken geht, reicht doch auch eine emulation also das die tastendrücke emuliert werden sollte um einiges leichter sein also reverse engineering oder täusche ich mich da ?
04/12/2016 21:09 .Verkauf´#4
Quote:
Originally Posted by _geforce_ View Post
Wenn es nur um nachrichten schicken geht, reicht doch auch eine emulation also das die tastendrücke emuliert werden sollte um einiges leichter sein also reverse engineering oder täusche ich mich da ?
Ja, so kann man es auch machen, hast du recht :). Ich bevorzuge jedoch die oben genannten Methoden ^.^
04/12/2016 21:26 Krabat2#5
Für Methode 2 Sollte ich mich mit Assembler und mit OllyDbg beschäftigen? Habe die beiden Begriffe jedenfalls schon öfters im Zusammenhang mit Reversne Engineering gehört^^
04/12/2016 21:55 .Verkauf´#6
Ja, man sollte allerdings Vorwissen in Programmierung und Assembler haben. Die Arbeitsweise der CPU + RAM sollte man ebenfalls beherrschen.
04/13/2016 16:20 Krabat2#7
Und wie geht man sowas an? Also wie findet man so eine Funktion? Gibt es dazu Tutorials oder Ähnliches?
04/13/2016 18:09 florian0#8
Ich hatte die Funktion vor einiger Zeit, inzwischen sind das sogar Jahre, gefunden.

Der Ingame-Chat hat ja Commands wie z.B. /r oder /all. Die findet man über die String-Suche, dann ist die Funktion zum Senden nicht mehr weit.
04/14/2016 14:32 Krabat2#9
Hab das mal ausprobiert jedoch nichts gefunden.. habe sowohl unicode als auch ASCII probiert
04/15/2016 23:48 Krabat2#10
Habe einmal "SendChatMessageError" oder so Ähnlich gefunden, aber nur einmal jetzt finde ich diese Funktion nicht mehr... bzw es wird nicht mehr damit kommentiert
04/16/2016 02:33 florian0#11
Das ist der Code, der vor 3 Jahren am Ende rauskam:
Code:
void SendChat(char* Text)
{
	__asm
	{
		MOV EAX, DWORD PTR DS:[0xAF381F8]
		MOV EAX, DWORD PTR DS:[EAX + 0x2C]
		MOV EAX, DWORD PTR DS:[EAX + 0x8]
		MOV EDX, DWORD PTR DS:[EAX]
		MOV EDX, DWORD PTR DS:[EDX + 0x8]
		PUSH Text
		MOV ECX, EAX
		CALL EDX
	}
}
Bzw. als kompletter Hook wie du es beschrieben hast:
Code:
//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;
}
(Von hier: [Only registered and activated users can see links. Click Here To Register...] (und Seite 4))


Ich kann mir nicht vorstellen, dass der Hook noch funktioniert. Dafür ist zu viel Zeit vergangen.

Der LoL-Client arbeitet viel mit Übersetzungen. Ggf. findet man /all nicht mehr. Aber die hier findet man noch:
  • game_chat_known_commands
  • game_chat_command_help
  • game_console_chatcommand
04/16/2016 18:11 Krabat2#12
mhm ICh habe eigentlich immer alle Strings nach "chat" durchsucht und nie soetwas wie game_chat_known_commands
game_chat_command_help

gefunden :/ Irgendwas mache ich falsch :D
04/17/2016 23:02 Krabat2#13
Ok lag daran dass ich zu wenig mit ollydbg gearbeitet habe..
Habe nicht vorher das Modul "League of Legends.exe" ausgeführt, aber den weg bis zur chat funktion verstehe ich nicht.. habe zum Beispiel als String "Buy Item" gefunden und den Anfang der Funktion mit einem BReak Point versehen...

Wenn ich ein Item gekauft habe, wurde LoL aber nicht pausiert?
04/19/2016 15:36 Krabat2#14
Bei anderen funktionen wie "Hover Shop", "Close Shop" etc. stoppt/pausiert es ebenfalls nicht
04/19/2016 15:45 qqdev#15
Dann musst du halt weitersuchen :) Nur weil sie zur Aktion passen, heißt es nicht, dass auf diese auch zugegriffen werden muss.