
首先这个项目叫RenderDuck,之所以代码里面写作RiderDuck,是因为终末地的ACE在某次更新之后扩大了黑名单匹配范围,连Render这个关键字都不能留下,导致鸭鸭被迫变成骑手呜呜好可怜w
RenderDuck目标是便捷的注入所有从平台(Steam/Epic)启动的单机游戏,尽可能适配防护较轻的在线二游,多人网游的话…emm随缘叭
关于RenderDuck具体改进了什么
这里把如何为目标程序挂入renderdoc.dll分成两个问题回答
首先如何保证dll被进程加载,原版RenderDoc的GlobalHook方案的原理是利用 AppInit 机制把renderdoc的前置注入程序(renderdocshim)带进去。AppInit是一个经典的注册表项,位于(HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\),其下包含3个键值对(AppInit_DLLs, LoadAppInit_DLLs, RequireSignedAppInit_DLLs),具体作用是当AppInit_DLLs值为1时,无差别为用户态下所有启动的应用程序注入LoadAppInit_DLLs列表中的dll
而renderdocshim在被注入加载后,会核对自己是否进入了前端UI中指定的那一个可执行程序。若发现宿主不是目标程序,shim自身则会尽快退出,而一旦进入了目标程序则进入后续 API Hook 环节。
这一步的流程其实原版已经实现的很到位了,只是操作逻辑…嗯,相当不适合人类使用(经典捕获子进程导致 steamwebhelper.exe 无响应)因此RenderDuck将其重构为了选择目标exe路径 -> 进入监听 -> 手动启动,这部分在下文使用指南中会详细介绍。
第二步则是,一旦renderdoc.dll加载进入进程后,会尝试Hook尚未初始化的图形API。从这里开始我为RenderDuck引入的Detour管线将会接管/强化原版的Hook流程,Detours 会保存被覆盖的原始指令,构造 trampoline,并把传入的 target pointer 更新成 trampoline。
这里先回顾一下原版RenderDoc是怎么做API Hook的
相关逻辑实现在 win32_hook.cpp,核心相当传统。对于静态导入而言,它通过 ApplyHook() 找到某个模块的 IAT 入口,把dxgi!CreateDXGIFactory1改成renderdoc!Hooked_CreateDXGIFactory1。如果程序不是静态导入,RenderDoc 的Hooked_GetProcAddress()发现这是它关心的函数以后,会直接返回Hooked_CreateDXGIFactory1,而不是系统函数地址。
简单解释一下我为什么要引入 Export Detour
请考虑一个程序很早做了
1 | pFactory = GetProcAddress(dxgi, "CreateDXGIFactory1"); |
然后把地址缓存下来,之后 RenderDoc 再去改 IAT 已经没有意义了,因为主程序将直接通过 pFactory 调用缓存地址。但我现在通过detour调用的是缓存地址(比如0x7ff…)本身,缓存的是旧地址也没关系。部分游戏依赖Detour导入才可以实现 APIHook,比如 Helldivers2
使用指南
(泥自己去问AI鸭,介点东西还要人家教泥!豆包都比泥聪明!笨死算…唔抱意思,刚才有点不太淑女欸,咳咳~)
首先泥看介个按钮居然素灰色的耶!因为你还木有开启默认处于关闭状态的GlobalHook选项哦~

这里选取目标游戏真正的exe文件,注意补要找错exe了(不然shim当场表演卸载自己)例如对于UE引擎打包的游戏,真正的可执行程序应该在客户端的binary路径下并且以xxx-Shipping64结尾

对于受害(划掉)目标游戏,由于Vulkan的注入路径与DX系列API存在本质区别(通过开启调试层来捕获API调用,但调试层的开启状态本身对于目标游戏透明,可以被轻易识别)如果提供了DX11/12包体尽可能以D3D启动。点击 Wait for Launch 按钮之后将会进入监听,这时需要手动启动目标程序,可以使用任意启动方式,不受游戏启动器限制。

已测试游戏:
Starfield:Creation引擎,没什么特殊之处
StellarBlade:标准UE引擎游戏,注意真实EXE位置即可
HellDivers2:Detour增强后可正常Hook API
No Mans’ Sky:没什么特殊之处
Assassins Creed Shadow:正常Hook,但截取的rdc文件体积巨大,不适合分析
Overwatch2国服:WTF这都能Hook进来反作弊不干活的吗
已测试二游:
少女前线2:反截帧比较草率,只检测原版RDC但漏掉了GPA,图省事的话,GPA开Auto Detect大大方方注入就好w
明日方舟终末地:标准ACE方案,由于没有从启动器拉起游戏的限制,消除特征符号直接本地拉起注入就好。注意使用d3d11而非默认的vulkan api
鸣朝:标准ACE方案,GlobalHook即可
尚无法注入:
(一切需要开启UEFI中SecureBoot/安全启动的游戏)
BF1/BFV: 被EAAC拒绝,已用尽一切力气与手段
Arc Riders: 被EAC拒绝