#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include "address.h"
#include "funcs.h"
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
DWORD DIPD3D9, retDIPD3D9;
int Variable[100];
void Render(LPDIRECT3DDEVICE9 pDevice)
{
IDirect3DVertexBuffer9* pStreamData = NULL;
UINT iOffsetInBytes, iStride;
pDevice->GetStreamSource(0, &pStreamData, &iOffsetInBytes, &iStride);
if(GetAsyncKeyState(VK_NUMPAD1)&1) Variable[1] =! Variable[1];
if(GetAsyncKeyState(VK_NUMPAD2)&1) Variable[2] =! Variable[2];
if( Variable[1] )
{
if(iStride == 44) // wallhacker
{
pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
}
}
if( Variable[2] ) // esp boxes
{
GetPlayerByIndex = (lpGetPlayerByIndex)PlayerByIndex;
GetLocalPlayer = (lpGetLocalPlayer)LocalPlayer;
unsigned long ulThis = *(unsigned long *)ClientInfoMgr;
for(INT i = 0; i < 24; i++) // number of players
{
pPlayerInfo *pLocal = GetLocalPlayer(ulThis);
pPlayerInfo *pPlayer = GetPlayerByIndex(ulThis, i, 0);
if( ValidPointer( pPlayer ) && ValidPointer( pPlayer->Object ) )
{
D3DXVECTOR3 HeadPos, FootPos, HeadScreen, FootScreen;
if( !pPlayer->IsDead ) // if you are not dead..
{
HeadPos.x = pPlayer->Object->Pos.x;
HeadPos.y = pPlayer->Object->yBound2;
HeadPos.z = pPlayer->Object->Pos.z;
if( W2S (HeadPos, &HeadScreen ) )
{
FootPos.x = pPlayer->Object->Pos.x;
FootPos.y = pPlayer->Object->yBound1;
FootPos.z = pPlayer->Object->Pos.z;
if (W2S( FootPos, &FootScreen ) )
{
if(pPlayer->Team != pLocal->Team)
{
DrawESPBox( HeadScreen, FootScreen, 0xFFFF0000, pDevice );
} else {
DrawESPBox( HeadScreen, FootScreen, 0xFF00FF00, pDevice );
}
}
}
}
}
}
}
}
__declspec( naked ) HRESULT WINAPI DIPMidfunction( )
{
static LPDIRECT3DDEVICE9 pDevice;
__asm
{
MOV EDI, EDI
PUSH EBP
MOV EBP, ESP
MOV EAX, DWORD PTR SS:[EBP + 0x8]
MOV DWORD PTR DS:[pDevice], EAX
}
Render(pDevice);
__asm
{
POP EBP
JMP retDIPD3D9
}
}
VOID *DetourCreate( BYTE *src, CONST BYTE *dst, CONST INT len )
{
BYTE *jmp =( BYTE * ) malloc( len + 5 );
DWORD dwBack;
VirtualProtect( src, len, PAGE_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 );
}
BOOL bCompare( CONST BYTE *pData, CONST BYTE *bMask, CONST CHAR *szMask )
{
for( ; *szMask; ++szMask, ++pData, ++bMask )
if( *szMask == '0' && *pData != *bMask )
return false;
return ( *szMask ) == NULL;
}
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for( DWORD i = 0; i < dwLen; i++ )
if( bCompare( ( BYTE * )( dwAddress + i ), bMask, szMask ) )
return ( DWORD )( dwAddress + i );
return 0;
}
DWORD WINAPI StartRoutine( LPVOID )
{
while( TRUE )
{
DWORD hD3D = ( DWORD )LoadLibrary( "d3d9.dll" );
if( !DIPD3D9 )
{
// Windows XP
DIPD3D9 = FindPattern( hD3D,
0x128000,
( PBYTE )"\x8B\xFF\x55\x8B\xEC\x5D\xE9\x00\x00\x00\x00\xCC \xCC\xCC\xCC\xCC\x8B\xFF\x55\x8B\xEC\x51",
"0000000????0000000000" );
if( DIPD3D9 )
{
retDIPD3D9 = DIPD3D9 + 0x6;
DetourCreate( ( PBYTE )DIPD3D9, ( PBYTE )DIPMidfunction, 5 );
}
}
if( !DIPD3D9 )
{
// Windows 7
DIPD3D9 = FindPattern( hD3D,
0x128000,
( PBYTE )"\xC3\x90\x90\x90\x90\x90\x8B\xFF\x55\x8B\xEC\x5D \xEB\x05\x90\x90\x90\x90\x90\x8B\xFF\x55\x8B\xEC\x 6A\xFF",
"00000000000000000000000000" );
if( DIPD3D9 )
{
retDIPD3D9 = ( DIPD3D9 + 0x6 ) + 0x6;
DetourCreate( ( PBYTE )( DIPD3D9 + 0x6 ), ( PBYTE )DIPMidfunction, 5 );
}
}
}
return 0;
}