最近研究了下FPS游戏透视方法,市面上透视大概分为两种,一种是方框透视 就是在游戏角色模型上画一个框,另外一种就是Z缓冲区透视,这种透视原理是对指定模型(一般是人物模型)禁用Z缓冲进行深度测试,当然这两种都可以是基于D3D的,第一种方块透视也可以是不用D3D绘制方块,找到人物坐标 直接转换坐标为投影视图坐标,再用GDI绘制到屏幕上,也可以。

今天我想说的是D3D Z缓冲透视,你需要一些DX基础知识,可以百度下  很多资料、下面代码以D3D9为例

首先Hook Dx,Hook Dx 有不同的方法,网上也应该能找到许多现成的代码,我就说下我常用的。

Hook Dx函数之前 我们要找到函数所在类的指针,然后再通过保存指针的内存地址+偏移定位到成员函数内存地址 ,其他的就和Hook普通函数一样。

Dx程序在调用Dx绘图之前要调用 Direct3DCreate9 获得D3D接口指针IDirect3D9, 通过IDirect3D9对象函数CreateDevice创建设备 获得设备指针、

下面代码演示如何获得这几个指针:

void OnHookInit()//CreateDevice
{
//这里只是hookDirect3DCreate9  pC=GetProcAddress(GetModuleHandle("d3d9.dll"),"Direct3DCreate9");//获得内存地址  DWORD oldpro=0;  memcpy(d3dcen5bytes,pC,5);  VirtualProtect(pC,5,PAGE_EXECUTE_READWRITE,&oldpro);  *(BYTE*)pC=0xe9;//0xe9在汇编中是跳转指令操作码  *(DWORD*)((BYTE*)pC+1)=(DWORD)hookedDirect3DCreate9-(DWORD)pC-5;//目标地址-原地址-5
}  ---------------------------------------------------------------  //当运行到Direct3DCreate9时跳转到这里
IDirect3D9 * _stdcall hookedDirect3DCreate9(  UINT SDKVersion  )
{  __asm pushad  memcpy(pC,d3dcen5bytes,5);//首先还原入口的5个字节  m_pD3D=Direct3DCreate9(SDKVersion);  if(m_pD3D){//如果成功  pCdev=(void*)*(DWORD*)(*(DWORD*)m_pD3D+0x40);//获得IDirect3D9::CreateDevice的地址指针  DWORD oldpro=0;  memcpy(devcen5bytes,pCdev,5);//保存IDirect3D9::CreateDevice入口5个字节  VirtualProtect(pCdev,5,PAGE_EXECUTE_READWRITE,&oldpro);  *(BYTE*)pCdev=0xe9;  *(DWORD*)((BYTE*)pCdev+1)=(DWORD)hookedCreateDevice-(DWORD)pCdev-5;  }  __asm popad  return m_pD3D;
}  //当运行到IDirect3D9::CreateDevice的时候跳转到这里
HRESULT _stdcall hookedCreateDevice(  LPDIRECT3D9 pDx9,  UINT Adapter,  D3DDEVTYPE DeviceType,  HWND hFocusWindow,  DWORD BehaviorFlags,  D3DPRESENT_PARAMETERS * pPresentationParameters,  IDirect3DDevice9 ** ppReturnedDeviceInterface  )
{  __asm pushad  memcpy(pCdev,devcen5bytes,5);//先还原入口的5个字节  HRESULT ret=pDx9->CreateDevice( //创建设备  Adapter,  DeviceType,  hFocusWindow,  BehaviorFlags,  pPresentationParameters,  ppReturnedDeviceInterface);  //x*4=68  if (ret==D3D_OK)  {  //如果创建设备成功  //执行你的HOOK D3D设备对象成员函数代码  //以从缓存区顶点渲染函数为例  LPDIRECT3DDEVICE9 m_pDevice=*ppReturnedDeviceInterface;  DWORD oldpro2=0;  VirtualProtect(Dp,5,PAGE_EXECUTE_READWRITE,&oldpro2);  *(BYTE*)Dp=0xe9;  *(DWORD*)((BYTE*)Dp+1)=(DWORD)hookDrawIndexedPrimitive-(DWORD)Dp-5;  }  __asm popad  return ret;
}  //顶点缓存绘制hook函数
HRESULT _stdcall hookDrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device_Interface, D3DPRIMITIVETYPE Type, INT BaseIndex,UINT MinIndex, UINT NumVertices, UINT AAAAAAAA, UINT PrimitiveCount)   {  __asm pushad  //----------------------------  LPDIRECT3DVERTEXBUFFER9 Stream_Data;  UINT Stride = 0;  UINT iOffsetInBytes =0;  if (Device_Interface->GetStreamSource(0,&Stream_Data,&iOffsetInBytes,&Stride) == D3D_OK)          Stream_Data->Release();  if (Stride==32)  {  Device_Interface->SetRenderState(D3DRS_ZENABLE,false);   }  //-----------------------------  if(pC && pCdev && Dp)  memcpy(Dp,Dp5bytes,5);//先还原IDirect3DDevice9::DrawIndexedPrimitive入口的5字节  HRESULT retdata= Device_Interface->DrawIndexedPrimitive(Type,BaseIndex,MinIndex,NumVertices,AAAAAAAA,PrimitiveCount);  if(pC && pCdev && Dp){  //DWORD oldpro=0;  //VirtualProtect(pPre,5,PAGE_EXECUTE_READWRITE,&oldpro);  //调用完IDirect3DDevice9::DrawIndexedPrimitive后再hook一次  *(BYTE*)Dp=0xe9;  *(DWORD*)((BYTE*)Dp+1)=(DWORD)hookDrawIndexedPrimitive-(DWORD)Dp-5;  }  __asm popad  return retdata;
}  

