All pastes #270249 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-12-07 05:33 UTC
rendered paste body
//////////////////////////////////////////////////////////////////////
// Asm_Code()
// -------------------------------------------------------------------
// This is our assembler routine that we patch in to the game. Since
// this code is relocateable, you can patch in anywhere in the game's
// address-space. We chose to put it at game.exe+0x400 bytes.
//
// This code hi-jacks WinProc and loads/unloads our dll when it 
// receives WM_APP.
//////////////////////////////////////////////////////////////////////
void _declspec(naked) AsmCode(void)
{
	__asm {
		make_space						// Make room for original code
		pushad
		call getaddress					// Get our EIP
getaddress:
		pop esi
		sub esi, 0x0c					// We now have base address in esi
		add esi, DATA					// Add offset to data
		mov eax, [esp+0x2c]				// esp+0x2c = uMsg
		cmp eax, WM_APP					// Check for our signal
		je do_our_stuff
hack_exit:
		popad
		ret
do_our_stuff:
		mov eax, esi
		add eax, MODULENAME
		push eax
		mov eax, [esi+PGETMODULEHANDLEA]
		call eax						// Is our dll loaded ?
		cmp eax, 0
		je load_dll						// No, load it
		push eax						// Yes, unload it
		mov eax, [esi+PFREELIBRARY]
		call eax
		jmp hack_exit
load_dll:							
		mov eax, esi
		add eax, FILENAME
		push eax
		mov eax, [esi+PLOADLIBRARYA]
		call eax
		jmp hack_exit
	}
}