这个项目能做什么
dearxan 是一个用于静态和运行时分析及修补 Arxan(现为 GuardIT)插入二进制文件中的检查的库。根据 README,它可以完全中和使用 Arxan 的 FromSoftware 游戏中的保护:一旦应用补丁,任何 Arxan 代码(如反调试和完整性检查)都不会运行,加密函数保持解密状态。
README 指出一个注意事项:Arxan 入口点存根仍然必须运行。这些存根不执行反调试检查,但在某些游戏(例如《黑暗之魂 重制版》)中,它们执行完整性检查,如果检测到修改,可能导致游戏崩溃。这可以通过在传递给 neuter_arxan 的回调中放置钩子来缓解。作者表示,一旦入口点存根被完全逆向工程,这将不再必要。
README 中列出的已测试游戏:
- 黑暗之魂 重制版
- 黑暗之魂 II 原罪学者
- 黑暗之魂 III
- 艾尔登法环
- 装甲核心 VI
- 艾尔登法环 黑夜君临
该 crate 仅针对这些 FromSoftware 游戏最新版本中的 Arxan 变体进行了测试,可能不适用于其他开发者使用的 Arxan 配置。欢迎贡献。
描述的使用选项:
- 从 Rust 使用 disabler 功能:将 dearxan 添加到 Cargo.toml,并调用 dearxan::disabler::neuter_arxan 一次,最好在游戏入口点执行之前。回调接收结果,是安装钩子的建议位置。
- 从 C++ 使用:从 Releases 下载静态库,使用附带的 Windows 导入库链接,包含 include/dearxan.h 并调用 dearxan::neuter_arxan。最低支持标准为 C++14,推荐 C++17+。
- 从 C 使用:使用相同的库和头文件,调用 dearxan_neuter_arxan 并传入回调。
- 从其他语言使用:从 include/dearxan.h 生成 C 绑定,并调用 dearxan_neuter_arxan。
README 警告,许多 DLL 注入器或模组启动器不会在创建时挂起进程,或以其他方式让代码在游戏入口点之前运行。该 crate 尽力支持此类加载器,但强烈建议使用在入口点之前加载模组的加载器。对于与 me3 兼容的魂系列游戏,该 crate 已通过 disable_arxan 配置文件选项集成到该模组加载器中,如果模组已依赖 me3,建议使用该选项。
对于编写自定义修补器(例如修补磁盘上的可执行文件),README 表示需要使用 dearxan::analysis::analyze_all_stubs 或等效 API 分析 Arxan 存根,将生成的 StubInfo 值传递给 dearxan::patch::ArxanPatch::build_from_stubs,并手动应用补丁。这必须重复进行,直到找不到新的存根,因为某些游戏具有在第一次分析过程中未发现的加密存根。对于实时可执行映像,重要的是 Arxan 入口点存根已被调用;FromSoftware 二进制文件也可能被 SteamStub 包装。
README 描述了 Arxan 功能,包括指令变异和控制流混淆、敏感函数在静态时加密并在执行时解密、反调试检查,以及可以写入缓冲区标志、通过栈或控制流损坏使游戏崩溃或修复函数代码的完整性检查。Arxan 逻辑包含在插入任意游戏函数的存根中;这些存根保存上下文、运行 Arxan 逻辑、恢复上下文并跳回。
该 crate 通过查找这些存根并访问其控制流图来禁用 Arxan。它使用部分指令模拟并在分支处分叉程序状态以处理控制流混淆,然后分析存根结构以提取补丁。这些通常是跳转到蹦床的钩子,用于修复存根的栈,有时还包括提取解密代码区域以直接写入其内容。
功能标志:
- disabler(默认):提供通过 neuter_arxan 完全禁用 Arxan 的修补器。
- rayon(默认):使用 rayon 并行化存根分析。
- ffi:导出 C 函数 dearxan_neuter_arxan。
- instrument_stubs:基于 disabler,通过为每个存根插桩以在首次调用时记录消息;README 警告,由于寄存器破坏,目前除《黑暗之魂 重制版》外的游戏会崩溃。
- internal_api:通过 dearxan::analysis::internal 公开大多数内部二进制分析 API;这些 API 不稳定,可能在次要版本之间发生变化。
致谢提到 dasaav 为 neuter_arxan 提供全局同步,帮助逆向工程 Arxan 存储内存区域以解密的方式,并找到加密算法(32 轮 TEA)。
评论
0 评分人数达到10人后显示
登录后参与讨论。