基本上的D3D Hook流程就完成了 ,对于上面的Hook代码需要的Dx程序 创建D3D设备之前钩住。还有种方法 是直接查找特征 获取指针。

何定位对象下的成员函数地址:

1.打开d3d9.h头文件

2.找到对象指针定义位置

3.下面从第一个对象成员函数开始数 直到DrawIndexedPrimitive函数的定义 函数位置是第83个函数 [ 函数顺序个数-1 * 4 = 函数内存地址]

DrawIndexedPrimitive是 (83-1)*4 = 328 16进制 0x148

然后Hook这个地址就行了。

本文代码测试环境 xp win7 32位 虚幻引擎系列游戏、

D3D9 HOOK [透视原理]相关推荐

  1. 逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理

    逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理 一丶透视简介 我们涉及到FPS游戏.免不了说透视.自瞄什么的. 在CS1.6中. 有OpenGl.也有D3D. 透视的方法很多. gl透视(也 ...

  2. ID Tech 5 中 Megatexturequot;针对地形的D3D9 基本实现原理

    http://blog.csdn.net/BoYueJiang/article/details/8908373 ID Tech 5 中"Megatexture"针对地形的D3D9  ...

  3. 关于FPS透视原理的研究(一)

    关于FPS透视原理的研究(一) 方向一GDI绘制 1.CE找基址,人物X,Y,Z鼠标X,Y 这里我选择获取模块句柄的方式为跨进程访问 还有一种为注入方法用到GetModuleHandle 读取数据并在 ...

  4. 绘画基础学习之两点透视原理

                                          前言 在上一篇中,我们讲述了透视原理中的一点透视.一点透视只有一个灭点,通过一组斜线来表示空间纵深感.下面我们将要学习的是两 ...

  5. 3D动画起步(透视原理)

    透视原理在两门课程上,我们会接触到,一个是物理学,但听起来好像抽像,但另一个听起来似乎很感性哪就是美术学.学到今天也许你会问,动画究竟是属于哪个学科的,真的很难说了,计算机也好,美学也罢,好像都综合了 ...

  6. ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

    ID Tech 5 中"Megatexture"针对地形的D3D9 基本实现原理 ID Tech 5 中"Megatexture"针对地形的D3D9 基本实现原 ...

  7. ID Tech 5 中quot;Megatexturequot;针对地形的D3D9 基本实现原理

    ID Tech 5 中"Megatexture"针对地形的D3D9 基本实现原理 姚勇 H3D 2007-8 本文对ID SOFTWARE 使用的"megatexture ...

  8. Hook API 原理 解析

    1 什么是Hook API 简单的说,一个应用程序要调用一个API函数,例如CreateFileW,那么应用程序必须要知道函数的地址,才能调用它,我对Hook API的理解是,把这个函数地址替换为另一 ...

  9. D3D9 hook Present优化CPU

    D3D9 hook Present优化CPU 具体实现步骤: 1.HOOK Direct3DCreate9来获得类型为LPDIRECT3D9的Direct3D对象的接口指针,它有一个成员函数为 IDi ...

最新文章

  1. 9patch的用法,简单两句就会用了。
  2. 汇编 编程实现从键盘输入三位以内的十进制负数_macOS上的汇编入门(二)——数学基础...
  3. linux内核分为四个子系统,linux操作系统的内核有哪几个子系统构成,简要说明各子系统的作用...
  4. fortran调用matlab画图,[转载]Matlab与Fortran的交互--基本概念
  5. element 表格数据过多时 进行鼠标移上去展示全部
  6. linspace函数matlab_MATLAB用不同颜色绘制多条曲线
  7. python 调试技巧
  8. 《线性代数及其应用》笔记-第三章
  9. 什么软件画er图方便_ER模型怎么画?必备入门级模型图绘制软件
  10. win10环境下matlab2017b编译运行c++文件步骤
  11. mescroll API 汇总
  12. SSM框架讲解(史上最详细的文章)
  13. 网页右侧悬浮QQ在线客服代码
  14. Excel指定单元格锁定
  15. Vue.js实战:初识Vue.js
  16. OS - 浅谈操作系统的内存管理
  17. [技术杂谈]常用远程工具下载各个平台操作系统
  18. 前端开发中组件化的优点
  19. C语言中的fgets函数
  20. 谁生活在地狱,自己心里都有数 ---Leo读 不是孙振耀写的职场感言 3

热门文章

  1. maven下载jar包时lastUpdated问题
  2. 微信图片,此图片来自微信公众平台未经允许不可引用解决方案
  3. Workbench螺栓连接的模拟方法
  4. PDF如何编辑,怎样替换PDF页面
  5. 四川2008省选·洛谷·奖励关
  6. VRChat简易教程4-使用VRC的接口实现物体的移动(VRC的action和trigger接口)
  7. 新闻推荐系统:深度知识感知网络DKN
  8. 2022新版Python+大数据学习路线图,附视频教程
  9. 关于在终端使用pip命令命令
  10. 醇酰基转移酶基因对猕猴桃酯生物合成的作用