D3D透视辅助原理C++游戏逆向
lipiwang 2024-12-01 00:49 9 浏览 0 评论
关于D3D透视的文章其实早就有位大牛发过了这里我就以我的视角详细讲讲,制作一个D3D辅助的详细过程吧,下面我还会把源码给大家,也算是个万能模板吧,只要是使用D3D9的游戏都可以吧。
工具 VS2010 ,游戏就是360的终极火力,debugview ,VC++6.0里面的工具(spy++,depends),dxsdk_jun10(开发环境),kerneldective。
下面我就说说原理,3d游戏有使用两种渲染的方法,一种是Direct3D,一种是opengl,所以说开opengl就不能用d3d透视了
,那么我今天说得是使用d3d9这个动态链接库的游戏。
既然是透视那么,必然要hook某个函数对其做做过滤,所以我们可以用depends打开c盘下system32文件夹里面的d3d9.ll
,发现并没有我们想要的DrawIndexedPrimitive这个函数,查阅msdn才发现,都被封装在com组件里,以类的方式调用,所
以当我们查看msdn的时候,总是看到IDirect3DDevice9::DrawIndexedPrimitive ,DrawIndexedPrimitive是在
IDirect3DDevice9这个类里面,所以说要找DrawIndexedPrimitive的地址就变得很棘手了,但是我们可以另辟蹊径自己写一
个D3D9的程序然后自己调用DrawIndexedPrimitive,这时候我们调试它就在DrawIndexedPrimitive下个断点,跟踪就找到
DrawIndexedPrimitive的地址了,因为每一次开机
dll都要重定位,但是每个进程加载相同dll时候dll的基地址不变,只有重启才会变化,我们找到DrawIndexedPrimitive的地址
然后减去我们用kerneldective查看到的d3d9.dll的基地址,这样就得到偏移了,我们编程的时候就可以算出
DrawIndexedPrimitive的地址了。
至于HRESULT DrawIndexedPrimitive(
[in] ,D3DPRIMITIVETYPE Type
[in] INT pDevice,
[in] UINT MinIndex,
[in] UINT NumVertices,
[in] UINT StartIndex,
[in] UINT PrimitiveCount
);
有五个参数其中对我们有用的就是NumVertices(渲染的顶点索引的跨度 ,这个和Strides(数据流中每个顶点所占内存的大
小),都是我们区分人物模型的重要来源,Strides可以这样得到 pDevice->GetStreamSource(0, &Stream_Data, &Stride);
一个简单的调用,获得两个参数后接下来再在游戏中通过char temp【512】 sprint(temp,"d\r
\n",Stride);OutputDebugStrinA\(temp);
来打印,然后打开debugview勾上capture32来接收信息,接下来就可以进行过滤工作了。一般Stirde的值都在100之内而且
也就几个而已,对于这个游戏用Stride判断就可以了,一个个过滤,
我们写个判断语句if(Stride==1){ pDevice->SetRenderState( D3DRS_ZENABLE,FALSE);
else{ pDevice->SetRenderState( D3DRS_ZENABLE,TRUE},SetRenderState的第三个参数为假意思是禁用z轴缓冲。不知道
大家听懂了没,我都是把自己觉得容易的都说出来了。
原理说完了,接下来就是编程解决问题了,这个对于我来说也是个很大的挑战,因为编程我也是不太的菜鸟,其中有些细节
也是困扰了我很久,我会在下面提示需要注意的地方。
首先安装好VS2010 感觉挺不错的加了代码错误提示极大方便了我们,和dxsdk_jun10(开发环境),然后我们在D盘目录
下创建个D3DHook文件夹 打开VS2010 新建
MFC的应用程序类型选择基于对话框,,接着在解决方案中添加win32项目,在应用程序设置中选择dll(名字就叫Hookdll),
勾上导出符号(这是我们注入用的动态链接库),完成,接下去在Hookdll开始写函数了,既然是hook就需要改写进程方法就
是注入,我用的是 HHOOK WINAPI SetWindowsHookEx(
__in int idHook, \\钩子类型
__in HOOKPROC lpfn, \\回调函数地址
__in HINSTANCE hMod, \\实例句柄
__in DWORD dwThreadId); \\线程ID
通过钩子注入,其中 第一个参数就是钩子的类型,其中类型好多详情参考msdn,那就是选择WH_CBT ,这是一个notice类型
的钩子,然后第二个参数回调函数,
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
就是触发钩子后操作系统会调用这个函数,
简单的dll写好后我们试着编译,编译好了就编译另一个注入用的程序,他需要调用动态链接库所以编译前得配置一下包含
文件等等,右键这个对话框程序的项目点属性-》配置属性-》vc++目录,其中添加包含目录D:\D3DHook\D3DHook
\Hookdll,链接器-》输入-》附加依赖项是Hookdll.lib,链接器-》输入-》常规-》附加库目录是D:\D3DHook\D3DHook
\Debug,然后编译。
配置ide环境,为后面使用d3d绘图函数提供所需文件,也是在项目属性里面VC++目录中的包含文件那一项,添加,
E:\d3d\include,库文件中的那项添加,E:\d3d\lib\x86(我的dx sdk 安装在d:\d3d目录)。这样ide环境就配置好了。
其他,编程的我都在源码里面注释很清楚了。
代码中 jmp 地址换算问题 ,这里有个公式 ,
JMP的地址(88881234) – 代码地址(010073bb) – 5(字节) = 机器码跳转地址(E9 87879e74)
下面讲一下,调试中的问题和工具的使用:
附件,示例代码拿来编译,在Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0,0,5,0,1);插入int3断点,运行,
就会断下来了,这还没显示出汇编,按下调试选项-》窗口-》反汇编
,接着F11跟进call eax,就到了,如何用spy++获取窗口类,search下面那个望远镜,点一下,然后鼠标点击新窗口的那个靶子,按住不放,再移到游戏窗口中就会显示出它的类了,class就是类
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)