首页
社区
课程
招聘
[分享] D3D 透视原理
发表于: 2023-2-24 12:17 8117

[分享] 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期)

最后于 2023-2-24 12:20 被弥一编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//