Code:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
// NUMPAD1 => Types of chams.
// NUMPAD2 => Types of colors for front and back.
// LEFT and Right => Change colors.
// Change here the version of your Combat Arms => CABR or CAEU or CANA or CAKR
#define CABR
// Actual Address: 06/03/2012
#ifdef CABR
// Combat Arms Brazil
#define GameStatus 0x377F0DDC
#define DIPEngine 0x006A086A
#endif
#ifdef CAEU
// Combat Arms Europe
#define GameStatus 0x37806FC4
#define DIPEngine 0x006A3E0A
#endif
#ifdef CANA
// Combat Arms North American
#define GameStatus 0x37806FC4
#define DIPEngine 0x006A3E1A
#endif
#ifdef CAKR
// Combat Arms Korean
#define GameStatus 0x3774C6F0
#define DIPEngine 0x006A358A
#endif
DWORD retDIPEngine = (DIPEngine + 0x8);
INT chams;
INT color[2];
INT indexcolor;
#define Red D3DCOLOR_ARGB( 255, 255, 000, 000 )
#define Green D3DCOLOR_ARGB( 255, 000, 255, 000 )
#define Blue D3DCOLOR_ARGB( 255, 000, 000, 255 )
#define Black D3DCOLOR_ARGB( 255, 000, 000, 000 )
VOID SetLightChams(LPDIRECT3DDEVICE9 pDevice, FLOAT A, FLOAT R, FLOAT G, FLOAT B)
{
D3DMATERIAL9 pMaterial;
ZeroMemory(&pMaterial, sizeof(D3DMATERIAL9));
pDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
//Ambient
pMaterial.Ambient.a = (A/255);
pMaterial.Ambient.r = (R/255);
pMaterial.Ambient.g = (G/255);
pMaterial.Ambient.b = (B/255);
//Diffuse
pMaterial.Diffuse.a = (A/255);
pMaterial.Diffuse.r = (R/255);
pMaterial.Diffuse.g = (G/255);
pMaterial.Diffuse.b = (B/255);
//Specular
pMaterial.Specular.a = (A/255);
pMaterial.Specular.r = (R/255);
pMaterial.Specular.g = (G/255);
pMaterial.Specular.b = (B/255);
pDevice->SetMaterial(&pMaterial);
}
__declspec( naked ) HRESULT WINAPI DIPMidfunction( )
{
static LPDIRECT3DDEVICE9 pDevice;
static INT BaseVertexIndex;
static UINT MinVertexIndex, NumVertices, startIndex, primCount;
__asm
{
MOV ECX, DWORD PTR DS:[EAX]
MOV EDX, DWORD PTR DS:[ECX + 0x148]
MOV DWORD PTR DS:[pDevice], EAX;
MOV ECX, DWORD PTR DS:[EBP + 0x18]
MOV DWORD PTR DS:[BaseVertexIndex], ECX
MOV ECX, DWORD PTR DS:[EBP + 0x8]
MOV DWORD PTR DS:[MinVertexIndex], ECX
MOV ECX, DWORD PTR DS:[EBP + 0x10]
MOV DWORD PTR DS:[NumVertices], ECX
MOV ECX, DWORD PTR DS:[EBP + 0xC]
MOV DWORD PTR DS:[startIndex], ECX
MOV ECX, DWORD PTR DS:[EBP + 0x14]
MOV DWORD PTR DS:[primCount], ECX
PUSHAD
}
if( chams ) {
pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
if( chams == 1 ) {
if( color[0] == 1 ) SetLightChams( pDevice, 255, 255, 000, 000 );
if( color[0] == 2 ) SetLightChams( pDevice, 255, 000, 255, 000 );
if( color[0] == 3 ) SetLightChams( pDevice, 255, 000, 000, 255 );
if( color[0] == 4 ) SetLightChams( pDevice, 255, 000, 000, 000 );
}
if( chams == 2 ) {
pDevice->SetRenderState( D3DRS_LIGHTING, D3DZB_TRUE );
pDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_FLAT );
pDevice->SetRenderState( D3DRS_FOGENABLE, D3DZB_FALSE );
if( color[0] == 1 ) pDevice->SetRenderState( D3DRS_AMBIENT, Red );
if( color[0] == 2 ) pDevice->SetRenderState( D3DRS_AMBIENT, Green );
if( color[0] == 3 ) pDevice->SetRenderState( D3DRS_AMBIENT, Blue );
if( color[0] == 4 ) pDevice->SetRenderState( D3DRS_AMBIENT, Black );
}
if( chams > 2 ) {
pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, D3DZB_TRUE );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVDESTCOLOR );
if( chams == 3 ) pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCCOLOR );
if( chams == 4 ) pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA );
}
pDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount );
pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
if( chams == 1 ) {
if( color[1] == 1 ) SetLightChams( pDevice, 255, 255, 000, 000 );
if( color[1] == 2 ) SetLightChams( pDevice, 255, 000, 255, 000 );
if( color[1] == 3 ) SetLightChams( pDevice, 255, 000, 000, 255 );
if( color[1] == 4 ) SetLightChams( pDevice, 255, 000, 000, 000 );
}
if( chams == 2 ) {
if( color[1] == 1 ) pDevice->SetRenderState( D3DRS_AMBIENT, Red );
if( color[1] == 2 ) pDevice->SetRenderState( D3DRS_AMBIENT, Green );
if( color[1] == 3 ) pDevice->SetRenderState( D3DRS_AMBIENT, Blue );
if( color[1] == 4 ) pDevice->SetRenderState( D3DRS_AMBIENT, Black );
}
if( chams > 2 ) {
pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, D3DZB_TRUE );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVDESTCOLOR );
if( chams == 3 ) pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCCOLOR );
if( chams == 4 ) pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA );
}
} else {
pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
}
__asm
{
POPAD
JMP retDIPEngine
}
}
void *DetourCreate( BYTE *src, const BYTE *dst, const int len )
{
BYTE *jmp = ( BYTE * )malloc( len + 5 );
DWORD dwBack;
VirtualProtect( src, len, PAGE_EXECUTE_READWRITE, &dwBack );
memcpy( jmp, src, len );
jmp += len;
jmp[0] = 0xE9;
*( DWORD * )( jmp + 1 ) = ( DWORD )( src + len - jmp ) - 5;
src[0] = 0xE9;
*( DWORD * )( src + 1 ) = ( DWORD )( dst - src ) - 5;
for( int i = 5; i < len; i++ )
src[i] = 0x90;
VirtualProtect( src, len, dwBack, &dwBack );
return ( jmp - len );
}
VOID Hook( VOID )
{
while( TRUE ) {
if( *(BYTE *)GameStatus == 1 ) {
DetourCreate( (PBYTE)DIPEngine, (PBYTE)DIPMidfunction, 8 );
if( GetAsyncKeyState(VK_NUMPAD1)&1 ) {
chams++;
if(chams > 4) chams = 0;
}
if( GetAsyncKeyState(VK_NUMPAD2)&1 ) indexcolor = !indexcolor;
if( GetAsyncKeyState(VK_LEFT)&1 ) {
color[indexcolor]--;
if(color[indexcolor] < 0) color[indexcolor] = 4;
}
if( GetAsyncKeyState(VK_RIGHT)&1 ) {
color[indexcolor]++;
if(color[indexcolor] > 4) color[indexcolor] = 0;
}
}
else
memcpy( (VOID *)DIPEngine, (CONST VOID *)(PBYTE)"\x8B\x08\x8B\x91\x48\x01\x00\x00", 8 );
Sleep(100);
}
}
BOOL CheckModules( VOID )
{
if( GetModuleHandleA("d3d9.dll") != NULL
&& GetModuleHandleA("CShell.dll") != NULL
&& GetModuleHandleA("ClientFX.fxd") != NULL )
return TRUE;
return FALSE;
}
DWORD WINAPI StartRoutine( LPVOID )
{
while( !CheckModules( ) )
Sleep(100);
Hook( );
return 0;
}
BOOL WINAPI DllMain( HMODULE hDll, DWORD dwReason, LPVOID lpReserved )
{
DisableThreadLibraryCalls( hDll );
if( dwReason == DLL_PROCESS_ATTACH ) {
CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)StartRoutine, NULL, NULL, NULL );
}
return TRUE;
}