#include <Windows.h>
#include <stdio.h>
#include <conio.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#define PI 3.141
#define Yellow D3DCOLOR_ARGB( 255, 255, 255, 000 )
typedef HRESULT ( WINAPI * DrawIPrim )( LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT );
VOID Jump( DWORD Address, DWORD Your_Detour );
DWORD Old = NULL;
LPDIRECT3DDEVICE9 pDev;
LPDIRECT3D9 pD3D;
D3DVIEWPORT9 Viewport;
DrawIPrim pDrawIPrim = NULL;
DWORD dwEndscene_hook = NULL;
DWORD dwEndscene_ret = NULL;
DWORD dwDIP_hook = NULL;
DWORD dwDIP_ret = NULL;
DWORD dwReset_hook = NULL;
DWORD dwReset_ret = NULL;
DWORD bJump = NULL;
LPD3DXFONT pFont=NULL;
LPD3DXLINE pLine=NULL;
HMODULE D3D9 = NULL;
VOID RenderString(LPDIRECT3DDEVICE9 pDev, int x, int y, DWORD color, LPD3DXFONT g_pFont, const char *fmt, ...)
{
if( !pFont )
D3DXCreateFontA( pDev,13,0,FW_BOLD,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,"Arial", &pFont );
if(!g_pFont)
return;
RECT FontPos = { x, y, x + 50, y + 50};
char buf[1024] = {'\0'};
va_list va_alist;
va_start(va_alist, fmt);
vsprintf_s(buf, fmt, va_alist);
va_end(va_alist);
pDev->SetRenderState( D3DRS_ZENABLE,false );
pDev->SetRenderState( D3DRS_FILLMODE,D3DFILL_SOLID );
g_pFont->DrawTextA(NULL, buf, -1, &FontPos, DT_NOCLIP, color);
pDev->SetRenderState( D3DRS_ZENABLE, true );
pDev->SetRenderState( D3DRS_FILLMODE,D3DFILL_SOLID );
}
VOID FillRGB(LPDIRECT3DDEVICE9 pDev,int x, int y, int w, int h, DWORD color )
{
D3DRECT rec = { x, y, x + w, y + h };
pDev->Clear( 1, &rec, D3DCLEAR_TARGET, color, 0, 0 );
}
VOID RenderBox(LPDIRECT3DDEVICE9 pDev, int x, int y, int w, int h, int px, DWORD color, DWORD color2)
{
//box
FillRGB(pDev, x, y, w, h, color);
//border
FillRGB(pDev, x, (y + h - px), w, px,color2);
FillRGB(pDev, x, y, px, h,color2 );
FillRGB(pDev, x, y, w, px,color2);
FillRGB(pDev, x + w - px), y, px, h,color2);
}
VOID RenderCircle(LPDIRECT3DDEVICE9 pDev,int X, int Y, int radius, int numSides, DWORD Color)
{
if (!pLine)
D3DXCreateLine(pDev, &pLine);
D3DXVECTOR2 Line[128];
float Step = (float)(PI * 2.0 / numSides);
int Count = 0;
for (float a=0; a < PI*2.0; a += Step)
{
float X1 = radius * cos(a) + X;
float Y1 = radius * sin(a) + Y;
float X2 = radius * cos(a+Step) + X;
float Y2 = radius * sin(a+Step) + Y;
Line[Count].x = X1;
Line[Count].y = Y1;
Line[Count+1].x = X2;
Line[Count+1].y = Y2;
Count += 2;
}
pLine->Begin();
pLine->Draw(Line,Count,Color);
pLine->End();
pLine->Release();
}
VOID RenderCross(LPDIRECT3DDEVICE9 pDev, DWORD color, int i)
{
pDev->GetViewport( &Viewport );
DWORD ScreenCenterX = (Viewport.Width / 2);
DWORD ScreenCenterY = (Viewport.Height / 2);
D3DRECT rec1 = {ScreenCenterX-i, ScreenCenterY, ScreenCenterX+ i, ScreenCenterY+1};
D3DRECT rec2 = {ScreenCenterX, ScreenCenterY-i, ScreenCenterX+ 1,ScreenCenterY+i};
pDev->Clear( 1, &rec1, D3DCLEAR_TARGET, color, 0, 0 );
pDev->Clear( 1, &rec2, D3DCLEAR_TARGET, color, 0, 0 );
//RenderCircle(pDev, ScreenCenterX, ScreenCenterY, i+3,i+3, color);
}
bool IsMenuOn =false;
VOID WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDev )
{
__asm nop
if((GetAsyncKeyState(VK_DELETE) & 0x1))
IsMenuOn = !IsMenuOn;
RenderString(pDev, 5, 5, Yellow, pFont, "[BugZ v1.0] Press Delete to turn Chams On/Off ");
if (IsMenuOn){
RenderCross(pDev, Yellow, 15);
}
}
__declspec(naked) void MyEndscene( )
{
__asm
{
MOV DWORD PTR SS:[EBP-0x10],ESP
MOV ESI,DWORD PTR SS:[EBP+0x8]
XOR EBX,EBX //replace patched code
PUSHFD
PUSHAD
PUSH [EBP+0x8]
CALL hkEndScene;
POPAD
POPFD
CMP ESI,EBX //replace patched code
jmp dwEndscene_ret; //jump back to normal endscene
}
}
VOID SetModelColor(LPDIRECT3DDEVICE9 pDev, float r, float g, float b, float a, float glowr, float glowg, float glowb, float glowa)
{
float lightValues[4] = {r, g, b, a};
float glowValues[4] = {glowr, glowg, glowb, glowa};
pDev->SetPixelShaderConstantF(1, lightValues, 1);
pDev->SetPixelShaderConstantF(3, glowValues, 1);
}
VOID WINAPI hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDev, D3DPRIMITIVETYPE Type, INT BIndex, UINT MIndex, UINT NVertices, UINT SIndex, UINT PCount )
{
bJump = TRUE;
LPDIRECT3DVERTEXBUFFER9 Stream_Data;
UINT Offset = 0;
UINT Stride = 0;
if( pDev->GetStreamSource( 0, &Stream_Data, &Offset, &Stride ) == S_OK )Stream_Data->Release();
if (IsMenuOn)
{
// Disable fog
pDev->SetRenderState(D3DRS_FOGENABLE, false);
// Fullbright
pDev->SetRenderState(D3DRS_LIGHTING, FALSE);
pDev->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_ARGB(255,255,255,255));
switch (Stride)
{
case 20: // Buildings
//pDev->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
pDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); // Transparency
break;
case 32: // Players and Zombies
//PlayerChams
pDev->SetRenderState(D3DRS_LIGHTING, FALSE); // Wallhack
pDev->SetRenderState(D3DRS_ZENABLE, FALSE);
SetModelColor(pDev, 1.0f, 0.0f, 0.0f, 0.50f, 1.5f, 1.5f, 1.5f, 1.5f);
pDrawIPrim( pDev, Type, BIndex, MIndex, NVertices, SIndex, PCount );
pDev->SetRenderState(D3DRS_ZENABLE, TRUE);
break;
default:
break;
}
}
bJump = FALSE;
}
__declspec(naked) void MyDIP( )
{
__asm
{
MOV EDI,DWORD PTR SS:[EBP+0x8]
XOR EBX,EBX
CMP EDI,EBX // replace patched code
PUSHFD
PUSHAD
MOV EDX,[bJump]
CMP EDX,0x0
JG DONE
PUSH [EBP+0x20] // Push arguments of DIP
PUSH [EBP+0x1C]
PUSH [EBP+0x18]
PUSH [EBP+0x14]
PUSH [EBP+0x10]
PUSH [EBP+0x0C]
PUSH [EBP+0x08]
CALL hkDrawIndexedPrimitive
DONE: POPAD
POPFD
jmp dwDIP_ret; // jump back to normal DIP
}
}
VOID WINAPI hkReset( )
{
if( pFont != NULL )
if( pFont->Release( ) == S_OK )
pFont = NULL;
}
__declspec(naked) void MyReset( )
{
__asm
{
PUSHAD
PUSHFD
CALL hkReset
POPFD
POPAD
MOV ESI,DWORD PTR SS:[EBP-0x08]
MOV EDI,DWORD PTR SS:[EBP-0x04]
POP EBX
JMP dwReset_ret
}
}
VOID WINAPI GETD3D( VOID )
{
HWND ConsoleWindow = GetConsoleWindow( );
ShowWindow( ConsoleWindow, SW_HIDE ); // hide ConsoleWindow...
while( D3D9 == NULL )
{
D3D9 = GetModuleHandleA( "d3d9.dll" );
Sleep( 100 );
}
D3DPRESENT_PARAMETERS D3D_PP = {0};
IDirect3D9 * (WINAPI *oDirect3DCreate9)(UINT SDKVersion);
*(PDWORD)&oDirect3DCreate9 = (DWORD)GetProcAddress( D3D9, "Direct3DCreate9" );
_cprintf( "Direct3DCreate9\n" );
pD3D = oDirect3DCreate9( D3D_SDK_VERSION );
D3D_PP.Windowed = TRUE;
D3D_PP.SwapEffect = D3DSWAPEFFECT_DISCARD;
D3D_PP.BackBufferFormat = D3DFMT_UNKNOWN;
_cprintf( "CreateDevice\n" );
pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,ConsoleWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3D_PP, &pDev );
PDWORD VTABLE = *(DWORD**)pDev;
dwEndscene_hook = VTABLE[42] + 0x2A;
dwEndscene_ret = dwEndscene_hook + 0x0A;
dwDIP_hook = VTABLE[82] + 0x2D;
dwDIP_ret = dwDIP_hook + 0x7;
dwReset_hook = VTABLE[16] + 165;
dwReset_ret = dwReset_hook + 0x7;
*(PDWORD)&pDrawIPrim = (DWORD)VTABLE[82];
_cprintf( "Jump\n" );
Jump( (DWORD)dwEndscene_hook, (DWORD)MyEndscene );
Jump( (DWORD)dwDIP_hook, (DWORD)MyDIP );
Jump( (DWORD)dwReset_hook, (DWORD)MyReset );
_cprintf( "Done\n" );
Sleep( 400 );
pDev->Release( );
pD3D->Release( );
FreeConsole( );
}
VOID Jump( DWORD Address, DWORD Your_Detour )
{
VirtualProtect( (LPVOID)Address, 5, PAGE_EXECUTE_READWRITE, &Old );
*(PBYTE)Address = (BYTE)0xE9;
*(PDWORD)(Address + 1) = ( Your_Detour - Address - 5) ;
VirtualProtect( (LPVOID)Address, 5, Old, &Old );
}
BOOL WINAPI DllMain( HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved )
{
if( dwReason == DLL_PROCESS_ATTACH )
{
DisableThreadLibraryCalls( hModule );
AllocConsole( );
_cprintf( "Ready\n" );
CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)
GETD3D, NULL, NULL, NULL);
}
return TRUE;
}