-
-
[分享] D3D 透视原理
-
发表于: 2023-2-24 12:17 8117
-
fsp游戏外挂透视猖獗,这次我们看看大行其道的人物透视,各种外挂是怎样实现的!
此类外挂的原理实际上为cpu向gpu提交render call的时候改变对应的渲染状态。
通常通过hook DrawIndexedPrimitive实现。
以下为github上随便摘抄的一段代码,能说明意思即可:
1 2 3 4 5 6 7 8 9 | IDirect3DVertexBuffer9 * pStreamData = NULL; UINT iOffsetInBytes, iStride; if (m_pDevice - >GetStreamSource( 0 , &pStreamData, &iOffsetInBytes, &iStride) = = D3D_OK) pStreamData - >Release(); if (iStride = = 游戏中绘制人物数据结构体长度) { m_pDevice - >SetRenderState(D3DRS_ZENABLE, FALSE); } m_pDevice - >SetRenderState(D3DRS_ZENABLE, FALSE); return Transfer_DrawIndexedPrimitive(m_pDevice, type , BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount); |
原理是cpu向gpu提交渲染call时,对应的缓冲区的顶点数据是一个个结构体, 比如我想要绘制人物模型时, 顶点缓冲区每个顶点结构体的大小是多少。 这个iStride大小随着游戏的不同而不同。 比如有的游戏每个顶点 包含 位置(x y z) 颜色 (r g b) 法线向量(x y z) ambient light diffuse light 等等, 随着游戏不同而不同。 当遇到我想要透视的顶点时候设置D3DRS_ZENABLE 为false即实现了透视的效果。
有的游戏单单通过istride来区分是否是当前我想要透视的模型是不够的。 还有一些状态需要判断。
这种实现方式的弱点是很容易被扫描hook扫出来,所以又出现了一种不hook DrawIndexedPrimitive 来实现绝对透视的外挂。叫台湾驱动 绝对透视。 他这个外挂本质上也是hook DrawIndexedPrimitive, 只是不是hook d3d dll里的DrawIndexedPrimitive, 而是在显卡驱动对应的dll里。 比如 aticfx32.dll 或者 nvd3dum.dll 也hook了对应对象的虚表。 hook的这个函数DrawIndexedPrimitive每次也会调用。 也就是说是显卡厂商版本的DrawIndexedPrimitive。 所以慢慢跟踪d3d dll里的DrawIndexedPrimitive的全流程,会跑到外挂代码里,外挂的代码也在aticfx32.dll里,说明台湾驱动绝对透视对显卡厂商的dll的text段进行扩增了..
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)