D3D 透视原理

jogejin834 · · 编程&逆向技术交流
0 0 0

本文共计1815个字,预计阅读时长7.3分钟。

排版好像有问题 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); fsp游戏外挂透视猖獗,这次我们看看大行其道的人物透视,各种外挂是怎样实现的! 此类外挂的原理实际上为cpu向gpu提交render call的时候改变对应的渲染状态。 通常通过hook DrawIndexedPrimitive实现。 以下为github上随便摘抄的一段代码,能说明意思即可: 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段进行扩增了..
最后于 3月前 被jogejin834编辑 ,原因: