Code:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
DWORD GetProcessByExeName(const CHAR *pExeName, DWORD *pPID, DWORD Size = 1)
{
PROCESSENTRY32 PE;
HANDLE hSnap;
DWORD rVal;
DWORD Cursor;
DWORD ExeNameSize;
Cursor = 0;
ExeNameSize = strlen(pExeName);
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
rVal = Process32First(hSnap, &PE);
while(rVal)
{
if( CSTR_EQUAL == CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, pExeName, ExeNameSize, PE.szExeFile, strlen(PE.szExeFile)) )
{
if(Size > Cursor)
{
pPID[Cursor] = PE.th32ProcessID;
}
++Cursor;
}
rVal = Process32Next(hSnap, &PE);
}
return Cursor;
}
#ifndef DIRECTX9SDK_INSTALLED
typedef DWORD D3DFORMAT;
typedef DWORD D3DMULTISAMPLE_TYPE;
const DWORD D3DADAPTER_DEFAULT = 0x00000000;
const DWORD D3DCREATE_HARDWARE_VERTEXPROCESSING = 0x00000040;
const DWORD D3DFMT_UNKNOWN = 0x00000000;
const DWORD SDK_VERSION = 32;
typedef enum D3DDEVTYPE
{
D3DDEVTYPE_HAL = 1,
D3DDEVTYPE_REF = 2,
D3DDEVTYPE_SW = 3,
D3DDEVTYPE_NULLREF = 4
};
typedef enum D3DSWAPEFFECT
{
D3DSWAPEFFECT_DISCARD = 1,
D3DSWAPEFFECT_FLIP = 2,
D3DSWAPEFFECT_COPY = 3
};
struct D3DPRESENT_PARAMETERS
{
DWORD BackBufferWidth;
DWORD BackBufferHeight;
DWORD BackBufferFormat;
DWORD BackBufferCount;
DWORD MultiSampleType;
DWORD MultiSampleQuality;
DWORD SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
DWORD AutoDepthStencilFormat;
DWORD Flags;
DWORD FullScreen_RefreshRateInHz;
DWORD PresentationInterval;
};
class IDirect3DDevice9: public IUnknown {};
class IDirect3D9:
public IUnknown
{
public:
virtual UINT32 __stdcall Function00(void) = 0;
virtual UINT32 __stdcall Function01(void) = 0;
virtual UINT32 __stdcall Function02(void) = 0;
virtual UINT32 __stdcall Function03(void) = 0;
virtual UINT32 __stdcall Function04(void) = 0;
virtual UINT32 __stdcall Function05(void) = 0;
virtual UINT32 __stdcall Function06(void) = 0;
virtual UINT32 __stdcall Function07(void) = 0;
virtual UINT32 __stdcall Function08(void) = 0;
virtual UINT32 __stdcall Function09(void) = 0;
virtual UINT32 __stdcall Function10(void) = 0;
virtual UINT32 __stdcall Function11(void) = 0;
virtual UINT32 __stdcall Function12(void) = 0;
virtual UINT32 __stdcall CreateDevice(UINT32 Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, UINT32 BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface) = 0;
};
#endif
typedef IDirect3D9* (__stdcall *Func_Direct3DCreate9)(UINT32 SDKVersion);
struct MODULEINFO
{
LPVOID lpBaseOfDll;
DWORD SizeOfImage;
LPVOID EntryPoint;
};
BOOL GetModuleInformation(HANDLE hProcess, HMODULE hModule, MODULEINFO *lpmodinfo, DWORD cb)
{
typedef BOOL (WINAPI *wapiGetModuleInformation)(HANDLE hProcess, HMODULE hModule, MODULEINFO *lpmodinfo, DWORD cb);
HMODULE hLib;
BOOL rVal;
wapiGetModuleInformation fpGetModuleInformation;
hLib = LoadLibrary("Psapi.dll");
fpGetModuleInformation = (wapiGetModuleInformation)GetProcAddress(hLib, "GetModuleInformation");
rVal = fpGetModuleInformation(hProcess, hModule, lpmodinfo, cb);
FreeLibrary(hLib);
return rVal;
}
DWORD EnableDebugPriviliges()
{
HANDLE hProcess;
HANDLE hToken;
DWORD rVal;
TOKEN_PRIVILEGES Priviliges;
rVal = LookupPrivilegeValue(NULL, "SeDebugPrivilege", &Priviliges.Privileges[0].Luid);
if(0 == rVal)
{
return 0;
}
hProcess = GetCurrentProcess();
rVal = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
if(0 == rVal)
{
return 0;
}
Priviliges.PrivilegeCount = 1;
Priviliges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
rVal = AdjustTokenPrivileges(hToken, FALSE, &Priviliges, sizeof(Priviliges), NULL, NULL);
CloseHandle(hToken);
return (0 != rVal);
}
void* GetOffsetEndScene(void)
{
DWORD PID;
DWORD rVal;
HMODULE hLib;
Func_Direct3DCreate9 MyDirect3DCreate9;
IDirect3D9 *pDirect3D;
IDirect3DDevice9 *pDirect3DDevice;
D3DPRESENT_PARAMETERS PP;
HWND hWnd;
void *pEndScene;
MODULEINFO MI;
HANDLE hProcess;
rVal = GetProcessByExeName("wow.exe", &PID);
if(0 == rVal)
{
return 0;
}
hWnd = CreateWindowEx(0, "BUTTON", "BUTTON", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
hLib = LoadLibrary("d3d9.dll");
MyDirect3DCreate9 = (Func_Direct3DCreate9)GetProcAddress(hLib, "Direct3DCreate9");
pDirect3D = MyDirect3DCreate9(SDK_VERSION);
if(NULL != pDirect3D)
{
ZeroMemory(&PP, sizeof(PP));
PP.Windowed = TRUE;
PP.SwapEffect = D3DSWAPEFFECT_DISCARD;
PP.BackBufferFormat = D3DFMT_UNKNOWN;
pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &PP, &pDirect3DDevice);
if(NULL != pDirect3DDevice)
{
pEndScene = (*reinterpret_cast<void***>(pDirect3DDevice))[42];
pDirect3DDevice->Release();
}
pDirect3D->Release();
}
GetModuleInformation(GetCurrentProcess(), hLib, &MI, sizeof(MI));
FreeLibrary(hLib);
DestroyWindow(hWnd);
pEndScene = (void*)((DWORD)pEndScene - (DWORD)MI.lpBaseOfDll);
EnableDebugPriviliges();
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
GetModuleInformation(hProcess, hLib, &MI, sizeof(MI));
CloseHandle(hProcess);
pEndScene = (void*)((DWORD)pEndScene + (DWORD)MI.lpBaseOfDll);
return pEndScene;
}
int main(void)
{
std::cout << GetOffsetEndScene() << std::endl;
return 0;
}