本贴只针对win7 x64系统下的 32位D3D9程序,局限性太大,仅作为抛砖引玉 。
下面进入正题。
基本流程如下:
1:在内核中 hook相关shadowSSDT或SSDT函数
2:在目标进程申请内存,写入用于D3D9绘制的shellcode
3:利用APC的力量回到 用户模式,执行用于D3D9绘制的
shellcode。
首先,如果我们要做一个hook D3D9的绘制。
自然是要编写dll,
注入到目标进程,
hook D3D9虚函数,
获取到D3D9设备,
执行绘制代码。
时至今日,这种技术已经是基本操作了。
经历各大游戏厂商(代理商)以及外挂作者们之间的斗争,
这种注入以及hook的方式已然不可取。
那么是否有一种相对隐蔽的方式来完成这项工作呢?
答案是有的。(废话,没有你写这贴干嘛【滑稽】)
从我们能想到的根本问题入手的话......
在应用层
hook D3D9虚函数以及直接注入dll会拉闸,
既然如此,我们在内核层做hook,代码全都以shellcode的形式
在目标进程里跑起来。
在win7 x64下,
通过调试一个网上下载的D3D9示例Demo
仔细跟踪其 D3D9的Present函数,我们发现
Present
最终会调用
USER32.HungWindowFromGhostWindow+20处的代码
反汇编如下:
call fs:[000000C0]其实是call Wow64子系统的调用
经过Wow64子系统的包装,最终进入内核。
mov eax, 000012CF这句汇编代码
其中 000012CF代表的是 shadowSSDT 的索引值
了解过 SSDT&shadowsSSDT的朋友都知道
第一个4k页面指向的是SSDT函数
第二个4k页面指向的是shadowSSDT函数
另外两个页面未使用(这是题外话。)
00000012CF在第二个页面上,所以这个索引指向shadowSSDT函数。
我们减去 0x1000 就是它的真实索引值 0x02CF,十进制就是 719。
我们打开PChunter这款非常有用的软件, 我们可以看到索引719指向的
shadowSSDT函数名 NtUserHwndQueryRedirectionInfo
接下来我们就hook这个函数并写好过滤
一般来说,这种shadowSSDT函数,只传进来一个参数(rcx), 保险起见我们写四个。
示例过滤函数如下:(自备shadowSSDT hook引擎,本贴不会放完整代码,防止伸手)
But, 光是这样是不够的, 我们还要在这里获取到D3D9的设备。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课