天天看點

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

其實很簡單.主要針對D3D遊戲.主要思路:Hook IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent,在其中加入sleep函數.讓系統獲得更多的CPU時間片.

試驗遊戲:劍網三(以D3D9為例)

具體實作步驟:

1.HOOK Direct3DCreate9來獲得類型為LPDIRECT3D9的Direct3D對象的接口指針,它有一個成員函數為 IDirect3D9::CreateDevice,是以,隻要根據Direct3D對象接口指針找到Direct3D對象的虛函數表,再根據虛函數表确定IDirect3D9::CreateDevice的記憶體位址,就可以hook這個函數,進而獲得類型為LPDIRECT3DDEVICE9的裝置對象指針,然後根據裝置對象指針找到裝置對象的虛函數表,根據虛函數表找到IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent在記憶體中的位址,對其進行 HOOK,在其中加入sleep函數.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//代碼參考runjin

#include

#include

#pragma comment(lib, "D3D9.lib")

#pragma comment(lib, "D3Dx9.lib")

void GameD3D_HOOK();

IDirect3D9 * _stdcall New_Direct3DCreate9(UINT SDKVersion);

HRESULT _stdcall New_CreateDevice(

LPDIRECT3D9 pDx9,

UINT Adapter,

D3DDEVTYPE DeviceType,

HWND hFocusWindow,

DWORD BehaviorFlags,

D3DPRESENT_PARAMETERS * pPresentsentationParameters,

IDirect3DDevice9 ** pPresentturnedDeviceInterface

);

HRESULT _stdcall New_Present(

LPDIRECT3DDEVICE9 pDxdevice,

CONST RECT * pSourceRect,

CONST RECT * pDestRect,

HWND hDestWindowOverride,

CONST RGNDATA * pDirtyRegion

);

LPDIRECT3D9 m_pD3D=NULL; //Direct3D對象的接口指針

void * pDirect3DCreate9=NULL;//Direct3DCreate9函數位址指針

void * pCreateDevice=NULL;//IDirect3D9::CreateDevice函數位址指針

void * pPresent=NULL;//IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent函數位址指針

int Sleeptime=50;//延時時間

BYTE Direct3DCreate_Begin[5];//用于儲存Direct3DCreate9入口的5位元組

BYTE CreateDevice_Begin[5];//用于儲存IDirect3D9::CreateDevice入口的位元組

BYTE Present_Begin[5];//用于儲存IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent入口的5位元組

void GameD3D_HOOK()

{

//hook Direct3DCreate9

pDirect3DCreate9=GetProcAddress(GetModuleHandle("d3d9.dll"),"Direct3DCreate9");

DWORD oldproc=0;

memcpy(Direct3DCreate_Begin,pDirect3DCreate9,5);

VirtualProtect(pDirect3DCreate9,5,PAGE_EXECUTE_READWRITE,&oldpro);

*(BYTE*)pDirect3DCreate9=0xe9;

*(DWORD*)((BYTE*)pDirect3DCreate9+1)=(DWORD)New_Direct3DCreate9-(DWORD)pDirect3DCreate9-5;

}

//當運作到Direct3DCreate9時跳轉到這裡

IDirect3D9 * _stdcall New_Direct3DCreate9(

UINT SDKVersion

)

