Hooked Funktion Parameter Auslesen

08/06/2012 03:28 bloodx#1
Hallo, ich hab mich seit längerer Zeit mal wieder etwas mit C++ beschäftigt und nen kleines Projekt gestartet.

Komme jetzt aber überhaupt nicht drauf wie ich aus dieser Funktion


Code:
.text:00461080                 push    ebp
.text:00461081                 mov     ebp, esp
.text:00461083                 sub     esp, 4E0h
.text:00461089                 mov     eax, dword_4D9830
.text:0046108E                 mov     [ebp+var_A4], eax
.text:00461094                 mov     [ebp+var_4D0], ecx
.text:0046109A                 cmp     dword_4E35B8, 1
.text:004610A1                 jnz     short loc_4610E7
.text:004610A3                 mov     eax, [ebp+var_4D0]
.text:004610A9                 cmp     dword ptr [eax+1C8h], 3

[COLOR="Red"]geht nocht weiter aber ist viel zu viel![/COLOR]

int __thiscall CommandHandler(int this, const char *a2)
was aber eig

Code:
int __stdcall CommandHandler(char *)
ist.

hab die Funktion Detoured

DetourFunction((PBYTE)(0x00461080/*Start der Funktion*/),(PBYTE)ServerMain::MyGmCommands);

alles schön und gut kann meine Eigenen Commands einschläusen nun Funktionieren aber die normalen Commands nicht mehr da ich die Funktion ja auf meine weiterleite...

Jemand ne bessere Lösung den char aus zu lesen? ._.
08/06/2012 05:15 Dr. Coxxy#2
DetourFunction sollte eigtl ein trampolin allokieren wo die überschriebenen bytes und ein jump auf die adresse nach dem jump gespeichert sein sollte.
solltest die adresse vom trampolin als void* zurückgeliefert bekommen, kannst also:

Code:
typedef int(__thiscall* MyGmCommands_t)(char*);

MyGmCommands_t OrigGmCommands;

OrigGmCommands = (MyGmCommands_t) DetourFunction((PBYTE)(0x00461080/*Start der Funktion*/),(PBYTE)ServerMain::MyGmCommands);


// im hook
int ServerMain::MyGmCommands(char* blubb)
{
  printf("Command Logged: %s\n", blubb);
  return OrigGmCommands(blubb);
}
08/06/2012 05:20 bloodx#3
So hatte ich es eben auch Probiert hatte leider nicht Funktioniert, habe aber jetzt eine Lösung gefunden :D

Code:
__asm
		{
				 push edx
                push ecx
                push ebx
                push eax

				mov     eax, [ebp+0x08]
				push    eax
				call    MyGmCommands
				
				 pop eax
                pop ebx
                pop ecx
                pop edx

				mov     eax, [ebp+0x08]
				push eax
				mov   ecx, [ebp-0x68]
				mov             edx,OriginalBack
				jmp             edx
		}
Ich leite einfach genau an der stelle wo mov eax, [ebp+0x08] ausgeführt wird auf meine Funktion weiter und dann wieder zurück ~.~ so verdammt einfach eig, aber erstmal wieder drauf kommen :D


Trotzdem danke an dich :)
08/06/2012 11:31 ehauser#4
Und wie machst du das genau, würd mich interessieren?
08/06/2012 17:52 bloodx#5
Code:
Tool->Intercept(INST_JMP,reinterpret_cast<void*>(0x00460BD9),reinterpret_cast<void*>(ServerMain::ReadCommandHandler),5);
Code:
DWORD OriginalCommandsBack = 0x00460BE0;
	int __declspec( naked ) ReadCommandHandler()
	{
		__asm{
				 push edx
                push ecx
                push ebx
                push eax
				mov     eax, [ebp+0x08]
				push    eax
				call    MyGmCommands	
				pop eax
                pop ebx
                pop ecx
                pop edx
				mov     eax, [ebp+0x08]
				push eax
				mov   ecx, [ebp-0x68]
				mov   edx,OriginalCommandsBack
				jmp   edx
		}
	}