MessageBox Hook

08/13/2010 16:06 SiZeXtreme#1
Hallo Leute,

ich hab versucht die MessageBoxA Funktion in user32.dll zu hooken, klappt an und für sich schon ganz gut. Ich hab ein Programm gefunden, dass alle 10 Sek. eine MessageBox aufmacht. Nun ist es so wenn ich meine DLL in das Programm injecte, wird die erste MessageBox mit meinen Text geändert, die nachfolgenden aber nicht mehr. Eventuell könnte mir jemand bei meinem kleinen Problem helfen.
Code:
#include <Windows.h>
#include <stdio.h>
#include "Hook.h"

int WINAPI hook_MessageBox(HWND hWnd, char* lpText, char* lpCaption, UINT uType);

DWORD MessageBoxaddr=0;

BYTE backupMS[6];

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:{
		DisableThreadLibraryCalls(hModule);
		MessageBoxaddr = HookFunction("user32.dll", "MessageBoxA", hook_MessageBox, backupMS);
		return true;
							}break;
	case DLL_THREAD_ATTACH:break;
	case DLL_THREAD_DETACH:break;
	case DLL_PROCESS_DETACH:{
		if (MessageBoxaddr) WriteProcessMemory((HANDLE) -1, (void*)MessageBoxaddr, backupMS, 6, 0);
							}break;
		
	}
	return TRUE;
}

int WINAPI hook_MessageBox(HWND hWnd, char* lpText, char* lpCaption, UINT uType){
	
	WriteProcessMemory((HANDLE)-1, (void*)MessageBoxaddr, backupMS, 6, 0);
	return MessageBoxA(hWnd, "Hook is working!", "Info", uType);
}
Lg SiZeXtreme
08/13/2010 16:47 Madd Eye#2
ICh geh etz mal davon aus das bei
Code:
MessageBoxaddr = HookFunction("user32.dll", "MessageBoxA", hook_MessageBox, backupMS);
Der zweite Parameter für den MessagebBox Namen steht

dann die frage ist es immer der selbe name?
Wenn Nein dann muss du wohl noch eine kleine Funktion einbauen
08/13/2010 16:55 ms​#3
Quote:
Originally Posted by SiZeXtreme View Post
Code:
int WINAPI hook_MessageBox(HWND hWnd, char* lpText, char* lpCaption, UINT uType){
	
	[COLOR="Red"][B]WriteProcessMemory((HANDLE)-1, (void*)MessageBoxaddr, backupMS, 6, 0);[/B][/COLOR]
	return MessageBoxA(hWnd, "Hook is working!", "Info", uType);
}
Liegt daran, dass du in der Zeile den Hook wieder entfernst.
08/13/2010 18:18 SiZeXtreme#4
Wenn ich aber die Zeile entferne, crasht das Programm wenn es die MessageBox aufruft. Ich war selber verwundert, dass es nicht einfach mit return MessageBoxA... funktioniert.
08/13/2010 18:23 Akorn#5
Quote:
Originally Posted by SiZeXtreme View Post
Wenn ich aber die Zeile entferne, crasht das Programm wenn es die MessageBox aufruft. Ich war selber verwundert, dass es nicht einfach mit return MessageBoxA... funktioniert.
Du darfst auch nicht in deiner eigenen "hook_MessageBox" funktion MessageBoxA aufrufen den die hast du ja gehookt, dan landest du ja jedesmal wieder am anfahng der "hook_MessageBox" funktion solange bis der Stack überläuft und das pogramm abstürzt, stattdessen musst du die Trampolin funktion aufrufen
08/13/2010 20:53 SiZeXtreme#6
Das ist die HookFunction, die ich benutze. Wie komme ich jetzt auf die Trampolin-Funktion?
Code:
#include <windows.h>
#include <stdio.h>


DWORD HookFunction(const char *Dll, const char *FuncName, void *Function, unsigned char *backup){
	DWORD addr = (DWORD)GetProcAddress(GetModuleHandle(Dll), FuncName);
	BYTE jmp[6] = {0xE9,0x00, 0x00, 0x00, 0x00,0xC3};

	ReadProcessMemory((HANDLE)-1, (void*)addr, backup, 6, 0);
	DWORD calc = ((DWORD)Function - addr - 5);
	memcpy(&jmp[1], &calc, 4);

	WriteProcessMemory((HANDLE) -1, (void*)addr, jmp, 6, 0);

	return addr;
}
08/13/2010 21:37 Akorn#7
Quote:
Originally Posted by SiZeXtreme View Post
Das ist die HookFunction, die ich benutze. Wie komme ich jetzt auf die Trampolin-Funktion?
Code:
#include <windows.h>
#include <stdio.h>


DWORD HookFunction(const char *Dll, const char *FuncName, void *Function, unsigned char *backup){
	DWORD addr = (DWORD)GetProcAddress(GetModuleHandle(Dll), FuncName);
	BYTE jmp[6] = {0xE9,0x00, 0x00, 0x00, 0x00,0xC3};

	ReadProcessMemory((HANDLE)-1, (void*)addr, backup, 6, 0);
	DWORD calc = ((DWORD)Function - addr - 5);
	memcpy(&jmp[1], &calc, 4);

	WriteProcessMemory((HANDLE) -1, (void*)addr, jmp, 6, 0);

	return addr;
}
Hast du das selbst gemacht?
Erstmal vorweg wen du eine dll injectierst kannst du in der dll memcpy anstatt Read/WriteProcessMomory benutzen.

Du Scheinst garkeine trampoline funktion zu erstellen. Du sicherst zwar die Bytes die du für den Jump überschreibst, allerdings nicht in einer trampolin funktion sondern wohl nur um den hook zu endhooken.
08/13/2010 21:56 SiZeXtreme#8
Ich hab die Funktion aus einem Tutorial, da wird nur CreateWindowExA und ChangeDisplaySettingsA gehooked. Wollt halt nur mal probieren, ob ich auf Grund dieses Tutorials MessageBoxA hooken kann, was auch schon ein bisschen funktioniert.
08/13/2010 23:06 Mr0x90#9
übrigens:

LoadLibrary ruft sowieso GetModuleHandle auf, von daher sollte man in solchen fällen eher LoadLibrary benutzen..
08/13/2010 23:21 SiZeXtreme#10
Ich werds mal ändern, ändert zwar nicht sehr viel, aber trozdem danke.:)
08/14/2010 05:14 MrSm!th#11
Übrigens kann das Programm auch MessageBoxW benutzen
08/14/2010 13:41 SiZeXtreme#12
Die MessageBox wird ja 1 mal geändert, also wird auch MessageBoxA verwendet. Das Problem liegt nur an der nicht vorhanden Trampolin-Funktion.
08/15/2010 03:28 MrSm!th#13
Ich empfehle dir, MS Detours 1.5 zu nutzen.
Geschmäcker mögen sich unterscheiden, aber MS Detours ist so programmiert, dass es nicht nur komfortabel, sondern auch sicher ist.
Es wäre mal einen Versuch wert.
08/15/2010 21:48 SiZeXtreme#14
Ich werd es mal mit der MS Detours 1.5 versuchen, wäre aber immer noch dankbar, wenn jemand das Problem mit der Trampolin-Funktion fixen könnte. :o
08/15/2010 21:58 MrSm!th#15
Ich bin sicher, dass es damit gehen wird ;)