{

__asm pushad

memcpy(pDirect3DCreate9,Direct3DCreate_Begin,5);//首先還原入口的5個位元組

m_pD3D=Direct3DCreate9(SDKVersion);

if(m_pD3D){//如果成功

pCreateDevice=(void*)*(DWORD*)(*(DWORD*)m_pD3D+0x40);//獲得IDirect3D9::CreateDevice的位址指針

DWORD oldpro=0;

memcpy(CreateDevice_Begin,pCreateDevice,5);//儲存IDirect3D9::CreateDevice入口5個位元組

VirtualProtect(pCreateDevice,5,PAGE_EXECUTE_READWRITE,&oldpro);

*(BYTE*)pCreateDevice=0xe9;

*(DWORD*)((BYTE*)pCreateDevice+1)=(DWORD)New_CreateDevice-(DWORD)pCreateDevice-5;

}else{//如果失敗就再hook一次

DWORD oldpro=0;

VirtualProtect(pDirect3DCreate9,5,PAGE_EXECUTE_READWRITE,&oldpro);

*(BYTE*)pDirect3DCreate9=0xe9;

*(DWORD*)((BYTE*)pDirect3DCreate9+1)=(DWORD)New_Direct3DCreate9-(DWORD)pDirect3DCreate9-5;

}

__asm popad

return m_pD3D;

}

//hook CreateDevice

HRESULT _stdcall New_CreateDevice(

LPDIRECT3D9 pDx9,

UINT Adapter,

D3DDEVTYPE DeviceType,

HWND hFocusWindow,

DWORD BehaviorFlags,

D3DPRESENT_PARAMETERS * pPresentsentationParameters,

IDirect3DDevice9 ** pPresentturnedDeviceInterface

)

{

__asm pushad

memcpy(pCreateDevice,CreateDevice_Begin,5);//先還原入口的5個位元組

HRESULT ret=pDx9->CreateDevice( //建立裝置

Adapter,

DeviceType,

hFocusWindow,

BehaviorFlags,

pPresentsentationParameters,

pPresentturnedDeviceInterface);

if (ret==D3D_OK){//如果建立裝置成功

LPDIRECT3DDEVICE9 m_pDevice=*pPresentturnedDeviceInterface;

pPresent=(void*)*(DWORD*)(*(DWORD*)m_pDevice+0x44);//獲得IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent的位址指針

memcpy(Present_Begin,pPresent,5);//儲存IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent入口的5個位元組

DWORD oldpro=0;

VirtualProtect(pPresent,5,PAGE_EXECUTE_READWRITE,&oldpro);

*(BYTE*)pPresent=0xe9;

*(DWORD*)((BYTE*)pPresent+1)=(DWORD)New_Present-(DWORD)pPresent-5;

}else{//如果失敗再hookIDirect3D9::CreateDevice一次

DWORD oldpro=0;

VirtualProtect(pCreateDevice,5,PAGE_EXECUTE_READWRITE,&oldpro);

*(BYTE*)pCreateDevice=0xe9;

*(DWORD*)((BYTE*)pCreateDevice+1)=(DWORD)New_CreateDevice-(DWORD)pCreateDevice-5;

}

__asm popad

return ret;

}

//當程式運作到IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent入口處将跳轉到這裡

HRESULT _stdcall New_Present(

LPDIRECT3DDEVICE9 pDxdevice,//類的this指針

CONST RECT * pSourceRect,//此參數請參考dx sdk

CONST RECT * pDestRect,//同上

HWND hDestWindowOverride,//同上

CONST RGNDATA * pDirtyRegion//同上

)

{

Sleep(Sleeptime);

__asm pushad

if(pDirect3DCreate9 && pCreateDevice && pPresent)

memcpy(pPresent,Present_Begin,5);//先還原IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent入口的5位元組

HRESULT retdata= pDxdevice-&gt

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent(pSourceRect,pDestRect,hDestWindowOverride,pDirtyRegion);

if(pDirect3DCreate9 && pCreateDevice && pPresent){

//DWORD oldpro=0;

//VirtualProtect(pPresent,5,PAGE_EXECUTE_READWRITE,&oldpro);

//調用完IDirect3DDevice9:

c語言hook dll注入,真正穩定的HOOK DLL注入執行個體,讓新手獲得新生!

resent後再hook一次

*(BYTE*)pPresent=0xe9;

*(DWORD*)((BYTE*)pPresent+1)=(DWORD)New_Present-(DWORD)pPresent-5;

}

__asm popad

return retdata;

}