Main.cpp
Code:
#include "Functions.h"
DWORD ret_myMid;
void D3D(LPDIRECT3DDEVICE9 pDevice)
{
IDirect3DVertexBuffer9* pStreamData = NULL;
UINT iOffsetInBytes,iStride;
pDevice->GetStreamSource(0,&pStreamData,&iOffsetInBytes,&iStride);
if(iStride ==44 || iStride == 40)
{
pDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);
}
}
_declspec(naked) void MyMid()
{
static LPDIRECT3DDEVICE9 pDevice;
__asm
{
mov edi, edi
push ebp
mov ebp, esp
MOV EAX,DWORD PTR [EBP + 0x8]
MOV pDevice,EAX
}
D3D(pDevice);
_asm
{
JMP ret_myMid
}
}
void Hacks(void)
{
DWORD hD3D;
do { hD3D = (DWORD)LoadLibraryA("d3d9.dll");} while(!hD3D);
DWORD Address = FindPattern(hD3D, 0x128000,(PBYTE)"PATTERN","MASK"); <- You have to find it shelf in d3d9.dll :D If you find you can Post
if(Address)
{
ret_myMid = Address + 5;
DetourCreate((PBYTE)Address,(PBYTE)MyMid,5);
Beep(750,300);
}
}
BOOL WINAPI DllMain ( HMODULE hDll, DWORD dwReason, LPVOID lpReserved )
{
DisableThreadLibraryCalls(hDll);
if (dwReason==DLL_PROCESS_ATTACH)
{
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Hacks, NULL, NULL, NULL);
}
return TRUE;
}
Functions.h
Code:
#include <windows.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <d3d9.h>
#include <d3dx9.h>
#include <time.h>
#pragma comment (lib,"d3dx9.lib")
#pragma comment (lib,"d3d9.lib")
HRESULT GenerateTexture(IDirect3DDevice9 *pD3Ddev, IDirect3DTexture9 **ppD3Dtex, DWORD colour32)
{
if( FAILED(pD3Ddev->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED,
ppD3Dtex, NULL)) )
return E_FAIL;
WORD colour16 = ((WORD)((colour32>>28)&0xF)<<12)
|(WORD)(((colour32>>20)&0xF)<<8)
|(WORD)(((colour32>>12)&0xF)<<4)
|(WORD)(((colour32>>4)&0xF)<<0);
D3DLOCKED_RECT d3dlr;
(*ppD3Dtex)->LockRect(0, &d3dlr, 0, 0);
WORD *pDst16 = (WORD*)d3dlr.pBits;
for(int xy=0; xy < 8*8; xy++)
*pDst16++ = colour16;
(*ppD3Dtex)->UnlockRect(0);
return S_OK;
}
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 );
}
void MakeCall(BYTE* paddress, DWORD yourfunction, DWORD dwlen)
{
DWORD dwOldProtect, dwBkup, dwRelAddr;
VirtualProtect(paddress, dwlen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
dwRelAddr = (DWORD) (yourfunction - (DWORD) paddress) - 5;
*paddress = 0xE8;
*((DWORD*) (paddress + 0x1)) = dwRelAddr;
for(DWORD x = 0x5; x < dwlen; x++) *(paddress + x) = 0x90;
VirtualProtect(paddress, dwlen, dwOldProtect, &dwBkup);
return;
}
void MakeJMP(BYTE *pAddress, DWORD dwJumpTo, DWORD dwLen)
{
DWORD dwOldProtect, dwBkup, dwRelAddr;
VirtualProtect(pAddress, dwLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
dwRelAddr = (DWORD) (dwJumpTo - (DWORD) pAddress) - 5;
*pAddress = 0xE9;
*((DWORD *)(pAddress + 0x1)) = dwRelAddr;
for(DWORD x = 0x5; x < dwLen; x++) *(pAddress + x) = 0x90;
VirtualProtect(pAddress, dwLen, dwOldProtect, &dwBkup);
return;
}
bool bDataCompare(const BYTE* pData,const BYTE* bMask,const char* szMasK)
{
for(;*szMasK;++szMasK,++pData,++bMask)
{
if(*szMasK=='x' && *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(bDataCompare((BYTE*)(dwAddress+i),bMASK,szMask)) return (DWORD)(dwAddress+i);
}
return 0;
}
bool IsGameReadyForHook()
{
if( GetModuleHandleA( "ClientFX.fxd" ) != NULL && GetModuleHandleA( "CShell.dll" ) != NULL ){return true;}
return false;
}
Credits : Me(ALL),-IfluX(ASM)