Hai will chams bei no Menu einbauen doch ich hab 12 Fehler ich hab ka wie das geht und so!!
Hier der CODE:
Hier der CODE:
Quote:
#pragma warning(disable: 4244)
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define D3D_CHAMS_1 36
#define D3D_CHAMS_2 32
DWORD dwDetourFunction( DWORD dwAddressOfFunctionToIntercept, DWORD dwAddressOfFunctionToJmp, DWORD dwNumberOfOverwrittenOpcodes )
{
char szErrorLog[256];
DWORD dwReservedMemorySpace = 0x0;
DWORD dwOldProtection = 0x0;
dwReservedMemorySpace = ( DWORD )VirtualAlloc( 0, ( dwNumberOfOverwrittenOpcodes + 0x5 ), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if( dwReservedMemorySpace == NULL )
{
sprintf( szErrorLog, "dwDetourFunction -> VirtualAlloc failed -> GetLastError: %d", GetLastError( ) );
MessageBoxA( GetForegroundWindow( ), szErrorLog, "ERROR", MB_ICONERROR | MB_OK );
return 0x0;
}
if( VirtualProtect( dwAddressOfFunctionToIntercept, dwNumberOfOverwrittenOpcodes, PAGE_READWRITE, &dwOldProtect ) == 0 )
{
sprintf( szErrorLog, "dwDetourFunction -> VirtualProtect failed -> GetLastError: %d", GetLastError( ) );
MessageBoxA( GetForegroundWindow( ), szErrorLog, "ERROR", MB_ICONERROR | MB_OK );
return 0x0;
}
memcpy( dwAddressOfFunctionToIntercept, dwReserveMemorySpace, dwNumberOfOverwrittenBytes );
//jmp opcode [E9]
*( PBYTE )( dwReservedMemorySpace + dwNumberOfOverwrittenBytes ) = 0xE9;
//im debugger würde das nun wie folgt aussehen:
//0xADRESSE orig opcode;
//0xADRESSE3 orig opcode;
//0xADRESSE5 orig opcode;
//0xADRESSE7 jmp;
//jetzt folgt die angabe der adresse an die gesprungen werden soll, dafür benutzen wir die berechnung wie ich sie vorhin erklärt habe
*( PDWORD )( dwReservedMemorySpace + dwNumberOfOverwrittenBytes + 0x1 ) = ( ( dwAddressOfFunctionToIntercept + dwNumberOfOverwrittenBytes ) - ( dwReservedMemorySpace + dwNumberOvOverwrittenBytes + 0x5 ) );
//einige werden sich sicher fragen warum da jetzt 5 bytes dazuadiert werden, das liegt einfach daran, das der jmp erst am ende ausgeführt wird, sprich nach der letzten ziffer der adressenangabe. und da ein jmp 1 opcode ist und eine adresse aus 4 bytes besteht, ist der sprung punkt 5 bytes weiter.
//im debugger schaut das nun so aus:
//im debugger würde das nun wie folgt aussehen
//0xADRESSE 235253 origopcodes;
//0xADRESSE3 2351 origopcodes;
//0xADRESSE5 3452 origopcodes;
//0xADRESSE7 e9 23456321 jmp relativadresse;
//HOOK!!!!!!!!!!!!!!!
//jmp instruction setzen
*( PBYTE )dwAddressOfFunctionToIntercept = 0xE9;
//rva berechnen und setzen
*( PDWORD )( dwAddressOfFunctionToIntecept + 0x1 ) = ( dwAddressOfFunctionToJmp - ( dwAddressOfFunctionToIntercept + 0x5 ) );
//nops setzen?!?!
for( DWORD dwNOP = 0x5; dwNOP < dwNumberOfOverwrittenBytes; dwNOP += 0x1 )
{
//opcode von nop ist 90
*( PBYTE )( dwAddressOfFunctionToIntercept + dwNOP ) = 0x90;
}
//speicherrechte wiederherstellen
if( VirtualProtect( dwAddressOfFunctionToIntercept, dwNumberOfOverwrittenBytes, dwOldProtect, new DWORD ) == 0 )
{
sprintf( szErrorLog, "dwDetourFunction -> VirtualProtect failed -> GetLastError: %d", GetLastError( ) );
MessageBoxA( GetForegroundWindow( ), szErrorLog, "ERROR", MB_ICONERROR | MB_OK );
return 0x0;
}
//whats that ?
TerminateProcess( GetCurrentProcess( ), 0 );
return dwReservedMemorySpace;
}
BOOL WINAPI DllMain(HINSTANCE mod, DWORD DWORD_GRUND, LPVOID res)
{
switch(DWORD_GRUND)
{
case 1:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)HackThread , 0, 0, 0);
break;
case 2:
break;
}
return TRUE;
}