设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2810|回复: 3
打印 上一主题 下一主题

[有事请教] 关于一段DirectX8,Hook的代码。

[复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2012-4-21 20:51:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 yangff 于 2012-4-21 20:52 编辑

这段代码是根据Direct9 Hook的修改的,
曾在RMXP上成功过,
但是在VA 的时候似乎失败了?求各种神犇。。。
@晴兰
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <d3d8.h>
  4. #include <D3dx8core.h>
  5. #include <d3d9.h>
  6. #ifdef _MANAGED
  7. #pragma managed(push, off)
  8. #endif
  9. IDirect3D8 * _stdcall hookedDirect3DCreate8(UINT SDKVersion);
  10. HRESULT _stdcall hookedCreateDevice(
  11.                                                                   LPDIRECT3D8 pDx8,
  12.                                                                   UINT Adapter,
  13.                                                                   D3DDEVTYPE DeviceType,
  14.                                                                   HWND hFocusWindow,
  15.                                                                   DWORD BehaviorFlags,
  16.                                                                   D3DPRESENT_PARAMETERS * pPresentationParameters,
  17.                                                                   IDirect3DDevice8 ** ppReturnedDeviceInterface

  18.                                                                   );
  19. BOOL _stdcall DrawMyText(LPDIRECT3DDEVICE8 pDxdevice,TCHAR* strText ,int nbuf);
  20. //STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice8** ppReturnedDeviceInterface) PURE;
  21. LPDIRECT3D8 m_pD3D=NULL; //Direct3D对象的接口指针

  22. void * pC=NULL;//Direct3DCreate8函数地址指针
  23. void * pCdev=NULL;//IDirect3D8::CreateDevice函数地址指针
  24. void * pPre=NULL;//IDirect3DDevice8::Present函数地址指针

  25. BYTE d3dcen5bytes[5];//用于保存Direct3DCreate8入口的5字节
  26. BYTE devcen5bytes[5];//用于保存IDirect3D8::CreateDevice入口的字节
  27. BYTE pren5bytes[5];//用于保存IDirect3DDevice8::Present入口的5字节
  28. //当程序运行到IDirect3DDevice8::Present入口处将跳转到这里
  29. HRESULT _stdcall hookedPresent(
  30.                                                          LPDIRECT3DDEVICE8 pDxdevice,//类的this指针
  31.                                                          CONST RECT * pSourceRect,//此参数请参考dx sdk
  32.                                                          CONST RECT * pDestRect,//同上
  33.                                                          HWND hDestWindowOverride,//同上
  34.                                                          CONST RGNDATA * pDirtyRegion//同上

  35.                                                          )
  36. {
  37.         __asm pushad
  38.         //绘制代码开始
  39.         if(pCdev && pC && pPre){
  40.                         char strdraw[]="在RM中描绘文字的蛋疼测试!";
  41.                         DrawMyText(pDxdevice,strdraw,sizeof strdraw-1);//绘制文本
  42.         }
  43.         //绘制代码结束
  44.         if(pC && pCdev && pPre)
  45.         memcpy(pPre,pren5bytes,5);//先还原IDirect3DDevice9::Present入口的5字节

  46.         HRESULT retdata= pDxdevice->Present(pSourceRect,pDestRect,hDestWindowOverride,pDirtyRegion);

  47.         if(pC && pCdev && pPre){
  48.                 //DWORD oldpro=0;
  49.                 //VirtualProtect(pPre,5,PAGE_EXECUTE_READWRITE,&oldpro);
  50.                 //调用完IDirect3DDevice8::Present后再hook一次
  51.                 *(BYTE*)pPre=0xe9;
  52.                 *(DWORD*)((BYTE*)pPre+1)=(DWORD)hookedPresent-(DWORD)pPre-5;
  53.         }

  54.         __asm popad
  55.         return retdata;
  56. }
  57. //当运行到Direct3DCreate8时跳转到这里
  58. IDirect3D8 * _stdcall hookedDirect3DCreate8(
  59.         UINT SDKVersion
  60.         )
  61. {
  62.         __asm pushad

  63.                 memcpy(pC,d3dcen5bytes,5);//首先还原入口的5个字节
  64.         m_pD3D=Direct3DCreate8(SDKVersion);
  65.         if(m_pD3D){//如果成功
  66.                 MessageBox(0,"hookedDirect3DCreate8","hookedDirect3DCreate8",0);
  67.                 pCdev=(void*)*(DWORD*)(*(DWORD*)m_pD3D+0x30);//获得IDirect3D8::CreateDevice的地址指针

  68.                 DWORD oldpro=0;
  69.                 memcpy(devcen5bytes,pCdev,5);//保存IDirect3D9::CreateDevice入口5个字节
  70.                 VirtualProtect(pCdev,5,PAGE_EXECUTE_READWRITE,&oldpro);
  71.                 *(BYTE*)pCdev=0xe9;
  72.                 *(DWORD*)((BYTE*)pCdev+1)=(DWORD)hookedCreateDevice-(DWORD)pCdev-5;

  73.         }else{//如果失败就再hook一次
  74.                 DWORD oldpro=0;
  75.                 VirtualProtect(pC,5,PAGE_EXECUTE_READWRITE,&oldpro);
  76.                 *(BYTE*)pC=0xe9;
  77.                 *(DWORD*)((BYTE*)pC+1)=(DWORD)hookedDirect3DCreate8-(DWORD)pC-5;
  78.         }

  79.         __asm popad
  80.                 return m_pD3D;
  81. }
  82. //当运行到IDirect3D9::CreateDevice的时候跳转到这里
  83. HRESULT _stdcall hookedCreateDevice(
  84.                                                                   LPDIRECT3D8 pDx8,
  85.                                                                   UINT Adapter,
  86.                                                                   D3DDEVTYPE DeviceType,
  87.                                                                   HWND hFocusWindow,
  88.                                                                   DWORD BehaviorFlags,
  89.                                                                   D3DPRESENT_PARAMETERS * pPresentationParameters,
  90.                                                                   IDirect3DDevice8 ** ppReturnedDeviceInterface

  91.                                                                   )
  92. {
  93.         __asm pushad


  94.                 memcpy(pCdev,devcen5bytes,5);//先还原入口的5个字节

  95.        
  96.         HRESULT ret=pDx8->CreateDevice( //创建设备
  97.                 Adapter,
  98.                 DeviceType,
  99.                 hFocusWindow,
  100.                 BehaviorFlags,
  101.                 pPresentationParameters,
  102.                 ppReturnedDeviceInterface);


  103.         if (ret==D3D_OK){//如果创建设备成功
  104.                 MessageBox(hFocusWindow,"hookedCreateDevice","hookedCreateDevice",0);
  105.                 LPDIRECT3DDEVICE8 m_pDevice=*ppReturnedDeviceInterface;

  106.                 pPre=(void*)*(DWORD*)(*(DWORD*)m_pDevice+0x30);//获得IDirect3DDevice9::Present的地址指针
  107.                 memcpy(pren5bytes,pPre,5);//保存IDirect3DDevice9::Present入口的5个字节
  108.                 DWORD oldpro=0;
  109.                 VirtualProtect(pPre,5,PAGE_EXECUTE_READWRITE,&oldpro);
  110.                 *(BYTE*)pPre=0xe9;
  111.                 *(DWORD*)((BYTE*)pPre+1)=(DWORD)hookedPresent-(DWORD)pPre-5;



  112.         }else{//如果失败再hookIDirect3D9::CreateDevice一次
  113.                 DWORD oldpro=0;
  114.                 VirtualProtect(pCdev,5,PAGE_EXECUTE_READWRITE,&oldpro);
  115.                 *(BYTE*)pCdev=0xe9;
  116.                 *(DWORD*)((BYTE*)pCdev+1)=(DWORD)hookedCreateDevice-(DWORD)pCdev-5;
  117.         }
  118.         __asm popad
  119.                 return ret;
  120. }
  121. //我自己的绘制文本的过程
  122. BOOL _stdcall DrawMyText(LPDIRECT3DDEVICE8 pDxdevice,TCHAR* strText ,int nbuf)
  123. {

  124.         if(m_pD3D && pDxdevice){

  125.                 RECT myrect;
  126.                 myrect.top=150;  //文本块的y坐标
  127.                 myrect.left=0; //文本块的左坐标
  128.                 myrect.right=500+myrect.left;
  129.                 myrect.bottom=100+myrect.top;
  130.                 pDxdevice->BeginScene();//开始绘制

  131.                 LOGFONT lf;
  132.                 ZeroMemory(&lf, sizeof(LOGFONT));
  133.        
  134.                 lf.lfHeight = 24; //字体高度
  135.                 lf.lfWidth = 12; // 字体宽度
  136.                 lf.lfWeight = 100;
  137.                 lf.lfItalic = false;
  138.                 lf.lfCharSet = DEFAULT_CHARSET;
  139.                 strcpy(lf.lfFaceName, "Times New Roman"); // 字型
  140.                 ID3DXFont* font=NULL;
  141.                 if(D3D_OK!=D3DXCreateFontIndirect(pDxdevice, &lf, &font)) //创建字体对象
  142.                         return false;
  143.                 font->DrawTextA(strText,nbuf,&myrect,DT_TOP | DT_LEFT,D3DCOLOR_ARGB(0,255,255,255));
  144.                 pDxdevice->EndScene();//结束绘制
  145.                 font->Release();//释放对象
  146.         }
  147.         return true;
  148. }



  149. bool StartHooker()
  150. {
  151.         pC=GetProcAddress(GetModuleHandle("d3d8.dll"),"Direct3DCreate8");//获得内存地址
  152.         DWORD oldpro=0;
  153.         memcpy(d3dcen5bytes,pC,5);
  154.         VirtualProtect(pC,5,PAGE_EXECUTE_READWRITE,&oldpro);
  155.         *(BYTE*)pC=0xe9;//0xe9在汇编中是跳转指令操作码
  156.         *(DWORD*)((BYTE*)pC+1)=(DWORD)hookedDirect3DCreate8-(DWORD)pC-5;//目标地址-原地址-5
  157.         //char str[255];
  158.         //sprintf(str,"%d",pC);
  159.         //MessageBox(0,str,"StartHooker",0);
  160.         return true;
  161. }
  162. BOOL WINAPI DllMain(
  163.   __in  HINSTANCE hinstDLL,
  164.   __in  DWORD fdwReason,
  165.   __in  LPVOID lpvReserved
  166. )
  167. {
  168.        
  169.         return 1;
  170. }
复制代码
哎呀,蛋疼什么的最有爱了

Lv1.梦旅人

梦石
0
星屑
100
在线时间
5250 小时
注册时间
2011-10-7
帖子
1885

开拓者贵宾

2
发表于 2012-4-21 21:21:37 | 只看该作者
围观神触,召唤@晴兰

点评

了解了,RM系列特么用的DirectDraw我擦……用DX8用DD……围观eb!神级程序猿  发表于 2012-4-21 21:55
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5263
在线时间
1127 小时
注册时间
2011-12-18
帖子
1264
3
发表于 2018-7-6 20:33:19 | 只看该作者
請問怎麼用? 這是 C# 嗎?
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39607
在线时间
7482 小时
注册时间
2009-7-6
帖子
13482

开拓者贵宾

4
发表于 2018-7-6 21:26:51 | 只看该作者
sdgn 发表于 2018-7-6 20:33
請問怎麼用? 這是 C# 嗎?

显然C++,不过这已经是上古老坟了,而且目前d3dhook的资料一大把……现成的到处都是
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 19:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表