├── .gitignore ├── AskMe └── README.md ├── Bookshelf └── README.md ├── Methodology ├── [方法论] 基于虚拟机字节码的文本修改思路.md ├── [方法论] VFS的实现思路.md ├── [方法论] 免封包略谈.md └── [方法论] 封包逆向入门.md ├── Packer └── [The Enigma Protector] 一些小线索.md ├── Programming ├── QT6 CMake项目配置 (VSCode) │ ├── QT6 CMake项目配置 (VSCode).md │ ├── demo │ │ ├── CMakeLists.txt │ │ ├── main.cpp │ │ ├── mywindow.cpp │ │ ├── mywindow.h │ │ ├── mywindow.qrc │ │ ├── mywindow.ui │ │ └── res │ │ │ └── en.png │ └── img │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png ├── QT6 CMake项目配置 (Visual Studio) │ ├── QT6 CMake项目配置 (Visual Studio).md │ ├── demo │ │ ├── CMakeLists.txt │ │ ├── main.cpp │ │ ├── mywindow.cpp │ │ ├── mywindow.h │ │ ├── mywindow.qrc │ │ ├── mywindow.ui │ │ └── res │ │ │ └── en.png │ └── img │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 19.png │ │ ├── 2.png │ │ ├── 20.png │ │ ├── 21.png │ │ ├── 22.png │ │ ├── 23.png │ │ ├── 24.png │ │ ├── 25.png │ │ ├── 26.png │ │ ├── 27.png │ │ ├── 28.png │ │ ├── 29.png │ │ ├── 3.png │ │ ├── 30.png │ │ ├── 31.png │ │ ├── 32.png │ │ ├── 33.png │ │ ├── 34.png │ │ ├── 35.png │ │ ├── 36.png │ │ ├── 37.png │ │ ├── 38.png │ │ ├── 39.png │ │ ├── 4.png │ │ ├── 40.png │ │ ├── 41.png │ │ ├── 42.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png ├── QT6.7.2源码编译 静态库 动态库 (MSVC) │ ├── QT6.7.2源码编译 静态库 动态库 (MSVC).md │ └── img │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 19.png │ │ ├── 2.png │ │ ├── 20.png │ │ ├── 21.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png ├── discard │ ├── [C++] C++文本处理基础知识.md │ └── [C++] 初步了解C++对数据封装的设计思维.md └── 编码.md ├── README.jpeg ├── README.md └── Reverse ├── [AGE] Eushully ASProtect 脱壳 ├── [AGE] Eushully ASProtect 脱壳.md ├── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── 附件 │ ├── org │ ├── AGE.EXE │ └── AGERC.DLL │ ├── script │ └── ASProtect unpaker script by VolX 1.15E (support new version) │ │ ├── Aspr2.XX_unpacker_v1.15E.osc │ │ ├── Asprvm8s.bin │ │ ├── ODbgScript.dll │ │ └── README!!!.txt │ └── unpack │ ├── AGE.exe │ └── AGERC.DLL ├── [AGE] Eushully 过注册检查 ├── [AGE] Eushully 过注册检查弹窗.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── [CMVS] 文件读取分析 ├── CMVS 文件读取分析.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [CMVS] 紫社引擎 折腾日记 Purple software ├── [CMVS] 紫社引擎 折腾日记 Purple software.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [HorkEye] 寻找ScriptHook地址 └── [HorkEye] 寻找ScriptHook地址.md ├── [HorkEye] 寻找Script封包密钥 ├── [HorkEye] 寻找Script封包密钥.md └── image │ ├── 1.png │ └── 2.png ├── [HorkEye] 脚本处理 导入 └── [HorkEye] 脚本处理 导入.md ├── [HorkEye] 脚本处理 导出 └── [HorkEye] 脚本处理 导出.md ├── [Malie] 寻找密钥 P1 ├── [Malie] 寻找密钥 P1.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [Malie] 寻找密钥 P2 ├── [Malie] 寻找密钥 P2.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── [Minori] 英文版引擎汉化处理 ├── [Minori]英文版引擎汉化处理.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [PJADV] 字体渲染分析 ├── [PJADV] 字体渲染分析.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 4.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ ├── 49.png │ ├── 5.png │ ├── 50.png │ ├── 51.png │ ├── 52.png │ ├── 53.png │ ├── 54.png │ ├── 55.png │ ├── 56.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [PJADV] 封包结构分析 ├── [PJADV] 封包结构分析.md └── image │ ├── 0.png │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [PJADV] 文件系统分析 ├── [PJADV] 文件系统分析.md └── image │ ├── 0.png │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12-1.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ └── 9.png ├── [QLIE] 封包接口Hook ├── [QLIE] 封包接口Hook.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [QLIE] 文件系统分析 ├── [QLIE] 文件系统分析 [P1准备].md └── img │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [Valkyria] 文件读取分析 ├── [Valkyria] 文件读取分析.md └── img │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [YU-RIS] SDK编译器调用 ├── [YU-RIS] SDK编译器调用.md └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── [YU-RIS] Whirlpool社的一些观察 ├── [YU-RIS] Whirlpool社的一些观察.md └── image │ ├── 1.png │ └── 2.png ├── [YU-RIS] 中文路径无法运行 ├── [YU-RIS] 中文路径无法运行.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── [YU-RIS] 免封包处理 ├── [YU-RIS] 免封包处理.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── [YU-RIS] 寻找脚本密钥 ├── [YU-RIS] 寻找脚本密钥.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── [YU-RIS] 收费组补丁破解之Kiss&Crisis ├── [YU-RIS] 收费组补丁破解之Kiss&Crisis.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ └── 5.png ├── [YU-RIS] 收费组补丁破解之ペトリコール ├── [YU-RIS] 收费组补丁破解之ペトリコール.md └── image │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png └── [YU-RIS] 编码范围 ├── [YU-RIS] 编码范围.md └── image ├── 2939730-20221117234154387-775355256.png ├── 2939730-20221117234250081-1082177769.png └── 2939730-20221117234258811-554349096.png /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # This .gitignore file was automatically created by Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /.vs 6 | -------------------------------------------------------------------------------- /AskMe/README.md: -------------------------------------------------------------------------------- 1 | # # AskMe 2 | 3 | ## 提问 4 | 5 | 任何问题请提交[issues](https://github.com/Dir-A/Dir-A_Essays_MD/issues),但提issue前请先阅读下述内容。 6 | 7 | ### 提问的规则 8 | 9 | - 整理问题 10 | - 先去调查清楚可能导致发生问题的原因以及是否已有解决办法 11 | - 比如:先看看issues里有没有类似的问题及解答 12 | 13 | - 提供信息 14 | - 提供尽可能详细的信息 15 | - 比如:详细操作步骤,相关背景信息,日志,截图 16 | 17 | - 发表意见 18 | - 谈谈自己对问题本身的看法,以及尝试解决的过程 19 | - 比如:我尝试过aaa,得到了bbb结果,可能是ccc导致了问题,但不是很确定 20 | 21 | ### 拒绝回答的情况 22 | 23 | - 提问态度恶劣 24 | - 不想问可以别问 25 | - 自己都不知道自己在问什么 26 | - 自己都不知道自己在干什么,谁知道你要问什么? 27 | - 不阅读本规则,不按规则提问 28 | - 你不读,我也不答 29 | - 明确指出将会把回答的内容用于非法用途 30 | - 请遵纪守法 31 | - 喜欢让人猜你想问什么 32 | - 时间有限,恕不算命 33 | - 比如:在吗?、dat怎么解包?、乱码怎么办?、大佬救命! 34 | -------------------------------------------------------------------------------- /Bookshelf/README.md: -------------------------------------------------------------------------------- 1 | # 提高姿势水平! 2 | 古人云:“读一天,玩一天,开开心心又一天!” 3 | 记录一下自己读过的书,也算是给大家推荐一些好书 4 | 有些笔记没办法公开,需要用到自己的工作账号上 5 | 而有些是纯属没记 :) 6 | 7 | # 书单 8 | 计算机: 9 | | 序号 | 标题 | 作者 | 版本 | 进度 | 备注 | 日期 | 10 | | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | 11 | | 0001 | 汇编语言 | 王爽 | 第三版 | 200% | 适合了解 | 大概初中 | 12 | | 0001 | C++从入门到精通 | 明日科技 | 第五版 | 30% | 一言难尽 | 大概初中 | 13 | | 0001 | Linux就该这么学 | 刘遄 | 第一版 | 10% | 兴趣不大 | 大概初中 | 14 | | 0001 | 隐匿在计算机软硬件背后的语言 | [美] 佩措尔德[Petzold,C.] | 第一版 | 60% | 概念思想 | 大概高一 | 15 | | 0001 | C++ Primer Plus | 普拉达[Stephen Prata] | 第六版 | 50% | 理论严谨 | 大概20年 | 16 | | 0001 | 逆向工程核心原理 | [韩] 李承远 | 第一版 | 50% | 适合入门 | 大概20年 | 17 | | 0001 | 现代 C++ 教程 高速上手 C++ 11/14/17/20 | 欧长坤 | 第二版 | 30% | 实用快捷 | 大概21年 | 18 | | 0001 | 加密与解密 | 段钢 | 第四版 | 70% | 专业理论 | 大概21年 | 19 | | 0001 | Windows 程序设计 | CharlesPetzold | 第五版 | 20% | 有点老了 | 大概22年 | 20 | | 0001 | Windows核心编程 | Jeffrey Richter / Christophe Nasarre | 第五版 | 20% | 有点老了 | 大概22年 | 21 | | 0001 | 逐梦旅程:Windows游戏编程之从零开始 | 毛星云 | 第一版 | 10% | 适合入门 | 22年8月 | 22 | | 0001 | C++反汇编与逆向分析技术揭秘 | 钱林松 / 张延清 | 第二版 | 75% | 系统全面 | 22年10月 | 23 | | 0001 | 逆向工程权威指南 | Dennis Yurichev | 第一版 | 10% | 适合入门 | 23年2月 | 24 | | 0001 | Windows API 程序设计 编程基础篇 | 王端明 | 第一版 | 50% | 为数不多 | 23年2月 | 25 | | 0001 | Low-Level Programming | Igor Zhirkov | 第一版 | 2% | 由浅入深 | 23年2月 | 26 | | 0001 | 揭秘数据解密的关键技术 | 刘颖东 | 第一版 | 100% | 由浅入深 | 23年3月 | 27 | | 0001 | Python编程: 从入门到实践 | [美\] 埃里克 • 马瑟斯[Eric Matthe] | 第三版 | 70% | 非常简单 | 23年9月 | 28 | | 0001 | Lua解释器构建:从虚拟机到编译器 | 吴伊杰 | 第一版 | 60% | 还凑合吧 | 23年10月 | 29 | | 0001 | Lua程序设计 | 罗伯拖·鲁萨利姆斯奇[Roberto Ierusalimschy] | 第四版 | 50% | 看睡着了 | 23年10月 | 30 | | 0001 | C++并发编程实战 | 安东尼·威廉姆斯[Anthony Williams] | 第二版 | 40% | 快看吐了 | 23年11月 | 31 | | 0001 | The Rust Programming Language | | | 2% | R们! | 23年11月 | 32 | 33 | 34 | 文化: 35 | | 序号 | 标题 | 作者 | 进度 | 版本 | 备注 | 日期 | 36 | | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | 37 | | 0001 | 潦草 | 贾行家 | 20% | 第一版 | 中途丢了 | 大概18年 | 38 | | 0001 | 创业在路上 | 罗永浩 | 80% | 第一版 | 李姐万岁 | 大概18年 | 39 | | 0001 | 你远比想象中强大 | [挪威] 埃里克·贝特朗·拉森 | 50% | 第一版 | 打鸡血啊 | 大概18年 | 40 | 41 | 图书 : 42 | | 序号 | 标题 | 作者 | 进度 | 版本 | 备注 | 日期 | 43 | | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | 44 | | 0001 | 拆物专家 | [加] 托德•麦克莱伦 | 100% | 第一版 | 只看图片 | 大概18年 | 45 | | 0001 | 世界最美森林之旅 | X-Knowledge Co.,Ltd. | 100% | 第一版 | 只看图片 | 大概18年 | 46 | | 0001 | 喵呜,来摸 | [美] 克莱尔.贝尔顿 | 100% | 第一版 | 可爱可爱 | 大概18年 | 47 | | 0001 | 喜欢我也没关系 | 王XX | 100% | 第一版 | 可爱可爱 | 大概18年 | 48 | | 0001 | 总觉得有哪里不错 | 王XX | 100% | 第一版 | 可爱可爱 | 大概18年 | 49 | | 0001 | 我要把我的帽子找回来 | 乔恩•克拉森[Jon Klassen] | 100% | 第一版 | 发现头像 | 大概18年 | 50 | | 0001 | 这不是我的帽子 | 乔恩•克拉森[Jon Klassen] | 100% | 第一版 | 是续作吧 | 大概18年 | 51 | | 0001 | 山姆和大卫去挖洞 | 乔恩•克拉森[Jon Klassen] | 100% | 第一版 | 哲理故事 | 大概18年 | 52 | 53 | 想看: 54 | | 序号 | 标题 | 作者 | 版本 | 进度 | 备注 | 日期 | 55 | | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | :-----: | 56 | | 0001 | Visual C++ 2013 入门经典 | [美] 霍尔顿[Horton,I.] | 第七版 | ?? | 随便翻翻 | ?? | 57 | | 0001 | Visual C++ 开发实战1200例 第1卷 | 刘锐宁 | 第一版 | ?? | 想看没空 | ?? | 58 | | 0001 | Windows NT(2000) Native API Reference | ?? | 第一版 | ?? | 当字典用 | ?? | 59 | | 0001 | 具体数学 计算机科学基础 | Donald E. Knuth | 第二版 | ?? | 补充基础 | ?? | 60 | | 0001 | 计算机程序设计艺术 | Donald E. Knuth | 第三版 | ?? | 理论方法 | ?? | 61 | | 0001 | 恶意代码分析实战 | Michael Sikorski / Andrew Honig | 第一版 | ?? | 看了序章 | ?? | 62 | | 0001 | Lua设计与实现 | codedump | 第一版 | ?? | 想看没空 | ?? | 63 | | 0001 | 自己动手实现Lua 虚拟机编译器和标准库 | 张秀宏 | 第一版 | ?? | 想看没空 | ?? | 64 | | 0001 | 虚拟机的设计与实现:C\C++ | 布朗登 | 第一版 | ?? | 想看没空 | ?? | 65 | | 0001 | 虚拟机设计与实现 以JVM为例 | 李晓峰 | 第一版 | ?? | 想看没空 | ?? | 66 | | 0001 | 数字图像处理技术与应用Visual C++实现 | 陈丽芳 | 第一版 | ?? | 想看没空 | ?? | 67 | | 0001 | 数据压缩入门 | 柯尔特·麦克安利斯 | 第一版 | ?? | 想看没空 | ?? | 68 | -------------------------------------------------------------------------------- /Methodology/[方法论] 基于虚拟机字节码的文本修改思路.md: -------------------------------------------------------------------------------- 1 | # 基于虚拟机字节码的文本修改思路 2 | 3 | ## 前言 4 | 5 | 大部分的Gal引擎为了提高运行效率或加密或防止修改等目的都会使用私有的VM,也就是会把明文脚本编译成字节码的脚本,由于是私有的VM所以没有现成的工具来解析,所以为了修改文本,我们不得不分析其VM,而分析VM依据OP数量和结构,工作量会有不同程度的增加,但总的来说分析VM的工作量都比较大,由于我们是为了修改文本数据,所以从文本修改替换的角度来考虑一下这个问题。 6 | 7 | ## 结构 8 | 9 | 依据个人的分析经验,可以总结一下Gal引擎VM架构实现存储文本数据的结构,大概来说可以划分成这两种 10 | 11 | - 指令与数据分离 12 | 13 | 那么什么是指令与数据分离?其实就是VM要使用到字符串数据的时候,是用一个偏移来指向字符串数据的,即大多数此类实现的VM的脚本文件会有个区域(通常在脚本文件末尾)来存放字符串,也就是游戏的文本统一存放在一个区域,我们可以称之为字符串区段。一句话总结就是,代码区段使用指向字符串区段的偏移来读取字符串数据 14 | 15 | 其抽象结构类似如下: 16 | 17 | ```asm 18 | .code 19 | [instr][instr][instr][instr][instr][instr] 20 | 21 | .str 22 | [text][text][text] 23 | ``` 24 | 25 | 从这里就不难发现,如果指令与数据分离了,那么我们就可以很轻松的改变文本长度,因为指令中存储了一个偏移来指向文本,那么我们只需要找到相关指令并修改这个偏移,就可以把文本数据附加到脚本文件的末尾,这样的好处是不会破坏原来的字符串区段,这就使得没有修改的偏移依然指向有效数据,同时新增的字符串也可以随意改变长度 26 | 27 | - 指令与数据混合 28 | 29 | 那么什么是指令与数据混合?这就不言而喻了,就是字符串数据紧接在指令后面 30 | 31 | ```asm 32 | .code 33 | [instr][text][instr][text][instr][instr][text][instr][instr] 34 | ``` 35 | 36 | 那么也不难发现,如果指令与数据混合了,修改起来会很麻烦,首先就是不能够随便变化文本的长度,缩短文本长度的话,倒是可以,如果增长会造成其后的指令相对脚本文件开头的偏移改变,这时候如果内部有相对或绝对的跳转都又可能会出现问题,然而事实是依据以往的分析经验大多数游戏都会有相对或绝对的跳转,或者脚本文件的结构上还会设计label来标识某个代码块,方便进行跳转,所以基本不能直接增长文本。 37 | 38 | 那么直接解析呢?首先如果要直接解析的话,最基本的都得知道op\instr的长度,如果op\instr是定长的,那么倒是简单了一些,但仍然需要知道哪些op是跳转的op,并要分析出其结构,才能够正确的替换文本,如果op\instr是变长的,也就是op\instr的值本身没存储长度信息,也没办法直接从op\instr解析出长度信息,或没有这种结构,每一个op都有不确定的参数个数,也就是有不同的长度,说白了就是每一个op都有自己的结构,这样就没办法确定下一个op在何处开始了,所以就要分析每一个op,至少是要分析出每一个op的长度,才能解析脚本文件,如果要正确替换文本的话,还是得找到跳转相关的指令,这就要解析每一个op的功能了,或者至少也得用取巧的方法分析出跳转相关的指令,反正两种方法都得花费不少的时间来修正跳转的问题,没几个op还好说,要是遇到op有上百个的情况,这种的话工作量会巨大。 39 | 40 | 41 | 42 | > 当然也不一定是这样的结构,有种是以块来存储数据的,它二进制脚本里的数据,其实并不是真正的VM字节码,而是一种类似序列化后的数据,在加载脚本的时候,再反序列化成内部的对象来执行代码。 43 | 44 | 45 | 46 | ## 讨论 47 | 48 | 那么有没有方法可以避免指令与数据混合这种结构带来的工作量巨大的分析呢? 49 | 50 | 答案是肯定的,在此我们从直观的思路出发,递进简略讨论这个问题,以不同的实现难度给出三种方法,并主观讨论其实现的效果和优劣以及改进的方案。(以下讨论的方法其实也适用指令与数据分离的结构,只不过这种结构很少需要走到这一步) 51 | 52 | - 利用字符串搜索定位文本读取的位置实现动态替换 53 | 54 | 动态替换也是有部分汉化补丁使用的,有点类似VNR的内嵌功能的味道,或者说找H-Code的意思,好像是这个说法来着。 55 | 56 | 如果说我们基本没去逆VM,或者说不具备这样的能力的话,那么其实可以用搜索的功能,搜索当前游戏显示的字符串,找存储字符串的buffer,或者找读取字符串的位置,有点类似于那种拿CE搜所谓"基址"的操作,找到后写个替换就结束了,不过可能由于信息不足,你只能选择遍历相同的字符串来替换。这种我个人是不推荐的,首先,如果你没找到足够的信息来定位唯一的字符串,就只能选择遍历匹配原文字符串的方法,这就会带来性能上的问题。其次由于是随便找,碰运气到位置,运气不佳,没搞清楚这地方的作用,可能会出现问题,导致整个实现稳定性堪忧,因为这种实现出问题的其实我也见过好几个(。 57 | 58 | 59 | 60 | - Hook VM 61 | 62 | 这个的话有点接近我们的最终答案,在我们对VM有一点了解之后,我们可以Hook VM的dispatch或具体OP的处理函数或位置,来实时获取VM的状态数据(哪个是PC哪个是Code指针哪个是需要的指令),从而达到更加精准的字符串替换。或说通俗一点我们可以Hook VM中处理文本渲染,压入文本数据的OP,同时配合VM的状态数据来达到精准的替换。 63 | 64 | 这个是我比较认可的方法,这种实现的效果肯定是更好的(相比胡乱搜内存找一个位置,或者从系统API来替换文本而言),首先就可以消除搜索字符串的操作,因为如果你要搜索字符串第一个是性能问题,第二个可能会有不同位置但原文字符串相同,但译文不一样的情况,第三是可能还涉及到字符串过滤的问题,因为有些字符串并不是文本的字符串,可能是一些文件名之类的。 65 | 66 | 当然再稍微深入一点,还有种方法是可以构造我们自己的OP,来实现出一个类似 指令与数据分离 的结构。 67 | 68 | 总而言之,如果你对VM结构有一点了解,就可以达到这种比较精准和高效的替换了。不过这显然还是需要写Hook代码,不同游戏还要找位置,搜特征,也涉及到代码注入等问题,通用性比较差,但是对于有一点了解的人来说,这种方法确实是方便(从逆向分析的工作量上来看)又高效(从文本替换的角度上看)。 69 | 70 | 71 | 72 | - 利用VM指令构造VM下的Inline Hook 73 | 74 | 这个是我认知里能提供的一个比较好的方案,前提是要大概分析一遍VM,也就是说你要对VM有一定程度的了解。 75 | 76 | 从上面的Hook VM的思想上再深入一点,Hook VM其实就是Hook Native代码,也就是本机代码,更具体一点,其实就是修改x86汇编,从另一个角度来看,VM也可以看作一种类似x86 cpu的东西,而里面跑的字节码其实就可以比作是x86汇编代码,那么从这个角度上来说,能不能构造一个在VM下的Hook,也就是利用VM的字节码写一个Hook,而不修改任何x86汇编代码? 77 | 78 | 显然是可以的,这个的关键就是找到VM的Jmp指令,就和x86下写一个 Inline Hook 一样通过Jmp指令跳转到目标代码块,执行完毕后跳转回去,当然x86下很方便,因为指令都是已知的,也有方便的调试工具和各种库来实现这种功能,而Gal引擎的VM显然大多数都是闭源,特别是Gal引擎基本都是会采用自己写的VM,所以基本是不可能直接找到工具来编辑脚本中的指令的,也找不到指令功能的说明文档,除非有人逆了,所以这就要求对VM要有一定的了解,目的其实就是找到那个Jmp指令。 79 | 80 | 当然Jmp指令可不是随便一个都行,首先这个指令要能够修改VM的PC,不然怎么Jmp?其次这个指令不能造成副作用,或者说副作用可以被抵消,因为不像x86汇编我们可以使用pushad之类的指令来保存环境,一个私有的VM连有什么指令都不清楚,哪来的保存环境?如果真有的话也需要分析找到这种指令,所以找到这样的指令是前提,当然一般来说VM都有这种指令,因为Gal脚本通常都会有GOTO之类的写法来跳转和切换不同的场景,选择分支之等。 81 | 82 | 不过类似的指令其实会有很多,比如Call指令其实也需要修改PC,也有一种类似Jmp的效果,特别是Gal引擎还会有一种脚本文件之间的Call指令,当然还有什么Label_Call之类的,各种各样的,你看着像是修改了PC,但有很多副作用,或者说没办法方便传递跳转偏移等一系列问题。 83 | 84 | 所以关键是能不能够找到一个副作用可以抵消或者没有副作用的单纯的跳转指令,就像是x86下的Jmp指令一样,如果你找到的是类似x86下的Call指令,又没找到Ret指令,显然会出问题,所以这又要求要准确把握指令的含义及其操作了VM中的什么数据。 85 | 86 | 找到这样的指令后,就可以在文本数据之前或者文本数据的位置,写上这个指令,跳转到脚本文件末尾,然后在末尾写上Push Str的OP指令和数据,然后再跳转回之前指令的结尾,这就有点类似于在x86下Inline Hook的意思了,只不过这是利用VM自身的指令来实现的。 87 | 88 | 所以,通过这种方法就可以避免Hook动态替换文本,或者工作量巨大的VM指令完全解析和分析外加写编译反编译工具,而且这种方法就和完全反编译和重新编译脚本一样,可以通用同一个引擎不同的游戏而无需写Hook,DLL注入之类的。 89 | 90 | 关于这个思路具体实现,可以查看以下项目 91 | 92 | - [Valkyria_Tools](https://github.com/Dir-A/Valkyria_Tools) 93 | 94 | - [Seraph_Tools](https://github.com/Dir-A/Seraph_Tools)(已经分析好了,现在还没写出来,实在没时间) 95 | 96 | 这两个引擎都是指令和数据混合的架构,实现替换文本的思路相同,都是借助VM的类Jmp指令,从Push Str的位置跳出来,在脚本末尾写上Push Str,然后再跳回原来指令的结束位置,以此来替换文本,从而避免去完整解析脚本和使用Hook的方法动态替换。 97 | 98 | 99 | 100 | ## 感悟 101 | 102 | 写完这篇文章记录一下自己的感悟吧,2024年2月26日03点41分。 103 | 104 | 这些思路也是一步步从实际出发自然而然地往下思考的,说实话,看着很简单,其实一开始还真想不到,或者一开始也没能力做这个,有时候没思路了,就把电脑关了,其实关了还是心心念念,或者说在那死磕,搞了半天也没看出什么名堂。 105 | 106 | 写这文章也是,一口气写了好几个小时,其实后面思路就有点混乱了,或者说已经开始有点表达不出想要的意思了,但还是刻意去改来改去,所以花了更多时间,但又时不时会做出这种行为。 107 | 108 | 其实有些时候并不需要刻意去想脑子里就会自然浮现出一些想法,然后再考虑这些到底合不合理,有没有可行性,反正就有种自然而然的感觉,特别是一个人安静的时候,脑子里就会在琢磨一些事情,这种时候比较放松,思路就会更清晰一点,确实很神奇,只不过相比问别人答案,过程确实比较长,当然也得有人问才是( 109 | 110 | 所以其实相比问别人我还是喜欢自己考虑问题,有些时候虽然有的东西理解起来很简单,其实仔细想想可能并没完全理解到精髓上,只是把别人说的话记在脑子里而已,没准过几天就忘了。 111 | 112 | 逆引擎的VM其实是我一直比较感兴趣的,但奈何网上资料,不能说少吧,那基本是没有,当然像是那种打CTF的玩具VM那规模和复杂度基本没啥参考价值,Github有一些开源编译反编译工具,但也看不到他们分析的内部结构和过程,只有分析后写的工具,说实话这样的参考价值就低了很多。 113 | 114 | 咱也没什么人脉,还是只能靠自己慢慢磨了,说实话分析VM真的是非常烦人,不过像是现在这种VM遍地走的时代,没办法,还是得硬着头皮上啊,不然很多编译的脚本文本替换不了也白搭,当然我也不是什么汉化组的没这个急切的需求,主要还是想锻炼一下自己分析的能力,加强对基础的认识。 115 | 116 | 反正就是悟了亿段时间有点体会了,如果是汉化的话,主要也是这个目的,为什么不写具体例子呢?,其实我认为思路还是比较重要的,有思路才有方向嘛,好嘛,主要是我菜,而且完全解析VM工作量也很大,要写成文章就更费时间了,以后可能会写吧。 117 | -------------------------------------------------------------------------------- /Methodology/[方法论] VFS的实现思路.md: -------------------------------------------------------------------------------- 1 | # [方法论] VFS的实现思路 2 | 3 | VFS (Virtual File System) (虚拟文件系统) 4 | 这里讨论的VFS,是区别于系统中的VFS,更多的是指代自己实现的小型简易的文件系统。 5 | 像是常见的游戏封包,也可以作为一种VFS的数据结构部分。 6 | 全部情况都基于Windows平台进行讨论。 7 | 8 | ## VFS 的架构概念 9 | 10 | ### 接口部分 11 | 12 | 需要把VFS应用在何处,就决定了接口的设计。 13 | 14 | 接口的本质问题,就是获取需要替换或读取的文件信息,并把处理好后的信息正确返回,同时响应读写操作。 15 | 16 | 比如需要用在任意程序上,那么接口部分应该针对系统API进行设计 17 | 如果单纯是用在某个游戏的引擎上,那么接口部分应该根据这个引擎的文件读取接口来设计 18 | 又或者,只想用在自己正常的项目内部,那么就可以舍弃掉一些针对系统API的设计 19 | 20 | 当然你也可以先定义公共的接口,在此基础上,为不同使用场景具体优化。 21 | 22 | ### 访问部分 23 | 24 | 这部分我们已经获得需要操作的文件信息,比如要打开某个文件,要读取某个文件,要移动文件指针。 25 | 26 | 这部分的目标就是正确的访问VFS自己维护的封包中的数据,和响应接口部分需要的操作。 27 | 28 | 首先就是应该正确的进行查找以确定该文件VFS中确实有,或者传入一个标识,要能确定该标识确实是VFS产生的并且在内部维护的,而不是系统的。为了保证标识的唯一性,应该采取何种方法。 29 | 30 | 比如对路径的处理,对文件名的处理,对文件指针的处理,对文件句柄的处理 31 | 32 | 像是路径有反斜杠,斜杠,相对路径,绝对路径的问题。文件名有大小写,匹配速度等问题,文件指针和句柄有是否与正常的文件读写冲突的问题,和文件关闭的时候处理。 33 | 34 | 接着就是读取的问题,这里我们就不讨论写入问题了,一般这种VFS没这样的需求。 35 | 36 | 这的复杂度,主要和你想实现的功能有关,比如有加密,我们应该在写入目标buffer之前正确的解密,压缩文件也是类似的要正确的解压,当然也需要考虑性能问题,还有小文件的优化,缓冲区之类的问题。 37 | 38 | ### 结构部分 39 | 40 | 结构这块实际上就和游戏的封包差不多了,当然这个结构也包括运行时的结构和VFS整个文件数据在硬盘上的结构,怎样去设计一个灵活又高效的结构,也是一个比较难的问题。 41 | 42 | 对于硬盘上的结构: 43 | 44 | 像是采用传统的文件头+索引头+数据段,这种如果要追加数据是不怎么方便的。 45 | 46 | 或者可以考虑把文件头和索引头放在末尾,即 数据段 + 索引头 + 文件头,这样追加文件只需要修改索引头和文件头即可,不需要整个文件都重写。 47 | 48 | 也有采用块结构的,类似PNG图片那种。 49 | 50 | 还有内部路径的问题,是保存每个文件的完整路径,还是分文件夹? 51 | 52 | 文件名的问题,是Hash,是定长,还是变长? 53 | 54 | 对于运行时的结构: 55 | 56 | 这部分主要是关乎到整个文件系统的运行效率和使用的方便与否。 57 | 58 | ## VFS 目的和作用 59 | 60 | 很多的汉化补丁用到VFS,有些是自己编写的针对具体引擎的,有些则是一些商业软件通用的VFS,正如其名一样,VFS的目的是构建一个自己的文件系统来让游戏或程序读取文件。 61 | 62 | 一个经典的例子是,我们希望一个补丁,可以叠加在原版的游戏上,而不是影响原版游戏的正常运行,也就是希望汉化和日文版都可以正常运行,这时候可能有些文件需要替换,但是文件名重复了,大可以修改程序里的文件名,但是有了VFS,我们可以把文件封装到VFS的封包中,实现相同文件名的替换,从而实现补丁的共存。 63 | 64 | 当然如果数据封装到VFS自己的封包中,也就可以实现一些加密,压缩等功能。 65 | 66 | 还有个例子就是,很多游戏引擎都支持免封包功能,但是免封包带来的问题就是文件可能会非常多,或者有些同名的文件会替换掉原始的文件,如果采用VFS,就可以把全部零散的文件,打包到一起,从而避免了文件散落一地,频繁调用IO接口,影响性能,文件名重复等问题。 67 | 68 | 当然,如果你并不在乎文件数量和加密的问题,大可以把路径重定向,依然可以解决问题。 69 | 70 | VFS的目的更多的是为了加密和打包而存在。 71 | 72 | 那么顺着这个话题继续往下。 73 | 74 | 游戏读取封包中的数据算不算一种VFS呢? 75 | 76 | ## VFS 接口核心思路 77 | 78 | 在Windows下,打开文件是调用CreateFile这个系统API,即使是std::fstream,fopen,也只是对CreateFile的封装,这里揭露了一个事实,`即很多标准库的函数,其实都是对系统API的封装`。因为有一些操作,并不是单纯从算法上实现,而是需要依赖系统所提供的功能,比如硬件通信。 79 | 80 | 那么这里我们就需要回顾一下,文件的操作。 81 | 由于库函数对文件的操作也绕不开系统API,这里就不讨论,其实是大同小异的。 82 | 83 | 读取一个文件首先需要打开文件,就是调用CreateFile,向文件写入数据也一样,CreateFile的返回值如果成功,则是一个句柄,该句柄只是个标识,用于唯一标识这个文件,并用于其它文件操作函数的参数。在C语言下和文件指针类似,但是CreateFile返回的是一个内核对象的标识,句柄并不具备实际意义,只是个编号而已。如果这个时候我想读取文件,那么我应该给ReadFile指明是读取哪个文件,这个指明哪一个文件就是用句柄,WriteFile,GetFileSize,SetFilePointer,都需要文件句柄,这很好理解,不然你怎么知道你要操作的是哪个文件。从这我们就不难看出,操作文件的核心,就是在CrateFile之后返回的那个句柄。 84 | 85 | 所以核心的思路就是抓住句柄,处理好句柄,确保非VFS的句柄正确被传递给系统,确保VFS内部维护的句柄被正确处理,正确释放。 86 | 87 | ## VFS 接口实现方向 88 | 89 | 自己开发这样一个简单的VFS是可行的 90 | 91 | 我们实现VFS的目的本质上就是去管理文件,更一般的,其实只是替换文件而已。 92 | 93 | ### Hook 系统API 94 | 95 | 我们只需要在游戏打开文件的过程中,对需要的替换的文件进行筛选过滤,并接管其对该文件的操作,由于正常的程序,操作文件都会经过系统的API,所以我们只需要Hook系统的API就可以达到控制游戏的文件读写操作。 96 | 97 | 如果要通用性的话,无非就是Hook相关的API,像是CreateFile,WriteFile, ReadFile,CloseHandle,GetFileSize,GetFileAttributes,等,这些都是库函数最终要经过的API,换句话说,库函数也只是不过是对这些API的封装,再说的明白点,一般情况下Windows下操作文件都和这些API相关,不管你是何种程序。那么如果还需要再深入一些的话,事实上我们应该Hook的是从用户层到内核层的那个函数,像是NtCreateFile,说简单一点,其实CreateFile也只不过是对别的函数的封装,只不过在用户层上,我们最多就到NtCreateFile了,因为这个函数马上就调用了系统call进入了内核。一般程序是没有内核的范围权限的,正常开发也不需要直接操作内核。其它文件操作函数也是类似的,你只要Hook到进入内核层之前的部分,就可以把所有在用户层封装这个函数的地方都截获,当然,是否要这样处理,取决于你的VFS要做到何种功能。 98 | 99 | ### Hook 程序内部接口 100 | 101 | 如果不想Hook系统的API,也可以选择Hook游戏内部读取文件的相关接口,因为游戏引擎一般不会每次打开文件都去CreateFile,fopen,fstream,而是内部封包好一个公共的接口来使用,那么这个接口和CreateFile这些又有什么差异呢?也只不过是多了些自己的功能和处理罢了。 102 | 103 | ### 正常接入项目 104 | 105 | 还有种情况是你想用在自己已有的项目上,那么依据你自己的程序逻辑正常接入就好了。 106 | 107 | ## VFS 数据结构 108 | 109 | 没啥好写的,各有差异,具体可以参考那些游戏的封包结构,各种各样的都有。 110 | 111 | 内部结构,看你自己怎么处理,方法各异。 112 | 113 | ## VFS 运行流程 114 | 115 | 举个例子,CreateFile的目的是打开一个文件,就像是fopen一样,获得一个对该文件对象的标识(CreateFile里叫文件句柄,fopen则是文件指针),后需要操作这个文件都需要这个标识,如果CreateFile一个不存在的问,自然是没办法返回这个标识的,但是我们可以Hook,CreateFile,发现它打开的文件虽然真正意义上的磁盘上并不存在该文件,但是我们可以假装返回一个我们自己内部维护的标识,让它以为成功了,然后ReadFile的时候它会把这个标识传进来,因为需要指定读取的是那一个已经打开的文件内容,Hook ReadFile,这时候我就可以捕获这个我们自己维护的标识,从而,不让ReadFile去操作系统里找这个根本就不实际存在的标识,然后我们可以自己在内部打开我们的自己的封包,或者别的数据结构之类的,找到这个具体的文件文件,并把数据读取到ReadFile传进来的Buffer里面。对于游戏程序而言,这就是一次正常的调用系统API,根本不会察觉到有什么不同。当然,如果不是为了通用性,其实并不用Hook CreateFile这些API,因为这个程序所有的打开文件操作都要经过这些API,我们没必要从那没多次调用里一个个字符串去对比,更一般的,我们会直接Hook游戏内部打开文件的相关函数,操作相关内存分配函数,和结构来达到替换文件的目的。 116 | 117 | ## VFS 现成软件 118 | 119 | 那么有没有通用的VFS呢?显然是有的,比如:MoleBox,Enigma Virtual Box,Enigma,VMP内置的文件系统,Themida的XBundler。其中前三种比较流行,最流行的是Enigma Virtual Box,我们简称为EVB,其实EVB是Enigma这个加壳软件的一个子程序,独立出来的免费版。Enigma和VMP,Themida都是加壳软件,VFS只不过其自带的一个功能而已。只有 MoleBox和 EVB 才是独立的VFS软件。这些软件的作用就是修改EXE,并Hook系统API,从而达到文件操作重新定向到其自己内部的一个VFS上,说白了,就是他们自己会实现一个封包,里面也有文件名大小等信息,打开文件的时候就在封包里找有没对应的文件,有的话就替换,没有的话就让调用正常跑到系统里去。 120 | 121 | 这里的话,可以说个点,Enigma加载VFS的地方特别的早,导致很多Enigma的加壳验证软件,还在验证阶段就可以通过调用CreateFile来读取VFS的内部文件了,这也就导致了很多加壳软件的内部数据还没过验证就被提取走了,一些采用Enigma来验证的收费汉化组,就存在这类的问题,被大量破解,当然如果一个程序在某个机器上跑起来了,那么VFS其实是可以被随意提取的,因为VFS的本质就是给程序来读写文件的,只不过是有没特殊校验之类的问题。 122 | 123 | ## VFS 文件提取 124 | 125 | 了解完了上述的知识点,我们就可以知道,当VFS挂到EXE上的时候,我们其实并不需要在意它,当我们成功打开文件,该怎么操作,就怎么操作。 126 | 127 | 而我们读取它的方式也是如此简单,只需要知道文件名就行了,就像是这个文件存在磁盘上一样操作。 128 | 129 | ### 获取文件名 130 | 131 | 所以说要提取一个VFS里的文件,只需要一个文件就行了,我们如何获取这个文件名呢? 132 | 133 | 其实有三种方法, 134 | 135 | 第一种是调用系统的API进去文件名的遍历,如果这个虚拟文件系统有Hook相关的API,我们就可以从中获得文件名,在遍历文件的时候,最好先把原目录下的文件尽量移除,这样我们才能断定出哪些文件是在VFS里的。还有种VFS会有特殊的保护,即大多数软件并没有遍历文件的需求,或者说,即使遍历了,也不影响虚拟文件系统,也就是说,你从文件遍历的API上没办法获得VFS里的文件名。但是你直接用对应的文件打开又可以正常被虚拟文件系统拦截到,这里我猜测是有两种实现,第一种可能是其内部存储文件名用了hash的方式,即你输入正确的文件名,然后计算hash然后与内部的hash进行对比,这样就避免了存储文件名,还有种可能就是单纯没Hook遍历文件的API罢了。当然这个是Hook系统API的情况,如果是Hook游戏引擎内部读取文件的接口,也是一样的道理,也可以有这几种实现方法。 136 | 137 | 第二种是可以Hook VFS的接口,记录所有的文件名,这样可以在后续移除目录下的文件,并调用接口传入文件名来判断那些文件是在VFS中的。 138 | 139 | 第三种,也是比较难的一种,这些需要解析VFS的内部实现,来获取文件名,一般可以在接口处跟踪对传入文件名的处理,比较简单的会调用strcmp这类的字符串对比函数进行查找内部释放有该文件,当然这种效率就很差了,不过好处是逆向方便,还有的会计算hash,内部只保存hash,又或者计算hash但是内部也有真实文件名,这块就需要具体问题具体分析了。 140 | 141 | 不过总的来说,通过Hook 接口,并记录文件名的方法一定程度上都可以获取到VFS内部的文件名情况,虽然可能并不能全部提取完整。 142 | 143 | ### 提取文件 144 | 145 | 得到文件名后就可以开始提取文件了,因为VFS本来就是为程序读取文件服务的,我们当然可以假装自己是程序本身,来调用VFS的接口,传入文件的信息来读取文件。 146 | 147 | 最简单的肯定是Hook 系统API的这类VFS,因为这类VFS的操作肯定是按照系统API的操作来设计的,我们只需要正常在程序里调用相关的API就可以提取成功,当然如果有些Hook的位置比较偏门,就需要自己找到相关的地址来操作,像是有些会Hook到Call API的地方,而不是API函数的函数头上,比如fopen内部会调用CreateFile,那么其实只需要Hook fopen调用CreateFile的那个Call就好了,并不需要Hook CreateFile的函数主体。 148 | 149 | 如果是Hook在了内部读取文件的接口上,又或者这个VFS就是游戏封包程序本身,那么这个时候就需要一定的能力来找到对应的接口了,还有接口的参数也一般不会是那些正常文件操作函数的样子,需要仔细去分析出来,可能涉及到内部的数据结构,像是会有个封包对象这样的。当然有些虽然是内部但是就和前面提到的fopen那个一样,只是在调用系统API的前面一点而已,本质上还是Hook 系统的API。 150 | 151 | 总结还是那句话,游戏怎么读,你就怎么读。 152 | -------------------------------------------------------------------------------- /Methodology/[方法论] 免封包略谈.md: -------------------------------------------------------------------------------- 1 | # [方法论] 免封包略谈 2 | 3 | ## 关于免封包 4 | 5 | 现在的Gal引擎解包工具是比较全的,基本上很多引擎你或多或少都能找到解包的工具、源码。虽然有些并非全自动,甚至需要找密钥,但是总的来说99%的Gal引擎基解包本是不成问题的。 6 | 7 | 那么对于汉化或者别的操作来说,封包,或是说让游戏读取我们修改过的文件,就成为了一个比较麻烦的事情。 8 | 9 | ### 封包程序 10 | 11 | 这是很自然的,有解包程序,我们就会想到封包程序,加上现在大部分解包程序的代码都是开源的,像是Crass,Garbro,都是很不错的项目。他们都提供了解包程序的源码,我个人是比较喜欢Crass的,它对封包的描述更加结构化,具体,方便我们编写封包程序。 12 | 13 | 不过这两个都很少提供封包程序,有次我在Garbro的issues里看到作者说是怕你去汉化游戏,所以不提供,具体怎么说我也忘记了,大家自行回去看吧。 14 | 15 | 当然也有一种情况你可能没办法写回封包的,或者比较困难。 16 | 17 | ### Hook Buffer 18 | 19 | 这个也是比较常见的,一般来说游戏读取封包索引后会找到具体需要读取的资源文件的偏移,并把目标资源文件读入事先申请好的buffer里,然后会进行解压或者解密之类的操作。 20 | 21 | 这个时候可以对读取到buffer中的数据进行hook替换,不过这个方法比较麻烦的地方是,buffer的大小不一定是我们需要的,要是小于我们要替换的目录文件,我们就需要重新申请空间,这个时候就涉及到游戏内存的管理方式,如果是用库函数的new malloc这类的,可能需要去找到游戏内部这两个函数的地址,去hook和调用他们。原因是不同的编译器对标准库的实现是有差异的,相同的编译器也是有版本上的差异的,我们不能直接在我们的Hook DLL里直接写new 或 malloc,这样等游戏去调用释放内存的操作极大可能报错。要是系统API比如HeapAlloc, LoaclAlloc, GlobalAlloc那倒是轻松很多。 22 | 23 | ### 自带免封包 24 | 25 | 相信大家或多或少都听过或见过,一些引擎可以免封包读取目录下的文件。 26 | 27 | 有那种只需要把文件放到目录下就会直接读取的,有那种需要把原始封包删除才会读取的,也有需要修改相关配置文件才能生效的。 28 | 29 | 像是经典的BGI, Artemis,就属于目录下的文件优先级大于封包,直接读取。 30 | NekoPack这个引擎则是需要删除封包才那读取目录下的文件,也就是封包优先级大于目录下的文件。 31 | Yu-Ris的新版本和NeXAS则需要修改相关配置文件或exe。 32 | 33 | 还有一种是属于要屏蔽封包名才会去读取目录下的文件的。其实和上面说的第二种有点类似,不过具体实现肯定是每个引擎有差异。 34 | 35 | 像是AdvHD引擎它读取封包内容的函数,其中一个参数是封包名的字符串,一旦这个字符串为空或长度为0,引擎就进入从目录下搜索文件的分支,也就是免封包读取,像是SystemC这个引擎也有这样的特性。 36 | 37 | 之前还讲过CMVS,那个引擎则是判断脚本里写的路径的末尾有没有斜杠,来切换不同的读取模式的分支。 38 | 39 | 总之花式各异,不便于分类,但是从这也能看出,大部分引擎都是自带免封包读取的,或者说你可以认为是一种引擎的纠错机制。 40 | 41 | 以下列出我所接触和处理过的支持少量修改或直接支持免封包处理功能的引擎。 42 | (一些本来就不封包的引擎就不列出了) 43 | 44 | Krkr2 、krkrZ、Yu-Ris、NekoPack、QLIE、Artemis、SystemC、CMVS、AdvHD、ACV1、BGI、CatSystem2、SoftPal、NeXAS、Entis GLS、Maile、PIX STUDIO & DxLib、PJADV、Silky 45 | 46 | 当然应该还有许多,由于我个人时间和水平能力有限,目前只能止步于此。 47 | 48 | ### 其它 49 | 50 | 当然了,封包有各种各样的,Hook方法也有千奇百怪的,免封包也有各种情况,这里只是给大家简单聊聊。 51 | 52 | ## 免封包特征 53 | 54 | 这个问题其实不是很好回答,我的建议是你可以先试试能否直接免封包,如果不行的话就可以开始跟踪封包读取了。大部分时候你在逆封包结构的地方,一般都能看到游戏如果读取不到封包文件的时候会进行怎样的处理,这个时候就极有可能走进免封包的分支,当然前提是有这个分支,有些虽然有,但是可能会直接报错,需要在之前有一些小操作。 55 | 56 | 说完了那些模模糊糊的,来说点具体的吧! 57 | 58 | 大家在逆向的时候一定要站在正向的角度去考虑问题。当你封包读取失败的时候,你如果要进行异常的处理,这个时候需要去目录下找文件,你会怎么找? 59 | 60 | 据我观察,一些游戏会调用GetFileAttributes ,FindFirstFile,_findfirst _wfindfirst先查找有没这个文件,然后考虑打开文件返回句柄。当然你说一定要这些API吗?不一定,直接CreateFile或fopen,没打开就是不存在,也可以完成这样的搜索任务。所以只能说个大概的特征,当然大家也不要看见风就是雨,看见别人调用了这几个API就感觉免封包了,还是需要具体去看的,还是需要多提高自己的姿势水平的! 61 | 62 | 还有个特征,很多游戏会有视频文件,通常这些文件特别大,作为一个商业引擎,一般不会直接把这么大的文件直接申请内存空间,然后读进去,这个时候可能会走游戏的免封包分支,也就是免封包的功能,打开文件传回句柄,然后边播放边读取,当然你说游戏引擎特意写一个对视频播放的分支有可能吗?当然有。 63 | 64 | 反正如果看到游戏的视频文件裸露在外面没封包,就可以试着跟踪一下这些视频文件的读取,可能有惊喜。 65 | 66 | 总的来说,我的建议是,直接跟踪封包的读取,基本上你都能看到免封包读取的分支,或者你理清楚逻辑,并不用去解析封包,也能找到合适的hook点。 67 | 68 | ## 免封包的注意事项 69 | 70 | 这个和免封包估计关系不大,和解包有关系。 71 | 72 | 很多解包程序,会在解析完成资源文件后,对资源文件进一步解密。 73 | 74 | 这个时候有些引擎虽然支持免封包,但是你输入的资源文件,是已经解密的或是引擎不支持的文件,那也没办法直接读取。 75 | 76 | 像是一些游戏的脚本文件,比如CMVS,会对脚本压缩加密,Garbro提取的是解密解压后的文件,CMVS支持免封包读取,但是你给它一个解密解压的文件,本身引擎也没特别去判断,这个时候自然就读取失败了,AdvHD这个引擎也是一个道理。 77 | 78 | 所以免封包的时候一定也要关注资源的加密解密状态。 79 | 80 | ## 结束 81 | 82 | 好了,这些模糊的概念就说到这,理论只是对实践的总结,我们没必要纠结。后面有空我会拿一些实例出来讲解,大家见多了看多了,也就会了,要是能自己独立调试思考,相信你会有自己的体会和总结。 83 | -------------------------------------------------------------------------------- /Packer/[The Enigma Protector] 一些小线索.md: -------------------------------------------------------------------------------- 1 | # The Enigma Protector 2 | 3 | ## 0、Dump壳Dll 4 | 可以从.data段dump出来 5 | 然后载入IDA,可以看到部分壳的函数名 6 | 7 | ## 1、一些特征码: 8 | 编译器入口点特征码 9 | ```ASM 10 | 33C06A003944240868001000000F94C050FF15????????85C0 [MicroSoft Linker 6.0] 11 | ``` 12 | 13 | 可以用于定位程序的入口点,其它的自己找 14 | 壳用的Turo Linke,可以直接dump出壳dll然后用ida找到入口点。 15 | 16 | 绘制验证窗口 17 | ```ASM 18 | 558BEC83C4E0535633D2 (壳代码解密后可以搜到) 19 | ``` 20 | 21 | 22 | 可以定位到绘制验证窗口的地方 23 | 24 | DELPHI 按钮事件: 25 | 26 | ```ASM 27 | 740E8BD38B83????????FF93???????? (壳代码解密后可以搜到) 28 | ``` 29 | 30 | 搜索到的结果对多个call dword pter这个下断点。 31 | 可以定位到具体按钮事件,也就是按下按钮执行的代码 32 | 33 | ## 2、直接过注册(未勾选常量加密): 34 | 35 | 硬件断点 `kernelbase.RegCreateKeyExInternalA` 36 | 37 | 断下后能看到 38 | ```ASM 39 | 00FEF940 035B2DEC "Software\\Enigma Protector\\29AEB4A0365755F6-B862CAE984EA4D0E" 40 | ``` 41 | 42 | 这样的东西 43 | 栈窗口往下翻阅 44 | 能看到压入了大量的`00000000` 45 | 大块的`00000000`中间还能看到输入的注册信息 46 | 大约esp偏移+300以上,也就是大块压入的`00000000`往下找到第一处压入的返回地址 47 | 一般在`SEH_Record`上面,前后各有夹杂了输入的注册信息字符串 48 | 49 | 再次往下翻页还能看到格式化字符串的信息 50 | 51 | ```ASM 52 | 00FEFED8 0357013C "Software\\Enigma Protector\\%.8x%.8x-%.8x%.8x" 53 | 00FEFEDC 01040C2C L"Software\\Enigma Protector\\%.8x%.8x-%.8x%.8x" 54 | 00FEFEE0 01040ED4 L"Software\\Enigma Protector\\29AEB4A0365755F6-B862CAE984EA4D0E" 55 | 00FEFF08 00000000 56 | 00FEFF0C 0103FD6C L"c:\\users\\[user]\\desktop\\123.exe" 57 | 00FEFF10 03570034 "kernel32.dll" 58 | 00FEFF14 0357000C "CheckRemoteDebuggerPresent" 59 | 00FEFF18 00000000 60 | ``` 61 | 62 | 转到这个上面提到的返回地址可以看到一个push和jmp 63 | 对push下断点 64 | 停住后eax=0,改成1即可直接bypass -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/QT6 CMake项目配置 (VSCode).md: -------------------------------------------------------------------------------- 1 | # QT6 CMake项目配置 (VSCode) 2 | 3 | 这篇文章我们介绍一下在VSCode下的配置,大体上和Visual Studio上差不多,建议先把之前介绍在VS上的配置过程看一遍, 4 | 5 | 6 | 7 | ## VSCode安装 8 | 9 | 这个就不用说了吧,无脑下一步 10 | 11 | ![](img/1.png) 12 | 13 | ## 插件安装 14 | 15 | 先把CMake相关的插件装一下 16 | 17 | 第一个是CMake语言的支持插件,装了这个写CMakeLists.txt就有语法提示和高亮了。 18 | 19 | ``` 20 | Name: CMake 21 | Id: twxs.cmake 22 | Description: CMake langage support for Visual Studio Code 23 | Version: 0.0.17 24 | Publisher: twxs 25 | VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=twxs.cmake 26 | ``` 27 | 28 | 第二个是CMake插件,就是让VSCode支持打开和管理CMake项目用的 29 | 30 | ```` 31 | Name: CMake Tools 32 | Id: ms-vscode.cmake-tools 33 | Description: Extended CMake support in Visual Studio Code 34 | Version: 1.18.42 35 | Publisher: Microsoft 36 | VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools 37 | ```` 38 | 39 | > 像是等下会在左下角出现的编译、调试、测试按键,自动Config,侧边栏的CMake相关设置等等,都是这个插件提供的 40 | 41 | ![](img/2.png) 42 | 43 | 接下来安装C/C++相关的插件 44 | 45 | 第一个是C/C++语言支持插件,也就是LSP,就是提供一些语法提示,debug支持等功能的 46 | 47 | ``` 48 | Name: C/C++ 49 | Id: ms-vscode.cpptools 50 | Description: C/C++ IntelliSense, debugging, and code browsing. 51 | Version: 1.20.5 52 | Publisher: Microsoft 53 | VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools 54 | ``` 55 | 56 | 第二个具体功能忘了,不装有些关键功能会用不了,直接装就行了 57 | 58 | ``` 59 | Name: C/C++ Extension Pack 60 | Id: ms-vscode.cpptools-extension-pack 61 | Description: Popular extensions for C++ development in Visual Studio Code. 62 | Version: 1.3.0 63 | Publisher: Microsoft 64 | VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack 65 | ``` 66 | 67 | > 有些人喜欢用clangd,我个人不太喜欢,这边就用微软官方的C/C++插件了,如果你自己有需求的再去设置就好了。 68 | 69 | ![](img/3.png) 70 | 71 | 安装好后,应该有这五个插件 72 | 73 | > 其实有一个是捆绑自动安装的,无所谓,不用理它。 74 | 75 | ![](img/4.png) 76 | 77 | 78 | 79 | ## 复制测试项目 80 | 81 | 好了,现在可以把[测试项目](demo)复制过来了 82 | 83 | > 不要把之前VS那个配置好的项目复制过来,后面会讲原因,直接去下载地址重新下一份放过来。 84 | 85 | 86 | 87 | ## 尝试打开项目 88 | 89 | ![](img/5.png) 90 | 91 | 点击Open Folder,选择项目的文件夹 92 | 93 | > 注意,一定要选择顶层CMakeLists.txt所在的文件夹,而不是上一级或下一级,这样CMake插件识别都有可能会有问题。 94 | 95 | ![](img/6.png) 96 | 97 | 如果有安全警告,直接打勾,确认就行了 98 | 99 | ![](img/7.png) 100 | 101 | ![](img/8.png) 102 | 103 | 104 | 105 | ![](img/9.png) 106 | 107 | 108 | 109 | 当然这里你随便选,只要是MSVC的编译器,都是不能编译的,即使是个hello world也编译不过去。 110 | 111 | ## 正确的打开方式 112 | 113 | 好了,先把刚刚的VSCode窗口关了吧。 114 | 115 | 再次打开上次我们编译的时候使用的`x64 Native Tools Command Prompt for VS 2022` 116 | 117 | 之前应该解释过了,这个其实就一个bat脚本,执行之前会配置很多和MSVC相关的环境变量 118 | 119 | ![](img/10.png) 120 | 121 | 从这个cmd窗口启动vscode就可以把这些环境变量继承过来,这样就可以正常使用MSVC编译器了,其实也还有种方法可以达到差不多的目的,但最好就是用那种方法来做,这边就不说了。(因为我踩过坑) 122 | 123 | 先加一个qt库到临时的path环境变量(VS配置那篇文章说了) 124 | 125 | 然后cd到项目的目录,然后code .来用vscode打开当前文件夹 126 | 127 | > code其实就是vscode,点就是表示当前目录 128 | 129 | ![](img/11.png) 130 | 131 | 然后在vscode里找到CMakeLists.txt按一下CTRL+S会自动开始Config 132 | 133 | 一般提示Generating done就没什么问题了 134 | 135 | ![](img/12.png) 136 | 137 | 现在开始编译 138 | 139 | > 默认应该是编译的x64 Debug,所以没必要选,如果不是,记得去侧边栏那个CMake图标里改一下,因为我们打开的是x64 Native的环境,不要去编译x32的东西。 140 | 141 | ![](img/13.png) 142 | 143 | 可以发现正常运行了 144 | 145 | ![](img/14.png) 146 | 147 | 可以发现,步骤和VS没什么差别,就是要从`x64 Native Tools Command Prompt for VS 2022`启动,来继承一些MSVC的编译环境 148 | 149 | 接下来就是最后一个问题了,那就运行时的链接,现在是动态链接的运行时 150 | 151 | 之前VS我们是写在CMakePresets.json里面的,其实这里也可以用 152 | 153 | 直接把CMakePresets.json复制过来, 154 | 155 | 把build目录删一下(因为CMakePresets.json里把generator默认改成了Ninja) 156 | 157 | 然后重新打开VSCode就好了 158 | 159 | 现在就和VS一样了,可以选`x64 Release Static Runtime`了 160 | 161 | ![](img/15.png) 162 | 163 | 不过,现在你会发现,它不让你选编译器了,只能选在json里写的配置了,说实话我也没搞懂为什么这样设计,可能是它觉得,既然你都自己写Config了那就干脆都你自己搞好了( 164 | 165 | CMakePresets.json本身就是CMake支持的,所以这里也可以使用,里面的内容其实不复杂,可以自己去看看,本质上来说就是把一堆CMake的set操作,写到了这个json里,不同的配置方案可以继承,可以写很多种配置方案,好处就是可以随便切换,不用在CMake里写if或-D参数,算是迈进了半现代化吧(,目前这个VS自动生成的,默认把编译器设置成了cl,也就是MSVC,要支持其它的编译器也不难,就是改那个cacheVariables就好了,改了后只要环境变量有对应的编译器工具链,CMake会自动配置,理想的情况,你可以为不同平台写不同的配置而不需要去改动CMakeLists.txt或很少改动,反正这东西还是挺好的,有兴趣可以自己再去了解一下、 166 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/demo/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.20) 2 | 3 | project(MyWindow) 4 | 5 | set(CMAKE_AUTOMOC ON) 6 | set(CMAKE_AUTOUIC ON) 7 | set(CMAKE_AUTORCC ON) 8 | 9 | if(WIN32) 10 | set(CMAKE_WIN32_EXECUTABLE ON) 11 | endif() 12 | 13 | find_package(Qt6 REQUIRED COMPONENTS Widgets) 14 | add_executable("${PROJECT_NAME}" main.cpp mywindow.cpp mywindow.ui mywindow.qrc) 15 | target_link_libraries("${PROJECT_NAME}" Qt6::Widgets) -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/demo/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "mywindow.h" 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | MyWindow m; 8 | m.show(); 9 | return a.exec(); 10 | } 11 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/demo/mywindow.cpp: -------------------------------------------------------------------------------- 1 | #include "mywindow.h" 2 | #include "ui_mywindow.h" 3 | 4 | MyWindow::MyWindow(QWidget* parent) 5 | : QMainWindow(parent), ui(new Ui::MyWindow) 6 | { 7 | ui->setupUi(this); 8 | this->on_pushButton_Reset_clicked(); 9 | QObject::connect(ui->radioButton_Blue, &QRadioButton::clicked, this, qOverload<>(&MyWindow::do_FontColor)); 10 | QObject::connect(ui->radioButton_Red, &QRadioButton::clicked, this, qOverload<>(&MyWindow::do_FontColor)); 11 | QObject::connect(ui->radioButton_Black, &QRadioButton::clicked, this, qOverload<>(&MyWindow::do_FontColor)); 12 | } 13 | 14 | MyWindow::~MyWindow() 15 | { 16 | delete ui; 17 | } 18 | 19 | void MyWindow::on_pushButton_Reset_clicked() 20 | { 21 | QFont font = ui->plainTextEdit->font(); 22 | font.setFamily(u8"微软雅黑"); 23 | font.setPixelSize(50); 24 | ui->plainTextEdit->setFont(font); 25 | ui->plainTextEdit->setPlainText(u8"这是一段中文"); 26 | } 27 | 28 | void MyWindow::on_pushButton_Clear_clicked() 29 | { 30 | ui->plainTextEdit->clear(); 31 | } 32 | 33 | void MyWindow::on_checkBox_Underline_clicked(bool checked) 34 | { 35 | QFont font = ui->plainTextEdit->font(); 36 | font.setUnderline(checked); 37 | ui->plainTextEdit->setFont(font); 38 | } 39 | 40 | void MyWindow::on_checkBox_Italic_clicked(bool checked) 41 | { 42 | QFont font = ui->plainTextEdit->font(); 43 | font.setItalic(checked); 44 | ui->plainTextEdit->setFont(font); 45 | } 46 | 47 | void MyWindow::on_checkBox_Bold_clicked(bool checked) 48 | { 49 | QFont font = ui->plainTextEdit->font(); 50 | font.setBold(checked); 51 | ui->plainTextEdit->setFont(font); 52 | } 53 | 54 | void MyWindow::do_FontColor() 55 | { 56 | QPalette plet = ui->plainTextEdit->palette(); 57 | if (ui->radioButton_Red->isChecked()) 58 | { 59 | plet.setColor(QPalette::Text, Qt::red); 60 | } 61 | else if (ui->radioButton_Blue->isChecked()) 62 | { 63 | plet.setColor(QPalette::Text, Qt::blue); 64 | } 65 | else if (ui->radioButton_Black->isChecked()) 66 | { 67 | plet.setColor(QPalette::Text, Qt::black); 68 | } 69 | ui->plainTextEdit->setPalette(plet); 70 | } 71 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/demo/mywindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MYWINDOW_H 2 | #define MYWINDOW_H 3 | 4 | #include 5 | 6 | namespace Ui 7 | { 8 | class MyWindow; 9 | } 10 | 11 | class MyWindow : public QMainWindow 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | explicit MyWindow(QWidget *parent = nullptr); 17 | ~MyWindow(); 18 | 19 | private slots: 20 | void on_pushButton_Reset_clicked(); 21 | 22 | void on_pushButton_Clear_clicked(); 23 | 24 | void on_checkBox_Underline_clicked(bool checked); 25 | 26 | void on_checkBox_Italic_clicked(bool checked); 27 | 28 | void on_checkBox_Bold_clicked(bool checked); 29 | 30 | void do_FontColor(); 31 | 32 | private: 33 | Ui::MyWindow *ui; 34 | }; 35 | 36 | #endif // MYWINDOW_H 37 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/demo/mywindow.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | res/en.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/demo/res/en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/demo/res/en.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/1.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/10.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/11.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/12.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/13.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/14.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/15.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/2.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/3.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/4.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/5.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/6.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/7.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/8.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (VSCode)/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (VSCode)/img/9.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/demo/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.20) 2 | 3 | project(MyWindow) 4 | 5 | set(CMAKE_AUTOMOC ON) 6 | set(CMAKE_AUTOUIC ON) 7 | set(CMAKE_AUTORCC ON) 8 | 9 | if(WIN32) 10 | set(CMAKE_WIN32_EXECUTABLE ON) 11 | endif() 12 | 13 | find_package(Qt6 REQUIRED COMPONENTS Widgets) 14 | add_executable("${PROJECT_NAME}" main.cpp mywindow.cpp mywindow.ui mywindow.qrc) 15 | target_link_libraries("${PROJECT_NAME}" Qt6::Widgets) -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/demo/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "mywindow.h" 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | MyWindow m; 8 | m.show(); 9 | return a.exec(); 10 | } 11 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/demo/mywindow.cpp: -------------------------------------------------------------------------------- 1 | #include "mywindow.h" 2 | #include "ui_mywindow.h" 3 | 4 | MyWindow::MyWindow(QWidget* parent) 5 | : QMainWindow(parent), ui(new Ui::MyWindow) 6 | { 7 | ui->setupUi(this); 8 | this->on_pushButton_Reset_clicked(); 9 | QObject::connect(ui->radioButton_Blue, &QRadioButton::clicked, this, qOverload<>(&MyWindow::do_FontColor)); 10 | QObject::connect(ui->radioButton_Red, &QRadioButton::clicked, this, qOverload<>(&MyWindow::do_FontColor)); 11 | QObject::connect(ui->radioButton_Black, &QRadioButton::clicked, this, qOverload<>(&MyWindow::do_FontColor)); 12 | } 13 | 14 | MyWindow::~MyWindow() 15 | { 16 | delete ui; 17 | } 18 | 19 | void MyWindow::on_pushButton_Reset_clicked() 20 | { 21 | QFont font = ui->plainTextEdit->font(); 22 | font.setFamily(u8"微软雅黑"); 23 | font.setPixelSize(50); 24 | ui->plainTextEdit->setFont(font); 25 | ui->plainTextEdit->setPlainText(u8"这是一段中文"); 26 | } 27 | 28 | void MyWindow::on_pushButton_Clear_clicked() 29 | { 30 | ui->plainTextEdit->clear(); 31 | } 32 | 33 | void MyWindow::on_checkBox_Underline_clicked(bool checked) 34 | { 35 | QFont font = ui->plainTextEdit->font(); 36 | font.setUnderline(checked); 37 | ui->plainTextEdit->setFont(font); 38 | } 39 | 40 | void MyWindow::on_checkBox_Italic_clicked(bool checked) 41 | { 42 | QFont font = ui->plainTextEdit->font(); 43 | font.setItalic(checked); 44 | ui->plainTextEdit->setFont(font); 45 | } 46 | 47 | void MyWindow::on_checkBox_Bold_clicked(bool checked) 48 | { 49 | QFont font = ui->plainTextEdit->font(); 50 | font.setBold(checked); 51 | ui->plainTextEdit->setFont(font); 52 | } 53 | 54 | void MyWindow::do_FontColor() 55 | { 56 | QPalette plet = ui->plainTextEdit->palette(); 57 | if (ui->radioButton_Red->isChecked()) 58 | { 59 | plet.setColor(QPalette::Text, Qt::red); 60 | } 61 | else if (ui->radioButton_Blue->isChecked()) 62 | { 63 | plet.setColor(QPalette::Text, Qt::blue); 64 | } 65 | else if (ui->radioButton_Black->isChecked()) 66 | { 67 | plet.setColor(QPalette::Text, Qt::black); 68 | } 69 | ui->plainTextEdit->setPalette(plet); 70 | } 71 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/demo/mywindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MYWINDOW_H 2 | #define MYWINDOW_H 3 | 4 | #include 5 | 6 | namespace Ui 7 | { 8 | class MyWindow; 9 | } 10 | 11 | class MyWindow : public QMainWindow 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | explicit MyWindow(QWidget *parent = nullptr); 17 | ~MyWindow(); 18 | 19 | private slots: 20 | void on_pushButton_Reset_clicked(); 21 | 22 | void on_pushButton_Clear_clicked(); 23 | 24 | void on_checkBox_Underline_clicked(bool checked); 25 | 26 | void on_checkBox_Italic_clicked(bool checked); 27 | 28 | void on_checkBox_Bold_clicked(bool checked); 29 | 30 | void do_FontColor(); 31 | 32 | private: 33 | Ui::MyWindow *ui; 34 | }; 35 | 36 | #endif // MYWINDOW_H 37 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/demo/mywindow.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | res/en.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/demo/res/en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/demo/res/en.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/1.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/10.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/11.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/12.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/13.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/14.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/15.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/16.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/17.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/18.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/19.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/2.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/20.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/21.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/22.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/23.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/24.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/25.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/26.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/27.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/28.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/29.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/3.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/30.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/31.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/32.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/33.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/34.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/35.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/36.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/37.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/38.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/39.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/4.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/40.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/41.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/42.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/5.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/6.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/7.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/8.png -------------------------------------------------------------------------------- /Programming/QT6 CMake项目配置 (Visual Studio)/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6 CMake项目配置 (Visual Studio)/img/9.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/1.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/10.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/11.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/12.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/13.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/14.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/15.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/16.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/17.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/18.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/19.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/2.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/20.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/21.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/3.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/4.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/5.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/6.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/7.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/8.png -------------------------------------------------------------------------------- /Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Programming/QT6.7.2源码编译 静态库 动态库 (MSVC)/img/9.png -------------------------------------------------------------------------------- /README.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/README.jpeg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dir-A_Essays_MD 2 | 自己的一点感悟,有对有错,自行斟酌,欢迎提`issues` `pr` 指正完善. 3 | ![](README.jpeg) 4 | 5 | ## [Bookshelf](Bookshelf) 书架 6 | 还是需要学习一个!提高姿势水平!口-口 7 | 你们啊毕竟还 `too young too simple sometimes naive` 8 | 9 | ## [Reverse](Reverse) 逆向 10 | `Galgame` 引擎逆向的皮毛 ┗( T﹏T )┛ 11 | 记录关于如何受罪的`壹佰`种方法`:)` 12 | 13 | 14 | ## [Methodology](Methodology) 方法论 15 | 不要在错误的方向一路狂奔 (°ー°〃) 16 | 悟了但又好像没有,悟了吗?悟了但又好像没有 17 | 18 | 19 | ## [Programming](Programming) 编程 20 | 三年?三年才入门! w(゚Д゚)w 21 | 我真的在写了!不信你去看监控! 22 | 23 | 24 | ## [Packer](Packer) 壳 25 | 能翻墙就别拿锤子砸门 ┑( ̄Д  ̄)┍ 26 | 不是不会脱,而是不脱更有性价比 27 | -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/[AGE] Eushully ASProtect 脱壳.md: -------------------------------------------------------------------------------- 1 | # [AGE引擎] Eushully ASProtect 脱壳 2 | 3 | AGE引擎的`ASProtect`主要在2013年左右的版本上,2017年的`天結いキャッスルマイスター`已经采用了`PlayDRM`。 4 | `ASProtect`主要加在 `AGE.EXE` 和 `AGERC.DLL` 上,前者为游戏主程序,后者为游戏的资源DLL(标题菜单,模态窗口), 5 | `AGERC.DLL`容易被加壳软件识别为`ASPack`,其实内部的`IAT`是加密的。 6 | 网上大多数讲解`ASProtect`脱壳的教程都是老的`1.xx`版本,其`IAT`没有什么特殊的处理, 7 | 8 | `AGE`的加的是`2.xx`的版本,`FF15`的`Call`被VM了,其它代码段未见特殊处理,未见`OEP`虚拟化或被偷。 9 | 10 | `ASProtect`由于比较古老,很多人研究,存在大量的脚本,接下来我们利用脚本对AGE的主程序和资源DLL进行脱壳即可。 11 | 12 | ## 准备工作 13 | 14 | ### 目标游戏 15 | 16 | `魔導巧殻` (1.03更新补丁,AP,都无所谓,不改变原本的EXE和DLL) 17 | 18 | ### 环境 19 | 20 | `Windows XP Pro SP3` 21 | 22 | `Ollydbg` (这里选用吾爱破解的版本,其它版本可能需要自行添加 `ODbgScript` ,`OllyDump`插件) 23 | 24 | `Scylla x86 v0.9.8` 25 | 26 | `ASProtect unpaker script by VolX 1.15E`(1.15F也可以,注意`Asprvm8s.bin`这个文件必须要有) 27 | 28 | 比较懒的可以直接下,吾爱破解工具包,除了脚本都有。 29 | 30 | 脚本和脱壳/未脱壳的文件在[此处](https://github.com/Dir-A/Dir-A_Essays_MD/tree/main/image/%5BAGE%E5%BC%95%E6%93%8E%5D%20Eushully%20ASProtect%20%E8%84%B1%E5%A3%B3/%E9%99%84%E4%BB%B6) 31 | 32 | ## 修改脚本 33 | 34 | 由于脚本需要用到 `Asprvm8s.bin` 文件,里面的路径是固定的,要么把文件放到脚本默认的路径中,要么自行修改路径,总共两处,在`Aspr2.XX_unpacker_v1.15E.osc`里搜索 `Asprvm8s.bin` 字段就可以找到 35 | 36 | ![1](image/1.png) 37 | 38 | ![2](image/2.png) 39 | 40 | 此处我修改到C盘根目录,同时把 `Asprvm8s.bin` 放到C盘根目录下。 41 | 42 | ![3](image/3.png) 43 | 44 | ## 开脱 45 | 46 | `脚本文件`和游戏`EXE`和`DLL`拽入虚拟机中 47 | 48 | ![4](image/4.png) 49 | 50 | 打开`Ollydbg`把`EXE`拽进去,提示代码压缩加密,点否即可。 51 | 52 | ![5](image/5.png) 53 | 54 | 如果没停在同样的窗口,点一下菜单栏边上的C按钮即可 55 | 56 | ![6](image/6.png) 57 | 58 | 在菜单栏,选择插件,选择`ODbgScript`,选择运行脚本,打开 59 | 60 | ![7](image/7.png) 61 | 62 | ![8](image/8.png) 63 | 64 | 打开后会自动运行,请确认脚本中的路径已经修改,或 `Asprvm8s.bin` 文件已经放置在对应的路径下,否则在运行脚本的过程中,会直接卡住。 65 | 66 | 如果脚本没有运行,可以点窗口界面内的缩小窗口,在刚刚的`ODbgScript`插件里找到脚本运行窗口,在脚本窗口按下空格,或右键--继续来运行脚本 67 | 68 | ![9](image/9.png) 69 | 70 | ![10](image/10.png) 71 | 72 | 运行结束后,如图所示,提示没有被偷代码,和让我们检查`Log窗口`的`IAT信息`,点确认即可。 73 | 74 | ![11](image/11.png) 75 | 76 | 按下菜单栏下边的的` l 按钮`,来打开`Log窗口`,查看`OEP`和`IAT`的相关详细,如果没有则脚本无效,或者有别的问题 77 | 78 | ![13](image/13.png) 79 | 80 | 确认存在`OEP`和`IAT`信息,然后,选择菜单栏,`插件`--->`OllyDump`--->`脱壳在当前调试的进程` 81 | 82 | ![12](image/12.png) 83 | 84 | 在`OllyDump`窗口,确认`OEP的地址`和`OEP的RVA`,然后点击`获取EIP作为OEP`,再次确认地址,和`Log窗口`的信息对应,则点击`脱壳`,然后输入新的文件名保存即可。在保存之前可以看到,多出来个`de_AGE.exe`的文件,不必理会这个文件,稍后可以自行删除。保存途径可能会卡住几秒,等待即可。 85 | ![14](image/14.png) 86 | ![15](image/15.png) 87 | 88 | 把脱壳后的`EXE`复制回物理机,运行查看效果。 89 | 90 | ![16](image/16.png) 91 | 92 | 如果出现在物理机无法运行,虚拟机正常运行的情况,请尝试以下步骤。 93 | 94 | 重新操作到脚本运行完成和打开`Log窗口`查看`OEP和IAT信息`的步骤 95 | 96 | 打开`Scylla x86`,选择当前需要脱壳的进程,并再次确认`OEP和RVA信息` 97 | 98 | ![17](image/17.png) 99 | 100 | 填入`OEP地址`,`IAT地址`,`IAT大小`,然后点击获取输入表,可以看到下图输入表全部绿色勾,表示正常获取。 101 | 102 | ![18](image/18.png) 103 | 104 | 此时点击 `显示无效函数`和`显示可疑函数`,如果只有一个`IsDialogMessageA`为可疑,则无需理会,如果有大量可疑和无效,则脚本不成功。 105 | 106 | ![19](image/19.png) 107 | 108 | 然后点击`转储到文件`,默认命名不必修改,直接保存即可 109 | 110 | ![20](image/20.png) 111 | 112 | 接着点击`修复转储后的文件`,找到刚刚转储的文件打开即可 113 | 114 | ![21](image/21.png) 115 | 116 | 此时转储文件同目录下会多出一个后缀为`_SCY.exe`的新文件,复制到物理机运行查看效果 117 | 118 | ![22](image/22.png) 119 | 120 | 至此,基本Eushully ASProtect 的主程序都可以正常脱壳,如不行,就换`Import REConstructor`继续尝试。 121 | 122 | `AGERC.DLL`的脱壳和上面一样,区别在于,DLL是无法直接运行,所以DLL在OD里其实是挂在一个`loader`上的,如果用`Scylla x86`脱壳,需要选择`loaddl.exe`程序,然后`选取DLL`,然后 `修复转储后的文件` 应该选择`de_AGERC.DLL`,而不是直接修复Scylla的转储,之后操作一样。 123 | 124 | ![23](image/23.png) 125 | 126 | -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/1.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/10.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/11.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/12.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/13.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/14.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/15.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/16.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/17.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/18.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/19.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/2.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/20.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/21.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/22.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/23.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/3.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/4.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/5.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/6.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/7.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/8.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/image/9.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/org/AGE.EXE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/org/AGE.EXE -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/org/AGERC.DLL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/org/AGERC.DLL -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/script/ASProtect unpaker script by VolX 1.15E (support new version)/Asprvm8s.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/script/ASProtect unpaker script by VolX 1.15E (support new version)/Asprvm8s.bin -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/script/ASProtect unpaker script by VolX 1.15E (support new version)/ODbgScript.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/script/ASProtect unpaker script by VolX 1.15E (support new version)/ODbgScript.dll -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/script/ASProtect unpaker script by VolX 1.15E (support new version)/README!!!.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/script/ASProtect unpaker script by VolX 1.15E (support new version)/README!!!.txt -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/unpack/AGE.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/unpack/AGE.exe -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully ASProtect 脱壳/附件/unpack/AGERC.DLL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully ASProtect 脱壳/附件/unpack/AGERC.DLL -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully 过注册检查/[AGE] Eushully 过注册检查弹窗.md: -------------------------------------------------------------------------------- 1 | # Eushully (AGE) 过注册检查 2 | 3 | Eushully 的AGE引擎(ARCGameEngine)有一种类似于CatSystem2的本机安装标识文件,也就防止你直接拷贝游戏到别的机器上运行,区别在于CatSystem2的检查是直接不让你运行,而AGE则是运行后随机弹窗来恶心你 4 | 需要先脱壳,请参考 [[AGE引擎] Eushully ASProtect 脱壳](https://github.com/Dir-A/Dir-A_Essays_MD/blob/main/%5BAGE%E5%BC%95%E6%93%8E%5D%20Eushully%20ASProtect%20%E8%84%B1%E5%A3%B3.md) 5 | ## 目标游戏:魔導巧殻 6 | 调用检查函数 7 | 8 | ![1](image/1.png) 9 | 10 | 00486E30 CheckIsReg 11 | 12 | ![2](image/2.png) 13 | 14 | 返回1表示注册,返回0表示未注册,返回值随后会写入都内部的变量(set:IsReggist)里存储 15 | 16 | CheckIsReg 内部通过读取 SYS4RK.BIN 或 SYS3RK.BIN 文件来计算注册信息 17 | SYS4RK.BIN文件是唯一一个游戏目录下安装在不同机器上会修改的文件 18 | 该文件相当于标识机器的作用,如果你拷贝游戏到别的机器上, 19 | 这个文件的校验值计算后将会不能通过CheckIsReg 20 | 也就是说,会返回0,从而让游戏识别到, 21 | 当前机器使用的版本为未注册版本,也就是拷贝的盗版 22 | 但是此时游戏引擎并不会有任何提示。 23 | 24 | 当进入游戏后,会在消息循环函数里先读取set:IsReggist的值,并且在循环过程中不断验证 25 | 26 | 00411FC0 消息循环函数 27 | 28 | 0041207A 读取set:IsReggist的值 29 | 30 | ![3](image/3.png) 31 | 32 | 读取后进行消息循环,并验证set:IsReggist的值,如果该值为未注册的,则会进入随机显示错误消息弹窗。 33 | 34 | ## 过检测 35 | 36 | 很简单,我们只需要搜索字符串 set:IsReggist 并下断点,第一个读取这个字符串的函数是保存验证flag的 37 | 也就是这个保存验证flag函数的倒数第二个参数,倒数第一个参数就是验证flag 38 | 我们只需要向上找到给这个flag赋值的函数,就是CheckIsReg了,然后把CheckIsReg的值改为1即可。 39 | 40 | 或者直接搜索 SYS4RK.BIN 字符串,定位到 CheckIsReg 里面。 41 | 42 | ## 版本显示 43 | 00480430 获取版本号 44 | ![3](image/4.png) 45 | 该函数用来打开更新安装补丁写在注册列表中的项,从而获取版本号,如果没有则显示1.0版本,即使更新补丁文件已经放到游戏目录下,暂时不清楚会不会对游戏运行有影响。 46 | -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully 过注册检查/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully 过注册检查/image/1.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully 过注册检查/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully 过注册检查/image/2.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully 过注册检查/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully 过注册检查/image/3.png -------------------------------------------------------------------------------- /Reverse/[AGE] Eushully 过注册检查/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[AGE] Eushully 过注册检查/image/4.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/CMVS 文件读取分析.md: -------------------------------------------------------------------------------- 1 | # CMVS 文件读取分析 2 | 3 | 这个引擎主要是[Purple software](https://vndb.org/p132)用的,其实该引擎默认就可以免封包读取,关键是如何自由控制来达到替换文件的目的 4 | 5 | 这次主要两个目标 6 | 7 | - 找到并控制免封包 8 | - 分析读取文件逻辑 9 | 10 | 这里选用[クナド国記](https://vndb.org/v32021)进行演示 11 | 12 | 相关链接 13 | 14 | - [免封包略谈](https://github.com/Dir-A/Dir-A_Essays_MD/blob/main/%E6%96%B9%E6%B3%95%E8%AE%BA/%5B%E5%B0%81%E5%8C%85%5D%20%E5%85%8D%E5%B0%81%E5%8C%85%E7%95%A5%E8%B0%88.md) 15 | 16 | - [VFS的实现思路](https://github.com/Dir-A/Dir-A_Essays_MD/blob/main/%E6%96%B9%E6%B3%95%E8%AE%BA/%5B%E6%96%B9%E6%B3%95%E8%AE%BA%5D%20VFS%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%80%9D%E8%B7%AF.md) 17 | 18 | - [封包逆向入门](https://github.com/Dir-A/Dir-A_Essays_MD/blob/main/%E6%96%B9%E6%B3%95%E8%AE%BA/%5B%E6%96%B9%E6%B3%95%E8%AE%BA%5D%20%E5%B0%81%E5%8C%85%E9%80%86%E5%90%91%E5%85%A5%E9%97%A8.md) 19 | 20 | 21 | 22 | 23 | ## 寻找免封包代码 24 | 25 | 这个没有统一的方法,需要去分析从封包读取文件的逻辑才能确定 26 | 27 | 所以这里就是按照正常的封包逆向思路进行分析,并在途中偶遇免封包逻辑 :P 28 | 29 | 首先我们肯定会想到断下`CreateFile`定位到打开封包的地方 30 | 31 | 可以看到游戏导入了三个相关函数,断 `CreateFileA\W` 即可,至于map有没可能?当然有了,但一般不会用,待我们先观察再说。 32 | 33 | ![1](image/1.png) 34 | 35 | ![2](image/2.png) 36 | 37 | 可以发现,直到打开游戏的开始设置窗口也没打开任何封包文件(啊?怎么在log窗口打印打开的文件?当然是条件断点了) 38 | 39 | ![3](image/3.png) 40 | 41 | 那我们点启动游戏吧! 42 | 43 | 启动游戏后可以发现`CreateFileW`打开的基本都不是目标文件,把它断点去掉,继续调试`CreateFileA`发现打开了一个`start.ps3`文件,如果你仔细看过游戏目录就知道,这个`start.ps3`文件其实`script.cpz`封包里也有一个,如果提取出来对比会发现,两个文件其实是不一样的。 44 | 45 | ![4](image/4.png) 46 | 47 | 那这不就是免封包读取?对吧? 48 | 49 | 如果你多打开几个封包观察就会发现,有些文件,它是打包到封包里的,有些则直接丢在了目录下,比如它有个`music`和`video`目录里面的文件都没封包 50 | 51 | 说到这其实也就是一个经验了,如果观察到,游戏有些资源没封包有些又封了,那是不是证明游戏引擎应该有某种机制来读取没封包的资源文件?当然很多引擎的视频文件一般不封包,因为视频文件比较大,跟踪视频文件的读取通常也是一个找免封包位置的突破口,当然也有可能引擎对视频文件的读取单独写了一个逻辑。 52 | 53 | 好了我们继续往下走,现在可以继续观察`CreateFileA`它后续就一直在打开存档或封包了 54 | 55 | ![5](image/5.png) 56 | 57 | 那么我们就从`start.ps3`这个未封包的脚步文件入手来看看它是怎么读取的,重新载入游戏,运行,断到打开`start.ps3`的位置 58 | 59 | ![6](image/6.png) 60 | 61 | 可以发现,它上面就有个查找文件的操作,后面就是分配内存和读取文件了,我们用IDA Pro来看大概的逻辑,整理一下,大概就这样 62 | 63 | ![7](image/7.png) 64 | 65 | 这个函数有两个参数,第一个是要读取的文件路径,第二个参数用来返回读取文件的大小,函数返回值是读取文件分配的内存的地址 66 | 67 | 这个函数首先用`FindFirstFileA` 来查找给定路径下是否存在这个文件,如果查找到了文件,就关闭查找句柄,接着把文件的大小读出来,然后打开文件,并分配一块内存,把文件整个读进去 68 | 69 | 对函数名按一下`x`发现有好多地方都使用了这个函数(当然,你那看到的肯定都是sub_xxxxx) 70 | 71 | ![8](image/8.png) 72 | 73 | 由于不能确定是哪个函数调用过来的,我们继续调试,看看返回到哪了。 74 | 75 | 这个函数我已经整理过了(整理的过程很简单,不断调试这个函数,搞清楚每一个变量的用途就行了) 76 | 77 | ![9](image/9.png) 78 | 79 | 来看看这个读取过程,首先函数输入的参数分别是 一个对象的指针,需要读取的文件名,指针用来返回读取的大小,函数的返回值是ps3文件的内存地址 80 | 81 | ![10](image/10.png) 82 | 83 | 重点来看看这块 84 | 85 | 是一个`do--while`循环,这个循环最多尝试4次,每个循环对`pEntrt`加`CMVS_Read_Entry`结构的大小,从这我们不难看出,至少有四个 `CMVS_Read_Entry`结构 86 | 87 | 该的结构如下 88 | 89 | ```C 90 | struct CMVS_Read_Entry 91 | { 92 | char aReadPath[2048]; 93 | CMVS_Pack_Coder *pCoder; 94 | }; 95 | ``` 96 | 97 | 首先会判断`aReadPath`是否为空,不为空就判断末尾是否是`\\`也就是Windows路径的斜杠,为什么要判断这个呢?对这个部分不断调试就可以知道 98 | 99 | ![11](image/11.png) 100 | 101 | 只有读取 `start.ps3`的时候末尾才是`\\`换句话说,其它时候输入的都是封包路径,而读取 `start.ps3`的时候输入的是一个文件夹的路径 102 | 103 | 那么接下来也就不难看出来了,如果输入的是文件夹路径,就把文件夹路径和要读取的文件名拼接后调用`CMVS::LoadResViaDir`直接把文件读进来,如果是个封包路径就走`CMVS_Read_Entry`里面的`CMVS_Pack_Coder`对象指针通过虚表里的函数从封包读取 104 | 105 | 说到这,就很容易想到hook这个函数,或者hook判断斜杠的地方就来控制免封包读取了 106 | 107 | ![12](image/12.png) 108 | 109 | 不过还有点要注意的是,如果免封包读取的话,要记得搞清楚文件的加密,这里可以看到这部分对文件进行了解密和解压,如果用garbro提取的ps3文件,它都是解密好的,直接免封包是不行的,要么把ps3文件加密回去,要么把这些解密代码跳过,跳过也得分是从封包还是从目录下读取的,因为从封包读取的依然是加密的。 110 | 111 | 这个函数是对ps3文件也就是脚本文件的读取,pb3也就是图片文件也有类似的逻辑,对`CMVS::LoadResViaDir`按`x`就能定位到pb3读取的部分,pb3同样有一层加密,但因为cmvs会自动判断图片文件的格式,所以直接用png代替即可 112 | 113 | 以下实现直接hook判断`\\`的地方和跳过解密 114 | 115 | ```c 116 | void __declspec(naked)CMVS_380_PS3Hook() 117 | { 118 | __asm 119 | { 120 | pushfd; 121 | pushad; 122 | mov eax, dword ptr[esp + 0x10]; 123 | mov sg_cpFileName, eax; 124 | } 125 | 126 | if (FileExist()) 127 | { 128 | __asm mov dword ptr[esp + 0x18], offset sg_aHookFolder; 129 | *sg_asDecodeScript = 0xEB; 130 | *sg_asDecompScript = 0xEB; 131 | } 132 | else 133 | { 134 | *sg_asDecodeScript = 0x74; 135 | *sg_asDecompScript = 0x74; 136 | } 137 | 138 | __asm 139 | { 140 | popad; 141 | popfd; 142 | ret; 143 | } 144 | } 145 | 146 | void __declspec(naked)CMVS_380_PB3Hook() 147 | { 148 | __asm 149 | { 150 | pushfd; 151 | pushad; 152 | mov eax, dword ptr[esp + 0x2C]; 153 | mov sg_cpFileName, eax; 154 | } 155 | 156 | if (FileExist()) 157 | { 158 | __asm mov dword ptr[esp + 0x4], offset sg_aHookFolder; 159 | } 160 | 161 | __asm 162 | { 163 | popad; 164 | popfd; 165 | ret; 166 | } 167 | } 168 | ``` 169 | 170 | 171 | 172 | 说到这免封包就结束了。 173 | 174 | 175 | 176 | ## 分析读取文件流程 177 | 178 | 其实上面的知识就足够进行免封包读取了,但我们其实并不知道,那些文件夹路径和封包路径是从哪来的,还有虚表是从哪来的,读取的文件名又是从哪来的 179 | 180 | 为了搞清楚这些,需要对`pEntry`进行回溯,回溯后可以发现 181 | 182 | ![13](image/13.png) 183 | 184 | 这个文件夹路径是游戏目录下`cmvs.cfg`里读取的,我们跟着这个路径的数据流向,可以发现有一个路径注册函数 185 | 186 | ![14](image/14.png) 187 | 188 | 观察这个注册路径函数可以发现,每种类型文件的读取最多可以注册4个`CMVS_Read_Entry`结构,这个结构就是一个定长路径buffer+一个对象指针,对象的指针就是通过下面的switch依据获取设置的封包版本new出来的,也就是说这个对象其实就是封包对象,用来解析封包用的 189 | 190 | ![15](image/15.png) 191 | 192 | 不难发现,最后new一个封包对象后,把指针赋给了`CMVS_Read_Entry`结构 193 | 194 | ![16](image/16.png) 195 | 196 | 对这个注册函数按一下x可以发现有很多使用的地方,这些部分我都跟踪完了 197 | 198 | ![17](image/17.png) 199 | 200 | 可以看到它对不同类型的资源文件单独设置读取对象,每个对象有四个`CMVS_Read_Entry`结构,这也就是`CMVS`引擎`update`封包读取的实现。 201 | 202 | 它的更新补丁是一个`update.cpz`封包和`start.ps3`文件,`start.ps3`里面就可以写注册读取路径的虚拟机代码. 203 | 204 | 比如`script`文件的读取,四个读取路径,最开始把第一个路径注册成`data\pack\`以此来加载目录下的`start.ps3`文件,执行`start.ps3`里的虚拟机代码又进行路径注册,把第一个路径注册成`update.cpz`封包,第二个路径注册成`script.cpz` 205 | 206 | 在读取`ps3`文件的时候,通过`do--while`循环读取这四个不同的`CMVS_Read_Entry`,这样就可以实现优先读取`update.cpz`封包里的数据,不更新的文件`update.cpz`会读取失败,那就读取下一个`CMVS_Read_Entry`结构,如果四个都失败游戏就会奔溃。 207 | 208 | 借助这个原理,我们其实可以修改`start.ps3`里的字节码来注册自定义的路径,或者hook注册路径函数来添加读取路径或修改读取的优先级。 209 | 210 | 当然它这个注册路径的函数也有多个 211 | 212 | ![18](image/18.png) 213 | 214 | 至于文件名是从何而来的? 215 | 216 | 其实只要回溯`CMVS::Script::Reader`也可以知道,这是从脚本里读出来的文件名字符串,回溯可以发现在一个很多case的switch里调用过来的,那个其实就是在解析虚拟机的字节码 217 | 218 | 至此读取流程我们就分析完了 219 | -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/1.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/10.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/11.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/12.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/13.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/14.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/15.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/16.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/17.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/18.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/2.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/3.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/4.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/5.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/6.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/7.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/8.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 文件读取分析/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 文件读取分析/image/9.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/1.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/10.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/11.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/12.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/13.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/14.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/15.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/16.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/17.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/18.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/19.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/2.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/20.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/21.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/22.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/23.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/24.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/25.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/26.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/3.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/4.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/5.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/6.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/7.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/8.png -------------------------------------------------------------------------------- /Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[CMVS] 紫社引擎 折腾日记 Purple software/image/9.png -------------------------------------------------------------------------------- /Reverse/[HorkEye] 寻找ScriptHook地址/[HorkEye] 寻找ScriptHook地址.md: -------------------------------------------------------------------------------- 1 | # [ACV1引擎] 寻找ScriptHook地址 2 | 3 | ## 0x00 前言 4 | 5 | 为了实现不封包即对游戏的脚本文件进行修改 6 | 7 | 此处需要Hook相关位点 8 | 9 | Hook功能已经在[ACV1FileHook](https://github.com/Dir-A/ACV1FileHook)中实现 10 | 11 | 但是需要寻找两个地址 12 | 13 | 第一个地址是LoadScript函数的地址,该函数传入脚本文件的Hash文件名和一个记录信息的结构体地址 14 | 15 | 第二个地址是DecScript函数的地址,该函数对脚本文件进行解密 16 | 17 | ```C 18 | DWORD CDECL DecScript( 19 | PBYTE pDecBuffer, 20 | PDWORD pdwDecSize, 21 | PBYTE pRawBuffer, 22 | DWORD dwRawSize); 23 | DWORD CDECL LoadScript( 24 | DWORD dwHashHigh, 25 | DWORD dwHashLow, 26 | PBYTE &UnknownStruct); 27 | ``` 28 | 29 | ``` 30 | LoadScript 31 | { 32 | ReadRawScript 33 | DecScript 34 | InitScript 35 | } 36 | ``` 37 | 38 | 39 | 40 | ## 0x01 寻找地址 41 | 42 | 首先搜索字符串 script/ 43 | 44 | 这是因为LoadScript函数的实现末尾有一个对脚本进行加载的函数InitScript 45 | 46 | 该函数中的一个参数是该字符串常量,此处IDA识别有点问题。 47 | 48 | 我们可以通过该函数的参数定位出LoadScript函数 49 | 50 | 51 | 52 | 下面可以看到InitScript函数,DecScriptFile就在其上面不远处 53 | 54 | DecScriptFile其下面会有个 ulltos32 这是明显的特征 55 | 56 | 换句话说,你只要找到 script/ 使用处 57 | 58 | 然后往上翻阅,到第二个 ulltos32 call的地方,其上那个函数就是DecScriptFile 59 | 60 | ```C 61 | } 62 | if ( DecScriptFile((PBYTE)decBuffer, &decSize, (PBYTE)rawBuffer, szie) ) 63 | { 64 | v32 = 1; 65 | v19 = ulltos32((int)v37, dwHashLow, hash_high_1); 66 | UnknownStruct = (PBYTE *)&v25; 67 | v42 = 1; 68 | sub_417E50(&v25, v19, &unk_5C1B7C); 69 | errord(v25, v26, v27, v28, v29, v30, v31, v32); 70 | if ( v38 >= 0x10 ) 71 | operator delete(v37[0]); 72 | free(rawBuffer); 73 | return 0; 74 | } 75 | free(rawBuffer); 76 | v20 = ulltos32((int)v37, dwHashLow, hash_high_1); 77 | if ( *(_DWORD *)(v20 + 20) >= 0x10u ) 78 | v20 = *(_DWORD *)v20; 79 | v21 = (char *)&dword_C855B8 - v20; 80 | do 81 | { 82 | v22 = *(_BYTE *)v20; 83 | v21[v20] = *(_BYTE *)v20; 84 | ++v20; 85 | } 86 | while ( v22 ); 87 | if ( v38 >= 0x10 ) 88 | operator delete(v37[0]); 89 | v32 = (int)"script/"; 90 | InitScript( 91 | decBuffer_1, 92 | decSize, 93 | (void (__cdecl *)(int, unsigned int, unsigned int, int))ProcessScript, 94 | (char *)UnknownStruct); 95 | return 1; 96 | ``` 97 | 98 | -------------------------------------------------------------------------------- /Reverse/[HorkEye] 寻找Script封包密钥/[HorkEye] 寻找Script封包密钥.md: -------------------------------------------------------------------------------- 1 | # [HorkEye] 寻找Script封包密钥 2 | 3 | ## 0x01 识别引擎 4 | 5 | 引擎封包的文件头会写一个 ACV1 6 | 7 | 封包名一般为arc0.dat arc1.dat arc1.dat script.dat 8 | 9 | ## 0x02 为什么要寻找封包密钥 10 | 11 | 从[vn_re](https://github.com/Forlos/vn_re/tree/master/docs/acv1)这个开源项目可以看到,这个引擎的script.dat文件是需要一个密钥的 12 | 13 | 也就是说需要这个密钥才能解开这个封包。 14 | 15 | 同时这个项目也提到密钥为游戏名的crc64的前四个字节。 16 | 17 | ## 0x03 寻找密钥 18 | 19 | 既然已经知道密钥是通过crc64函数算出来的,我们只需要找到这个函数即可 20 | 21 | 对于老版本的ACV1引擎,crc64函数是直接导出的 22 | 23 | ![](image/1.png) 24 | 25 | 26 | 从这里可以看到crc64_hash这个函数,对这个函数头下断点 27 | 28 | 等到游戏传进来一个游戏名的参数,既可以得到解包的密钥 29 | 30 | 31 | 32 | 对于新版本的,这个函数进行了inline 33 | 34 | 虽然也同样导出了crc64,但是你断下发现并不会传入游戏名 35 | 36 | 这时可以搜索字符串 script.dat 可以找到唯一的结果 37 | 38 | 转到该字符串的使用处 39 | 40 | ![](image/2.png) 41 | 42 | 43 | 可以看到明显进行了inline 44 | 45 | 46 | 47 | 其实老版本也可以用这个方法,只不过搜索script.dat有两处,其中一处和图中类似。 -------------------------------------------------------------------------------- /Reverse/[HorkEye] 寻找Script封包密钥/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[HorkEye] 寻找Script封包密钥/image/1.png -------------------------------------------------------------------------------- /Reverse/[HorkEye] 寻找Script封包密钥/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[HorkEye] 寻找Script封包密钥/image/2.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/[Malie] 寻找密钥 P1.md: -------------------------------------------------------------------------------- 1 | # [Malie引擎] 寻找密钥 P1 2 | 3 | 今天下午刚考完,也没什么事干,也没钱,只能在宿舍坐着了。 4 | 5 | 坐着也坐着,上KF看看,看到个帖子 求Campus 恋音セ・ピアーチェ的完整立绘 6 | 7 | https://kf.miaola.work/read.php?tid=980463&sf=fd2 8 | 9 | campus这个社的游戏还行啊,点开看看,好像还有好几个相关帖子,也是封包解不开的问题 10 | 虽然这引擎也见过好几次,但是也没认真看过,反正咱也不是汉化组的,没什么必要也不会去看。 11 | 12 | 好吧,那就看看吧,看帖子说Garbro解包不了,这个挺正常的,因为这引擎的封包都是单独密钥加密的,基本上每个游戏都不太一样,所以得手动找密钥,但是Garbro的作者也不知道是为什么考虑,设计游戏密钥都不公开明文,也很少会说怎么找密钥。 13 | 14 | ![1](image/1.png) 15 | 16 | 17 | 18 | ## 编译调试Garbro 19 | 20 | 因为Garbro有一部分campus社的游戏是可以解包的,因为作者已经导入密钥,反正现在也不知道怎么找密钥,先下一个Garbro在打开封包的地方下个断点看看密钥长啥样吧(对的虽然它不公开,但是调试的时候依然可以看到,打开Garbro的项目也可以看到有一个叫SchemeBuilder的项目被删了) 21 | 22 | ![2](image/2.png) 23 | 24 | 在编译和运行Garbro之前还会有Nuget包管理器的问题,参考以下两个链接解决 25 | 26 | https://stackoverflow.com/questions/57394869/missing-nuget-targets 27 | 28 | https://learn.microsoft.com/en-us/nuget/consume-packages/package-restore 29 | 30 | 解决完成之后就可以正常编译运行了。可能还会有什么鬼签名的问题,自己搜一下吧。 31 | 32 | ## 编译exdieslib 33 | 34 | exdieslib就比较简单了,用的是C++写的,只要到这里下.cpp即可,但是作者没提供as-util.h这个头文件,可以在FuckGalEngine的Minori/Minori/fuckpaz里找到一个。可能是FuckGalEngine项目作者自己写的。 35 | 36 | http://asmodean.reverse.net/pages/exdieslib.html 37 | 38 | https://github.com/Inori/FuckGalEngine/tree/master/Minori/Minori/fuckpaz 39 | 40 | 得到一个cpp和一个头文件,vs新建一个项目加进去就行了,不过exdieslib有好几个函数用的都是非标准c的函数,vs编译会报错,依据报错改过来就行了。 41 | 42 | ![3](image/3.png) 43 | 44 | exdieslib也能直接看到密钥啥样。 45 | 46 | ![4](image/4.png) 47 | 48 | ## 先看密钥! 49 | 50 | 先找到ArcLIB.cs这个文件,然后到找到151行,在foreach处下断点。然后GARbro.GUI为调试的目标程序,点击绿色三角运行即可。之后就是在GarbroGUI的窗口里找到封包双击打开,就断下了。 51 | 52 | ![5](image/5.png) 53 | 54 | 我选择的游戏是 Deep Love Diary -恋人日記- パッケージ版 这个是Garbro有内置密钥支持解包的,需要注意的是有时候Garbro自身残留配置文件,会导致无法识别游戏,进而没办法解包,即使内置密钥也不行。由于我懒得找Garbro的配置文件了,之前记得在用户文件夹的什么地方,后面忘了,反出现这种情况。直接把Garbro移动到别的文件夹或路径下就可以了。 55 | 56 | ok,准备就绪我们来看看密钥,在左下角的auto窗口可以看到KnownSchemes这个结构,点+展开,就能看到里面对应的游戏名和密钥了。和exdieslib是一样的,不过Garbro的密钥大小会少4*4个字节,不过一般都是00。 57 | 58 | ![6](image/6.png) 59 | 60 | 可以结合exdieslib来看,exdieslib里面明明白白的写出了密钥,用c语言写的结构也更清晰。 61 | 62 | 反正两个对着看,大概是看明白了密钥长啥样,至于封包结构,暂时还不要去理这个。 63 | 64 | ## 找一个看看 65 | 66 | 现在我们已经看到了,密钥是一张表,现在的问题是怎么找到这张表。很显然,我们先找一个Garbro或exdieslib里有密钥的游戏,我们先对着这个游戏找出一样的密钥即可,这个时候随便乱找也行,没准你乱搜还真能搜到。当然这边我就不去乱搜了,我稍微看了一下exdieslib和Garbro的解析,都会先去解析封包开始的一些字节,来判断封包的标头,是不是LIB字段,以此来确定目前使用的密钥是能够解密游戏的,然后用这个能解析出正确标头的密钥进行文件索引和数据内容的解密。 67 | 68 | 依据上述的特征,我准备开始下断点看文件头了,结果发现这个社好几个游戏都有Playdrm加壳,虽然这个加壳并没什么用,但是为了简化分析还是找了没壳又有现成密钥的。 69 | 70 | 最后我选择了 神咒神威神楽 超先行 体験版 是的体验版一般都没乱七八糟的加壳,比较好分析(按Tab) 71 | 72 | https://dlsoft.dmm.co.jp/detail/views_0363/ 73 | 74 | 本来想先断一下CreateFileA/W的,结果发现断下来都是没什么用的信息,那换成ReadFile,发现它第一次ReadFile就读取了0x1000的大小,并且刚好是文件头上还是的0x1000个字节,只能说来得正好,但是不确定的是为什么要读0x1000,而且每次都读0x1000,然后翻了下导入表,原来是有msvcrt,有c的库函数fopen和fread这些,现在换成断fopen,fread,发现正常了,第一次fread就打开了指定的封包,fread则是每次读取0x10个字节。 75 | 76 | 翻了下上面两个项目的源码,发现这东西是按块解密的,就是文件分成了很多十六个字节的块,一个个解密过去。看着可能是更这个有关,算了,别理他为什么,先给读到内存里的文件头上的第一个字节和第四个字节下硬件断点。 77 | 78 | ![7](image/7.png) 79 | 80 | 按F9运行,断下。 81 | 82 | ![8](image/8.png) 83 | 84 | 发现直接就对比文件标头了。这个时候IDA也一起打开来辅助分析。 85 | 86 | ![9](image/9.png) 87 | 88 | 按x查找引用返回上一层函数。发现这个函数,是用来打开文件的,后面会调用fopen,打开后返回的指针存储着打开文件的信息,像是句柄啥的。第二个参数模式,有LFIE_I,还有CFI这种,第一个是文件的相对路径。接着把获得的指针传给了另一个函数,这个函数则是调用fread从封包读取数据到buffer里。 89 | 90 | ![10](image/10.png) 91 | 92 | 大概整理一下,是这样的 93 | 94 | ![11](image/11.png) 95 | 96 | 第一次读取并校验的时候是不成功的,所以进入了第二次读取。第二次比较奇怪的地方是GetBlockHandle的模式变成了CFI,这次GetBlock读取进来的的封包前0x10个字节居然是已经解密了,直接就能看到LIB字段。由于GetBlock会调用fread,观察第二次读取的fread,发现依旧是0x10个字节,而是也是文件开头的0x10个字节,与第一次读取一样,说明这个GetBlock里面对文件标头进行了解密。 97 | 98 | 我们先对这次读进来的数据下硬件断点,F9运行。 99 | 100 | ![12](image/12.png) 101 | 102 | 发现fread刚刚返回就对读取进来的数据进行了位移操作,仅接着,在sub_4247F0函数运行后,观察这个函数的参数,发现数据已经解密了。继续观察这个函数,发现第二个参数就是密钥,虽然顺序有点不一样。 103 | 104 | ![13](image/13.png) 105 | 106 | 107 | 108 | 写一个程序把密钥顺序搞一下 109 | 110 | ```C 111 | #include 112 | 113 | int main(int argc, char* argv[]) 114 | { 115 | if (argc > 1) 116 | { 117 | unsigned long aKey[56] = { 0 }; 118 | 119 | FILE* fp = nullptr; 120 | errno_t err = fopen_s(&fp, argv[1], "rb"); 121 | if (err || !fp) return 0; 122 | 123 | fread(aKey, 1, 0xE0, fp); 124 | 125 | for (size_t iteLine = 0; iteLine < 14; iteLine++) 126 | { 127 | for (size_t iteEle = 0; iteEle < 4; iteEle++) 128 | { 129 | printf("0x%08X", aKey[(13 - iteLine) * 4 + iteEle]); 130 | if (!(iteLine == 13 && iteEle == 3)) putchar(','); 131 | } 132 | putchar('\n'); 133 | } 134 | } 135 | else 136 | { 137 | printf("KeyFormat.exe key.bin"); 138 | } 139 | 140 | system("pause"); 141 | } 142 | ``` 143 | 144 | Keyformat.cpp 145 | 146 | ![14](image/14.png) 147 | 148 | 由于我这个是按照exdieslib来的,所以要往上翻4*4个字节,这个上面16个字节一般都是0。 149 | 150 | 好了现在密钥就有了,不过还不清楚这个密钥表是怎么来的,直接搜索也找不到这个表,于是又跟踪了一下。 151 | 152 | 发现游戏自己搞了一个读取和打开封包的玩意,就是封装这两个函数。那个上面GetBlockHandle的MODE像是fopen这种的扩展,游戏还有自己的MODE,上面CFI,FILE什么的。在第二次GetBlock跟踪走了下图这个函数。,这个函数有个奇怪的参数,写死的,而是像是一段密码一样的字符串。 153 | 154 | ![15](image/15.png) 155 | 156 | 继续跟踪会发现这个参数进入了一个函数,类似之前的解密函数,第一个参数也是0x80 157 | 158 | ![16](image/16.png) 159 | 160 | 执行完毕后,第三个参数指向的buffer就变成了密钥的那张表了。 161 | 162 | ![17](image/17.png) 163 | 164 | 看来真正的密钥其实是:XogRr2FjLW0waAuW,经过这个函数运算就成了Garbo和exdieslib里的那个表。 165 | 166 | ## 加壳怎么找? 167 | 168 | 其实没啥关系,因为很多所谓的加壳,都没有虚拟化代码,也就是代码其实运行后都原封不动吐出来了,只是会加密IAT之类的。 169 | 170 | 不过因为加密了IAT我们就不能从导入表中直接对fread,fopen下断点了,这有关系吗?没有,完全没有,因为这两个函数也不是在exe里实现的。不过值得注意的是,有些壳会把fread和fopen重新定向到壳子内部,绕一圈,调用CreateFileW,fread则是调用ReadFile,或者有些程序干脆就把库函数一起编译进去了,这个时候我们只能从CreateFile来定位回去。 171 | 172 | 这边以 Deep Love Diary -恋人日記- パッケージ版 为例子展示一个在Playdrm加壳的情况下找密钥,当然前提你先破解,这个不多说。 173 | 174 | 为了节省篇幅就直说了,fread和fopen是断不下来的,我们直接断CreateFileW,(注意下,如果有反调试,记得装scyllahide) 175 | 176 | 看到有 0155EDF0 01996968 L".\\data\\data9.dat" 这种就说明游戏已经开始打开封包了。这个时候直接点返回用户区代码 177 | 178 | ![18](image/18.png) 179 | 180 | 然后在栈里往下翻,因为fopen一般都有一个mode参数,rb wb 什么的,往下翻就能看到,有好几个,可以到压入的返回地址,就是那个红色的,地址处看调用的地方,然后你可以看到这么个结构的代码。 181 | 182 | ![19](image/19.png) 183 | 184 | 对的,就是这里,这个引擎调用fopen的时候会进行宽字节到窄字节的转换。 185 | 186 | 那么00683B02 | E8 C6020100 | call malie3.693DCD | 其实就是fopen了。 187 | 188 | 我们在add esp 8下断点,等他返回。因为游戏没data9这个封包,返回值也是0,没关系,游戏会多次调用fopen,直到找到封包。 189 | 190 | 我们按F7单步返回上一层函数,返回到第二层的时候可以看到游戏的两个读取模式了LFILE,CFI,并且call 0x00687B60这个函数其实就是对比文件标头的,可以点进去看,这个位置其实就是我们刚刚的InitHeader那个函数一样的地方。 191 | 192 | ![20](image/20.png) 193 | 194 | 这个时候就很好办了吧。只要知道GetBlock这个函数就行了,不过这里运行后这个函数就退出了,因为data9这个封包没有,所有GetBlockHandle这个函数会失败,等读到data.dat封包的时候就好了。这个时候可以配合断下ReadFile,并在读取的数据上下硬件断点。和之前一样就能跟踪到解密的地方。 195 | 196 | 当然你说有没更快的方法呢?当然有了,还记得上面那个参数写死,也就是生成密钥表的函数吗?因为那个函数会对比模式,也就是rb wb r+b这种,所有我们直接运行游戏,等游戏跑起来,我们直接来到游戏这个模块,右键搜索该模块全部字符串。注意左上角的Module:malie3.exe你别搜到别的模块去了。直接搜索w+b 197 | 198 | ![22](image/22.png) 199 | 200 | 可以看到只有两个结果,找到这个push的。 201 | 202 | ![23](image/23.png) 203 | 204 | 是不是看到了熟悉的push 80,如果你返回这个函数调用上一层,或者看函数传进来的参数,你就能看到用于生成密钥表的密文 205 | 206 | ![24](image/24.png) 207 | 208 | ## 第一部分结束 209 | 210 | 说了一堆 恋音セ・ピアーチェ 这个游戏都还没开始解,我知道你很急,但是你先别急。 211 | 212 | 先讲到这,有点长了,有些新的Malie引擎的游戏会出现直接没有那个密文生成密钥的函数的情况。也就没办法直接获取密钥表了,这个下一节讲 :) 213 | 214 | -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/1.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/10.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/11.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/12.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/13.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/14.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/15.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/16.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/17.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/18.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/19.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/2.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/20.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/21.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/22.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/23.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/24.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/3.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/4.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/5.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/6.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/7.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/8.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P1/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P1/image/9.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P2/[Malie] 寻找密钥 P2.md: -------------------------------------------------------------------------------- 1 | # [Malie引擎] 寻找密钥 P2 2 | 3 | 接着P1开始讲 4 | 5 | ## 书接上文 6 | 7 | 找了几个16年以前的游戏,找密钥导入exdieslib编译解密,都没什么问题。 8 | 9 | 然后我准备找恋音セ・ピアーチェ的密钥,结果就出现问题了。 10 | 11 | 发现,在那个统一的接口上确实也和以前一样出现了那个写死的参数,也是一串奇奇怪怪的密文,我寻思跟着走到生成密钥的函数就行了,结果发现它并没有和之前一样有个生成密钥的函数了。并且虽然有这个参数,但是并没有去使用。 12 | 13 | 想着有点奇怪,而且这个游戏还是加Playdrm的,分析比较麻烦一点,就去看看体验版,确实有体验版,把体验版下了之后发现更奇葩了,体验版是和之前那些一样的,有生成密钥的函数,写死的那个参数也是有用的。这下就说明正式版和体验版可能用了不同的加密方法,至少形式不一样。 14 | 15 | 这里我们就换成 忘却執事と恋するお嬢様の回想録(メモワール)PKG版 16 | 17 | 由于这个也是加Playdrm的,还是和之前一样,直接ReadFile断下。等到ReadFile读取大小那个参数为0x1000的时候我们知道它就是在读取文件的前0x10个字节,然后判断是否为LIBP,注意下硬件断点的时候不要在buffer的第一个字节下,最好下在第四个字节处,因为第一个字节它别的函数会读一下,影响我们断在正确的位置。 18 | 19 | ![1](image/1.png) 20 | 21 | 第二次ReadFile的时候正确下断点,找到Copy出来的0x10个字节继续下断点,然后运行就会停在这个位置,对的,这个位置就是这个游戏的解密函数。 22 | 23 | ![2](image/2.png) 24 | 25 | 看着和原来的Camellia 加密有点像。这个函数我整理了一下 26 | 27 | ![3](image/3.png) 28 | 29 | 经过对几个相同加密的游戏对比发现aStaticTable是不变的。只有图上那四个一大串的数值会变化。 30 | 31 | 这个我已经接入exdieslib 可以在这里下到https://github.com/Dir-A/MalieTools 32 | 33 | 今天晚上写文章整理的时候发现Garbro也有实现这种加密的支持,Garbro里叫 MalieEncryption 34 | 35 | ![4](image/4.png) 36 | 37 | 如果给Garbro添加密钥也是可以支持这种版本的解密的,不过由于我水平有限,才学浅陋,只能点到为止,有能力的自己去添加吧。 38 | 39 | ## 总结 40 | 41 | 其实 Malie 这个引擎有两套加密方法,至少我目前看到的是这样, 42 | 43 | 第一套是 Camellia 多见于16年以前的游戏和游戏的体验版 44 | 45 | 第二套是 MalieEncryption 看着和 Camellia 有点像。 46 | 47 | 核心本质是,Malie的封包结构基本不变,只是在原有封包的基础上,对封包数据全部进行 Camellia 或者 MalieEncryption 的加密。 48 | 49 | 而且Malie通过套皮fread fopen 这些库函数实现了一个自己的文件系统,可以依据传入的MODE来切换加载加密封包和非加密封包亦或者不封包的文件。 -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P2/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P2/image/1.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P2/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P2/image/2.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P2/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P2/image/3.png -------------------------------------------------------------------------------- /Reverse/[Malie] 寻找密钥 P2/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Malie] 寻找密钥 P2/image/4.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/1.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/10.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/11.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/12.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/13.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/14.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/15.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/16.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/17.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/18.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/19.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/2.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/20.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/21.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/22.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/23.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/3.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/4.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/5.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/6.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/7.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/8.png -------------------------------------------------------------------------------- /Reverse/[Minori] 英文版引擎汉化处理/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Minori] 英文版引擎汉化处理/image/9.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/1.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/10.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/11.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/12.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/13.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/14.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/15.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/16.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/17.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/18.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/19.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/2.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/20.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/21.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/22.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/23.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/24.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/25.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/26.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/27.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/28.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/29.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/3.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/30.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/31.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/32.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/33.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/34.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/35.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/36.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/37.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/38.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/39.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/4.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/40.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/41.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/42.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/43.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/44.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/45.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/46.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/47.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/48.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/49.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/5.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/50.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/51.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/52.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/53.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/54.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/55.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/56.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/6.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/7.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/8.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 字体渲染分析/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 字体渲染分析/image/9.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/0.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/1.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/10.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/11.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/12.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/13.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/14.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/15.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/16.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/17.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/18.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/19.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/2.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/20.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/21.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/22.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/23.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/24.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/25.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/26.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/27.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/28.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/29.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/3.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/30.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/31.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/32.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/33.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/34.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/35.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/36.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/37.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/38.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/39.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/4.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/5.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/6.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/7.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/8.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 封包结构分析/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 封包结构分析/image/9.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/0.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/1.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/10.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/11.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/12-1.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/12.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/13.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/14.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/15.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/16.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/17.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/2.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/3.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/4.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/5.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/6.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/7.png -------------------------------------------------------------------------------- /Reverse/[PJADV] 文件系统分析/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[PJADV] 文件系统分析/image/9.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/1.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/10.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/11.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/12.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/13.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/14.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/15.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/16.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/17.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/18.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/19.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/2.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/20.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/21.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/22.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/23.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/24.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/25.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/26.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/3.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/4.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/5.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/6.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/7.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/8.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 封包接口Hook/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 封包接口Hook/image/9.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/[QLIE] 文件系统分析 [P1准备].md: -------------------------------------------------------------------------------- 1 | # [QLIE] 文件系统分析 [P1准备] 2 | 3 | 目标:[美少女万華鏡異聞 雪おんな](https://vndb.org/v44184) 4 | 5 | ## 前言 6 | 7 | 好几个月前有个人给提了个[issue](https://github.com/Dir-A/Dir-A_Essays_MD/issues/5),简单来说,就是想改QLIE的`.b`后缀格式的图片,这种格式应该是一种多格式捆绑在一起的图片封包,很久以前我见过一个工具 [bExplorer](https://github.com/Inori/FuckGalEngine/tree/master/QLIE/bExplorer/bExplorer) 应该是可以编辑的,叫他去试试,他说不行,他说是`美少女万華鏡異聞 雪おんな`,我猜应该比较新的版本,可能格式变了,而且我隐约记得这个 [bExplorer](https://github.com/Inori/FuckGalEngine/tree/master/QLIE/bExplorer/bExplorer) 似乎只能编辑图片数据,但b文件其实里面是有坐标,运动之类的数据的,也许改改它的源码是可以用的,但当时没什么时间,就没继续看了,想着后面找个时间把这个引擎大概逆一下。 8 | 9 | 网上可以找到一个叫[filepack](https://github.com/hz86/filepack)的工具,可以解包封包,它的源码我粗略看过,应该是IDA里直接扣的,一堆sub开头的函数,比较奇怪的是这工具居然可以封包回去,不知道是原程序里有算法扣出来的,还是重新写的,我也懒得看,能用就先用着,不过后来发现对于`美少女万華鏡異聞 雪おんな`比较大的封包就没办法解包了,不过Garbro可以,但Garbro毕竟没办法封包,但话又说回来,QLIE本来就可以不用封包,只需要改两个flag就可以从目录下读取了。 10 | 11 | 既然有工具了为什么还要逆呢?还是因为那个老问题,工具有,但过程没有,我个人是很不喜欢的,只要知道结构和算法,工具自己可以写,而且写好的工具有问题也可以自己修,但没结构和算法,写个工具放那,还要去猜写的啥,特别是大部分写的都不怎么样(),仅仅是能用的程度,一出问题你叫我修,真不如重新逆更快。 12 | 13 | 还是先网上搜一下,有没人写过类似的,可以发现有一篇文章 [超详细!解包某知名Galgame(万华镜5)引擎——Galgame汉化中的逆向](https://www.52pojie.cn/thread-1500700-1-1.html) 粗略看了下,还是觉得不对胃口,只有一些面向过程的分析,缺少对象层面的分析,让人有种咬着数据流debug的感觉,不过有写出来已经很不错了,毕竟这圈子,有留工具的,有留补丁的,就是没留分析过程的,不过也可以理解,详细的分析过程确实很难写,而且分析的时间也长,在花几天写过程,一般人也很难受得了。 14 | 15 | 分析是前几个月的事了(好了发这篇的时候又过了两个月),本来确实懒得写这篇文章的,因为这都快毕业了,逆向是真吃不了饭,C++项目又还没着落,现在每天都想着把基础库写好了,搞点不一一样的项目,方便面试,确实很忙,但想想分析了不写出来也蛮可惜的,就留个工具实在没什么意思。 16 | 17 | 那废话就不多说了,下面就进入正题。 18 | 19 | 20 | 21 | ## 准备 22 | 23 | ### 判断框架 24 | 25 | 要说逆向,还得看正向。所以在分析前,一定要搞清楚目标程序是什么架构的,不要上来就蛮干。 26 | 27 | 先用[Detect It Easy](https://github.com/horsicq/Detect-It-Easy)看看基本信息,可以发现QLIE其实是Delphi写的 28 | 29 | > 注意Delphi不是C/C++,但编译出来的东西其实也是Native的,其实就是带面向对象的Pascal,不过Pascal基本算是寄了,比较少人用了。 30 | 31 | ![](img/1.png) 32 | 33 | Delphi就要注意点了,毕竟不是C/C++,分析方法和技巧还是有点不一样的,可以去网上搜搜看Delphi逆向的一些技巧。 34 | 35 | 比如这个:[Tips For Analyzing Delphi Binaries in IDA (Danabot)](https://www.youtube.com/watch?v=04RsqP_P9Ss) 36 | 37 | ### 基本背景 38 | 39 | - Delphi的调用约定 40 | 41 | 简单来说Delphi的调用约定约等于FastCall,第一个参数是EAX,第二是EDX,第三个ECX,后面都是从栈传递,但栈传递的是顺序和cdecl stdcall是反过来的,其实倒不倒都无所谓,反正我们也没写过Delphi,不知道它源码是啥样的,只要知道参数是怎么传递就不影响分析了。 42 | 43 | 本来这里还想说一些坑点的,但这都还没开始逆你就知道了?太假了吧!还是后面再说吧! 44 | 45 | - 可以通过IDR恢复一些符号信息 46 | 47 | 通过IDR可以恢复Delphi程序的一些符号,也就一些函数名,包括函数参数的名称(包括标准库的和引擎自己写的),这里就得重提调用约定了,因为参数入栈顺序问题,所以IDR里标注是函数参数,并不是你在IDA里看到那个顺序,这个要注意。 48 | 49 | 基本上IDR能够恢复,函数名,函数参数名,类的成员函数和数据成员,类实例化的大小(字节数),还有个就是可以看到函数参数对应的寄存器或栈的偏移位置(当然这个功能有点奇葩,有些时候会调不出来,不过问题也不大,自己可以判断)。 50 | 51 | - IDA需要做一些设置 52 | 53 | IDA也需要调整一下,因为IDA默认会把可执行文件当成C/C++编译的,全部也是按照C/C++分析,一些Delphi的库函数它没办法识别出来,当然你会说不是有IDR恢复的符号吗?确实,IDR起到了不少作用,但有些符号IDR也是没办法恢复的,因为本来就没有嘛!而且如果你要去逆Delphi的库函数,会很痛苦,和C/C++的有一定的差别,特别是它调用WinAPI的时候由于调用约定不一样,还要转换,看着会很奇葩,所以最好让它识别,避免再去分析,浪费很多时间。 54 | 55 | ### IDR配置 56 | 57 | 由于是Delphi程序,可以借助IDR来提取部分符号,并辅助分析。 58 | 59 | 去Github把整个库Clone下来 [IDR](https://github.com/crypto2011/IDR) 60 | 61 | 然后把那一堆.bin复制到bin目录,那一堆7z也解压了丢进去![](img/2.png) 62 | 63 | ![](img/4.png) 64 | 65 | 好了,这样就可以开始用了,把主程序exe拽进去,运行,有个提示,点确定就好了 66 | 67 | ![](img/5.png) 68 | 69 | 等它分析完![](img/6.png) 70 | 71 | 分析完成后可以发现,有很多符号都恢复了![](img/7.png)从这个树状图,也可以读出不少信息,有类名,方法成员名,类实例化后的大小,甚至还有继承关系,和虚方法 72 | 73 | ![](img/8.png) 74 | 75 | 可以发现它们都是继承自TObject的,非常浓郁的OOP风! 76 | 77 | ![](img/9.png) 78 | 79 | 还可以把这些结构导出成C语言表示的结构体 80 | 81 | ![](img/10.png) 82 | 83 | 这样就把类的数据成员都还原了一部分,省了很多时间 84 | 85 | 在ClassViewer里找到方法成员,双击可以转到CodeViewer 86 | 87 | 在函数名上右键,选择Edit Prototype 88 | 89 | ![](img/11.png) 90 | 91 | 然后选择弹出窗口的Arguments选项,就可以看到函数参数对应的寄存器和栈偏移,到时候就可以从这里来确认参数 92 | 93 | 不过有些时候遇到传递当前函数的栈帧的调用约定,可能会导致IDR崩溃 94 | 95 | ![](img/12.png) 96 | 97 | 好了,IDR值得介绍的就是这些了,接下来要把信息导入到IDA中,因为IDR的反编译没那么好用 98 | 99 | 100 | 101 | ### IDR导出符号 102 | 103 | IDR可以导出多种文件,就个人实测,导出IDC,然后用导入到IDA里的效果是比较好的,其它可以自行尝试 104 | 105 | ![](img/13.png) 106 | 107 | ### IDA配置 108 | 109 | 由于是Delphi程序,需要对IDA进行一些配置 110 | 111 | 在IDA载入exe的时候把Analysis栏的Enabled和Indicator去掉(也就是暂时先不分析),然后点OK载入 112 | 113 | ![](img/14.png) 114 | 115 | 然后在Options里找到Compiler...选项 116 | 117 | ![](img/15.png) 118 | 119 | - Compiler改成Delphi 120 | 121 | - Calling convention 改成fastcall 122 | 123 | - 点OK保存 124 | 125 | ![](img/16.png) 126 | 127 | 在Options里找到General 128 | 129 | ![](img/17.png) 130 | 131 | 找到Strings选项 132 | 133 | - Default string literal type 改成 Delphi 134 | 135 | - 点OK保存 136 | 137 | ![](img/18.png) 138 | 139 | 再次Options里找到General找到Analysis选项 140 | 141 | - 重新勾选Analysis选项 142 | 143 | - 点击Reanalyze program 144 | 145 | - 点OK保存 146 | 147 | ![](img/19.png) 148 | 149 | 150 | 151 | 等待分析完成即可 152 | 153 | 154 | 155 | ### 导入IDC 156 | 157 | - File -> Script file... 158 | 159 | ![](img/20.png) 160 | 161 | ![](img/21.png) 162 | 163 | 等待IDC执行完成,可能会提示几个冲突,点OK就好了 164 | 165 | ![](img/22.png) 166 | 167 | 执行完成后,可以看到一些没办法导入的符号,自己记一下就好了(其实大部分没啥用,忽略即可)![](img/23.png) 168 | 169 | 导出成功后可以看到符号已经过来了,一些函数已经有名字了 170 | 171 | 函数定义可以在汇编窗口的函数头上看到(伪代码窗口看不到,没加这个注释) 172 | 173 | 访问数据成员也有显示对应的类型和名称(很重要,可以方便定位各数据成员) 174 | 175 | ![](img/24.png) 176 | 177 | 还有就是函数定义的参数顺序是不一样的(特别注意),也少了默认隐含的参数,所以这个注释是对不上的,想看完整定义最好去IDR里看 178 | 179 | ![](img/26.png) 180 | 181 | ![](img/25.png) 182 | 183 | 当然,肯定是没办法恢复全部符号的,所以接下来就要手动分析了 184 | 185 | > 还有一些部分可以依据需要调整 186 | > 187 | > - 在Views--Sub Views--Signature里添加bds,bds2007按照需求和实际识别到的函数 188 | >- 在Options中选择demangled names,在show demangled c++ names as 中选择name 189 | 190 | -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/1.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/10.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/11.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/12.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/13.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/14.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/15.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/16.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/17.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/18.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/19.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/2.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/20.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/21.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/22.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/23.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/24.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/25.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/26.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/27.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/28.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/29.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/3.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/30.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/31.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/4.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/5.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/6.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/7.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/8.png -------------------------------------------------------------------------------- /Reverse/[QLIE] 文件系统分析/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[QLIE] 文件系统分析/img/9.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/[Valkyria] 文件读取分析.md: -------------------------------------------------------------------------------- 1 | # [Valkyria] 文件读取分析 2 | 3 | 这里主要讨论目前最新版的Valkyria引擎,也就是目录下封包为data01-00.dat这种命名的 4 | 5 | 这里选用プレイ!プレイ!プレイ!ロック!为目标游戏进行分析 6 | 7 | 8 | 9 | ## 观察 10 | 11 | 首先观察一下封包,不难发现,除去开头4个字节外,每一个文件名的间隔都是268个字节,所以把每268字节看成一项,观察每一项的后8个字节,可以发现有offset--size的递推关系,可以猜测结构如下 12 | 13 | ```c 14 | struct VAL_Pack_Entry 15 | { 16 | char aFileName[260]; 17 | uint32_t uiOffset; // after index 18 | uint32_t uiSize; 19 | }; 20 | 21 | struct VAL_Pack 22 | { 23 | uint32_t uiIndexSize; 24 | VAL_Pack_Entry[uiIndexSize / sizeof(VAL_Pack_Entry)] 25 | // data.. 26 | }; 27 | ``` 28 | 29 | ![](img/1.png) 30 | 31 | 从这个角度上来看,其文件名是固定260字节长度的,但它并没有去清空写入,导致结构看起来很乱,实际上是很简单的 32 | 33 | ![](img/16.png) 34 | 35 | ## 脚本文件索引读取 36 | 37 | 还是断下CreateFileA/W,调试后第一个打开的封包是 data06-00.dat 位置在 0041DB1C (动态基址自己关) 38 | 39 | 对刚刚找到的位置进行反复调试分析(就是上上下下自己都摸索一遍,逻辑啥的自己看看,写文章这里没办法展开,而且这个引擎大量内联,一两句话很难说清楚,不过你认真看还是能看出来的) 40 | 41 | 可以发现这是一个读取脚本文件索引的函数,其函数原型如下 42 | 43 | ```c 44 | char __cdecl VAL::VFS::Script::ReadIndex( 45 | char *cpPackPrefix, // 封包前缀 如 data06-, data01- 46 | VAL_VFS_Entry *pVFSIndex_Ret, // 返回读到的索引表 47 | uint32_t *pScriptCount_Ret, // 返回索引表中的文件个数 48 | const char *cpScriptSuffix, // 搜索目标文件的后缀 49 | char nReadMod // 读取模式 50 | ) 51 | ``` 52 | 53 | 其逻辑大概如下 54 | ``` 55 | // count pack entry matching suffiix 56 | entry_count = 0 57 | for ifs : match(data06-*)[data06-01,data06-02,data06-03,data06-04....] 58 | { 59 | pack_index = ifs.read(ifs.read(4,beg),cur) 60 | for pack_entry in pack_index 61 | { 62 | for if suffix == '.sdt' 63 | { 64 | entry_count++ 65 | } 66 | } 67 | } 68 | 69 | // make vfs index 70 | vfs_index = new(entry_count * sizef(vfs_entry)) 71 | for ifs : match(data06-*)[data06-01,data06-02,data06-03,data06-04....] 72 | { 73 | pack_index = ifs.read(ifs.read(4,beg),cur) 74 | for pak_entry in pack_index 75 | { 76 | for if suffix == '.sdt' 77 | { 78 | cur_vfs_entry = vfs_entry.back() 79 | for vfs_entry in vfs_index 80 | { 81 | if pak_entry.flename == vfs_entry.filename 82 | { 83 | cur_vfs_entry(vfs_entry) 84 | } 85 | } 86 | cur_vfs_entry(pack_entry) 87 | } 88 | } 89 | } 90 | ``` 91 | 92 | 主要就是依据前缀`data06-`来匹配封包,先从`data06-00`的封包名尝试读取,接着是`data06-01`,依此类推 93 | 94 | 同一封包名的文件会打开两次,第一次是检查其中符合搜索后缀的文件数量,第二次是生成索引表,值得注意的是其会用封包序号更大的其中的文件来替换序号更小封包中的,也就是如果123.sdt文件同时位于 data06-00.dat data06-01.dat 那么会优先读取01里面的,其具体逻辑在165行。 95 | 96 | ![](img/2.png) 97 | 98 | ![](img/3.png) 99 | 100 | ![](img/4.png) 101 | 102 | ![](img/5.png) 103 | 104 | 105 | 106 | ## 脚本文件结点挂载 107 | 108 | 读取完成了索引,就开始挂载脚本文件了,这块的逻辑主要是生成一个脚本文件的链表,所有的脚本文件都挂在这个链表上,到时候虚拟机就从这个结构上读取需要的数据。 109 | 110 | ```c 111 | struct VAL_Script_Entry 112 | { 113 | VAL_Script_Entry *pNext; 114 | uint16_t uiID; 115 | uint16_t uiAlign; 116 | uint32_t* pData; 117 | uint32_t uiSize; 118 | uint32_t* pHdrSize; 119 | uint32_t* pLabelCount; 120 | uint32_t* pLabelIndex; 121 | uint32_t* pMsgCount; 122 | uint32_t* pMsgBuffer; 123 | uint32_t* pSeletCount; 124 | uint32_t* pSelectBuffer; 125 | }; 126 | ``` 127 | 128 | 读取脚本数据的时候会对脚本文件大小进行检测,以此来判断脚本是否被修改过,简单来说每一个sdt脚本文件头中都有一段校验数据,这段数据是游戏的debug_key和脚本大小混合加密后得到的,读取脚本的时候会尝试解密这个数据,来判断解密出来的debug_key是否和原来相等(如果你改了sdt文件的大小自然就不相等了),也就是下面的 aCheckData,这个长度是依据debug_key确定的。 129 | 130 | ```c 131 | struct SDT_Label 132 | { 133 | uint8_t aLabelName[??]; // end with '\0', enc-> xor 0xFF 134 | uint32_t uiLableRVA; // FOA = uiHeaderSize + uiLableRVA :004521B7 135 | }; 136 | 137 | struct SDT_HDR_Info 138 | { 139 | uint32_t uiHDRSize; 140 | uint32_t uiMsgCount; 141 | uint32_t uiSelectCount; 142 | uint32_t uiLabelCount; 143 | uint32_t uiCheckDataFOA; 144 | }; 145 | 146 | struct SDT_HDR 147 | { 148 | SDT_HDR_Info 149 | SDT_Label[SDT_HDR_Info.uiLabelCount] 150 | uint8_t aCheckData[uiHDRSize - sizeof(SDT_Label[SDT_HDR_Info.uiLabelCount])]; // end with '\0' 151 | }; 152 | 153 | struct SDT 154 | { 155 | SDT_HDR 156 | // Code 157 | }; 158 | ``` 159 | 160 | 161 | ![](img/6.png) 162 | 163 | ![](img/7.png) 164 | 165 | 上图这块的逻辑是 sg_bIsPack06Exist == 1 才会执行的,也就是但游戏检测到data06-00.dat封包存在的时候会走的分支 166 | 167 | 在其上会有个函数来检测各个封包是否存在,以此来设置全局的标志位来切换不同的封包读取目录,即从目录下读取还是从封包里读取 168 | 169 | ![](img/8.png) 170 | 171 | 自然而然的脚本封包的读取当然也有从目录下读取的对应逻辑 172 | 173 | ![](img/9.png) 174 | 175 | ![](img/10.png) 176 | 177 | 基本上来说是差不多的逻辑。 178 | 179 | 180 | 181 | ## 图片文件索引读取 182 | 183 | 不同于脚本的读取,图片的读取只读取目标文件的索引,而不是封包中全部索引都读取 184 | 185 | ```c 186 | char __cdecl VAL::Image::GetReadInfo( 187 | char isPackExist, // 是否存在封包 188 | const char *cpPackPrefix, // data03- data02- 189 | const char *cpFileName, // null.mg2 190 | CHAR *cpPath_Ret, 191 | _DWORD *pOffset_Ret, 192 | _DWORD *pSize_Ret) 193 | ``` 194 | 195 | isPackExist这个参数一般都传递刚刚 VAL::CheckPackExist 检测后保存的全部变量的结果 196 | 197 | 该函数依据isPackExist的值,会走不同的分支,合成不同的cpPath_Ret,也就是返回不同的目标路径 198 | 199 | ![](img/11.png) 200 | 201 | ```c 202 | char __cdecl VAL::Pack::GetReadInfo( 203 | char *cpFilePath0, 204 | char *cpFilePath1, 205 | _DWORD *pOffset_Ret, 206 | _DWORD *pSize_Ret, 207 | char nReadMod) 208 | ``` 209 | 210 | VAL::Pack::GetReadInfo 主要作用就是查询指定封包前缀下的各封包中是否存在目标文件,如果存在就会返回目标路径+偏移+大小 211 | 212 | ![](img/12.png) 213 | 214 | ![](img/13.png) 215 | 216 | 获得路径、偏移、大小后就可以调用图片加载函数 217 | 218 | ![](img/14.png) 219 | 220 | ![](img/15.png) 221 | 222 | 音频加载类似 223 | 224 | ## 总结 225 | 226 | 这个引擎也是可以原生免封包的,只不过不能原生单独一个文件免封包,但可以把文件全部解包出来,放在以封包前缀命名的文件夹里,然后移除封包,引擎就会从这个文件夹下读取文件,比如data06-00.dat,这个封包的前缀是data06- ,所以只需要解包,并创建一个名为 data06- 的文件夹,然后全部文件丢进去,并把data06-00.dat 移除就可以直接读取了。或者可以hook相关函数来直接控制。又或者可以直接把需要替换的文件打包成data06-01.dat也可以替换。 227 | 228 | 这个引擎内联太还狠了,代码很多都是一坨过渡内联的,看起来会比较恶心,不过总的来说没用什么复杂的结构,有点耐心还是可以解决的。 229 | -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/1.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/10.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/11.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/12.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/13.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/14.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/15.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/16.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/2.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/3.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/4.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/5.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/6.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/7.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/8.png -------------------------------------------------------------------------------- /Reverse/[Valkyria] 文件读取分析/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[Valkyria] 文件读取分析/img/9.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/10.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/11.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/12.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/13.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/14.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/15.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/16.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/17.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/3.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/4.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/5.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/7.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/8.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] SDK编译器调用/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] SDK编译器调用/image/9.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] Whirlpool社的一些观察/[YU-RIS] Whirlpool社的一些观察.md: -------------------------------------------------------------------------------- 1 | # [YU-RIS引擎] Whirlpool社的一些观察 2 | 3 | 对于原版的yuris引擎,只需要解包后对ybn进文本的导出导入,然后把SJIS范围的检查表改成GBK的即可 4 | 5 | 对于yuris来说CreateFont其实是默认依据系统判断的,一般都可以不用改。 6 | 7 | 8 | 9 | Whirlpool比较奇葩点,他们用的好像是改过的yuris引擎,ybn里不包含游戏的文本部分(这里说的是新版本啦) 10 | 11 | 他的文本直接就是纯文本格式的,放在 sc.ypf 封包里,解包后是scenario文件夹里面放了一堆txt 12 | 13 | 看着似乎更方便汉化,其实不然 14 | 15 | 16 | 17 | Whirlpool或者说是改过的yuris,其实有两种显示文本的方法 18 | 19 | 第一种 20 | 21 | 是调用Textout函数,在兼容DC上画字,然后贴图,它的Textout还比较奇葩,每次只画一个字符,貌似是全部画完后才贴图。 22 | 23 | 第二种 24 | 25 | 是封包里有个字体文件夹,里面其实都是图片,字符就在图片上,把图片上的字一个个切出来显示到屏幕上,这种其实在Gal引擎上也有一部分是这样实现的,一般Whirlpool官中就是这样搞的。 26 | 27 | 第一种可以说说,第二种其实没啥好讲的,要汉化只能改图片了,第一种看着就和正常yuris没啥区别,确实,没啥区别,但是Whirlpool搞了个很恶心的东西,就是字符的范围校验,之前的那个SJIS的表还在,但是Whirlpool额外还在脚本里写了校验的范围。超出范围的字符表现在游戏里就是直接不显示了,甚至还会强行停止解析,就是当你的字符串一行里某一个位置开始的字符超出了SJIS的编码范围,就会从那个位置直接停止解析后面的字符。所以即使你改了SJIS那个校验的表,也不能过范围校验,因为它后面还会校验一次,特别的傻呗,而且这种校验很难修改,因为不是直接写的汇编,而是通过yuris的虚拟机实现的,所以需要解析op(操作码),而yuris的脚本是编译的,就和我们exe里的二进制数据一样,只不过在win32下这些数据可以依据x86汇编解析,yuris那种要解析就得逆向yuris虚拟机了。 28 | 29 | 30 | 31 | 对此,我们有两种对策 32 | 33 | **对策一**:硬刚虚拟机 34 | 35 | 就是直接硬刚,yuris的虚拟机,找到对应的ybn文件(脚本),然后改掉。由于我水平低下,刚了一天也没刚下来,虚拟机这种东西特别的恶心,很难调试。 36 | 37 | 一开始我对字符串进行了跟踪,对所有读取目标字符串的的操作都进行了跟踪,但是跟到后面就不知道跑哪去了,这玩意会对字符串进行多次的复制和取字符串取单字节到处复制,非常傻呗,反正这个方法没搞定。 38 | 39 | 尝试摸索范围,由于超过范围后字符在游戏里会直接不显示并停止解析下一个字符,我尝试摸索出了范围,和SJIS的范围是一致的,也就是 0x81-0x9F,0xE0-0xFC 既然有这个范围那么典型的来说,必然有cmp xx,0x81这种东西,而且0x81,0x9F,0xE0, 0xFC如果没有各种位移异或应该就是直接躺在脚本里的某个位置的。了解了这个情况,开在脚本里摸索。一般的这四个值肯定不可能挨在一起,中间应该会隔有操作码,ybn文件也太多了,搞不懂从哪个开始看,其实跟踪虚拟机也是可以定位到相应脚本的,不过太麻烦了,于是想了个办法。 40 | 41 | 首先正确提取并解密全部ybn,然后全部合并成一个文件,可以直接用bat批处理,挺快的 42 | 43 | ```bat 44 | copy /b "%~dp0"\*.ybn "%~dp0"\new.ybn 45 | ``` 46 | 47 | 然后搜索一下边界那些常量,下面这段代码是有问题的,会越界,反正就随便搜一下,乱写了。 48 | 49 | ```C++ 50 | //原理很简单,先一个个字节搜索0x81,找到后从这个位置搜0x9F,找到后搜0xE0以此类推 51 | //searchSize就是搜到0x81往下找0x9F的长度,因为0x81-0x9F这两个之间的距离我们是不确定的 52 | //searchSize尽量在20以内,大了没意义,而且搜索结果很多。 53 | void FindRange() 54 | { 55 | std::ofstream oFile("1.txt"); 56 | std::ifstream iFile("new.ybn", std::ios::binary); 57 | size_t szFile = GetFileSize(iFile); 58 | unsigned char* pBuffer = new unsigned char[szFile]; 59 | iFile.read((char*)pBuffer, szFile); 60 | 61 | size_t searchSize = 20; 62 | 63 | for (size_t i = 0; i < szFile; i++) 64 | { 65 | if (pBuffer[i] == 0x81) 66 | { 67 | for (size_t j = 0; j < searchSize; j++) 68 | { 69 | if (pBuffer[i + j] == 0x9F) 70 | { 71 | for (size_t x = 0; x < searchSize; x++) 72 | { 73 | if (pBuffer[i + j + x] == 0xE0) 74 | { 75 | for (size_t y = 0; y < searchSize; y++) 76 | { 77 | if (pBuffer[i + j + x + y] == 0xFC) 78 | { 79 | oFile << std::hex << (i + j + x + y) << std::endl; 80 | i = i + j + x + y; 81 | } 82 | } 83 | } 84 | } 85 | } 86 | } 87 | } 88 | } 89 | oFile.flush(); 90 | } 91 | ``` 92 | 93 | 用改代码对 **pieces/渡り鳥のソムニウム** 的ybn进行搜索,可以找到yst00054.ybn在file offset:0x30D0处,是符合的,对二进制数,进行一定的断行,就真像是那么回事,不过由于没有对yuris虚拟机进行仔细的逆向分析,这里面的操作码都看不懂,只有0x81 0x9F这些是实实在在的。 94 | ```c++ 95 | unsigned AnsiChar data[56] = { 96 | 0xFC, 0x0A, 0x57, 0x02, 0x00, 97 | 0x81, 0x00, 0x5A, 0x00, 0x00, 0x48, 0x03, 0x00, 0x40, 0xFC, 0x0A, 98 | 0x57, 0x02, 0x00, 99 | 0x9F, 0x00, 0x53, 0x00, 0x00, 0x26, 0x00, 0x00, 0x48, 0x03, 0x00, 0x40, 0xFC, 0x0A, 100 | 0x57, 0x02, 0x00, 101 | 0xE0, 0x00, 0x5A, 0x00, 0x00, 0x48, 0x03, 0x00, 0x40, 0xFC, 0x0A, 102 | 0x57, 0x02, 0x00, 103 | 0xFC, 0x00, 104 | 0x53, 0x00, 0x00, 0x26 105 | }; 106 | ``` 107 | 108 | 不管那么多,先把9F改成0xFE FC改成0xFE看看效果 109 | 110 | 把exe的SJIS校验表改了,然后改一下文件读取顺序,变成可以免封包读取txt文件,然后修改一下txt文件的内容。更改修改的ybn文件也放到目录下ysbin文件夹里(ybn记得xor会去) 111 | 112 | ![图1](image/1.png) 113 | 114 | ![图2](image/2.png) 115 | 116 | 可以看到汉(0xBABA)这个字出来了,但是后面的字符都没了,汉这个字的GBK已经是超过SJIS原来的边界了,不过至于为什么这里也会出问题,你可能会说是判断了第二个字节,其实不是,或第二个字,其实也不是,这里只有第一个字解除了限制可以出来,只要是GBK里的都行,但是后面第二个字符只有写SJIS范围内的才能出来,否则就像图上那样。可能还有地方限制了范围,但是没找到。 117 | 118 | [Notes.txt](https://github.com/arcusmaximus/VNTranslationTools/blob/main/VNTextPatch.Shared/Scripts/Yuris/Notes.txt) 后面搜到了这个东西,有人取逆了虚拟机和大部分文件结构,照着解析了一下脚本 119 | 120 | ```c++ 121 | 48030040 FB0A pushscalarvar FB0A 122 | 4201005F pushint8 0x5F 123 | 3D0000 equal 124 | 48030040 FF0A pushscalarvar FF0A 125 | 420100 5E pushint8 0x5E 126 | 48030040 FB0A pushscalarvar FB0A 127 | 420100 2E pushint8 0x2E 128 | 3D0000 equal 129 | 48030040 FF0A pushscalarvar FF0A 130 | 420100 5F pushint8 0x5F 131 | 48030040 FC0A pushscalarvar FC0A 132 | 570200 8100 pushint16 0x8100 133 | 5A0000 ge 134 | 48030040 FC0A pushscalarvar FC0A 135 | 570200 9F00 pushint16 0x9F00 136 | 530000 le 137 | 260000 logand 138 | 48030040 FC0A pushscalarvar FC0A 139 | 570200 E000 pushint16 0xE000 140 | 5A0000 ge 141 | 48030040 FC0A pushscalarvar FC0A 142 | 570200 FC00 pushint16 0xFC00 143 | 530000 le 144 | 260000 logand 145 | 7C0000 logor 146 | 48030040 FF0A pushscalarvar FF0A 147 | 420100 60 pushint8 0x60 148 | 48030040 FB0A pushscalarvar FB0A 149 | 420100 22 pushint8 0x22 150 | 3D0000 equal 151 | 48030040 FF0A pushscalarvar 152 | 420100 16 pushint8 0x16 153 | 48030040 FB0A pushscalarvar 154 | 420100 20 pushint8 0x20 155 | 3D0000 equal 156 | 157 | ``` 158 | 159 | 没看出什么名堂,由于最近又一堆考试和课,这里就没继续研究下去了,做一个记录,就此打住。 160 | 161 | 162 | 163 | **对策二**:映射码表 164 | 165 | 之前提到Textout那个函数是一个个字符输出的,其实可以搞一个映射,原理很简单,我们在SJIS范围内重新给汉字编号,然后Hook Textout这个函数,比如传入这个函数的是 0x8130 我们就查一下自己的表看看这个是不是要映射,比如表里记录了 0x8130 -> 0xBABA 那么我们就把BABA覆盖进去就好了。当然还有一种是直接改字体的也行。这个后面有空我会写一个放上来。 166 | 167 | 168 | 169 | **对策三**:直接看答案 170 | 171 | 之前有些大佬逆过了,给出了关键点,直接搜索以下特征码即可。 172 | ``` 173 | C1 E0 08 ?? ?? ?? ?? ?? ?? 99 E9 174 | ``` 175 | 176 | ```asm 177 | 00455B23 | E9 0DF9FFFF | jmp pieces.new.455435 178 | 00455B28 | C1E0 08 | shl eax,8 179 | 00455B2B | 0FB64A 01 | movzx ecx,byte ptr ds:[edx+1] 180 | 00455B2F | 03C1 | add eax,ecx 181 | 00455B31 | 99 | cdq 182 | 00455B32 | E9 40F9FFFF | jmp pieces.new.455477 183 | ``` 184 | 185 | 改成 186 | ```ASM 187 | 00455B23 | E9 0DF9FFFF | jmp pieces_crack1121.new.455435 188 | 00455B28 | 66:B8 009F | mov ax,9F00 189 | 00455B2C | 90 | nop 190 | 00455B2D | 90 | nop 191 | 00455B2E | 90 | nop 192 | 00455B2F | 90 | nop 193 | 00455B30 | 90 | nop 194 | 00455B31 | 99 | cdq 195 | 00455B32 | E9 40F9FFFF | jmp pieces_crack1121.new.455477 196 | ``` 197 | 198 | ax里面的数值只要是SJIS范围内的都行啦,不限于0x9F00,写eax也行啦。 199 | 200 | 最后JMP会去的地方往上看也能看到SJIS那个编码检查的表,所以改这个也还要改SJIS的检查表。 201 | 202 | -------------------------------------------------------------------------------- /Reverse/[YU-RIS] Whirlpool社的一些观察/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] Whirlpool社的一些观察/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] Whirlpool社的一些观察/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] Whirlpool社的一些观察/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 中文路径无法运行/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 中文路径无法运行/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 中文路径无法运行/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 中文路径无法运行/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 中文路径无法运行/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 中文路径无法运行/image/3.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 中文路径无法运行/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 中文路径无法运行/image/4.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 免封包处理/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 免封包处理/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 免封包处理/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 免封包处理/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 免封包处理/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 免封包处理/image/3.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 免封包处理/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 免封包处理/image/4.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 寻找脚本密钥/[YU-RIS] 寻找脚本密钥.md: -------------------------------------------------------------------------------- 1 | # [YU-RIS引擎] 寻找脚本密钥 2 | 3 | ## 0x00 背景 4 | 5 | 在寻找密钥之前来了解一下yuris的脚本 6 | 7 | yuris的脚本一般放在一个叫bn.ypf or ysbin.ypf 的封包里。有兴趣了解结构的可以看看这个链接 [GarBro](https://github.com/morkt/GARbro/blob/master/ArcFormats/YuRis/ArcYPF.cs) 说白了,里面就是一堆zlib压缩的文件,可以搜到zlib压缩的文件头特征。 8 | 9 | 这个封包里其实都是一些编译后的文件,相当于你写的C++程序编译成了exe,并不是明文,里面也有几种文件格式(看文件头),有兴趣的看这个链接 [Notes.txt](https://github.com/arcusmaximus/VNTranslationTools/blob/main/VNTextPatch.Shared/Scripts/Yuris/Notes.txt)。 10 | 11 | 游戏的文本一般在ystXXXXX.ybn文件里,除了一些魔改过的,比如Whirlpool社新版本的yuris,它的文本是在一个sc.ypf的封包,文本全是明文,后缀是.txt,注意这只是文本,脚本其实还是在ybn里编译过的。(一般右键属性-详细里,版本号大于0,477的属于比较不一样的新版本,不过除了文件格式有一些差别,其实汉化的方法是差不多的,除了那些魔改过的版本 比如:比如Whirlpool社新版本的yuris)。 12 | 13 | 在yst_list.ybn文件里还能看到一些编译之前的 .txt .yst之类的文件名,这些文件其实没编译之前是明文的,可以去yuris的官网下一个来看看。 14 | 15 | 游戏的标题一般在 yscfg.ybn 这个文件里,当然这里面还有很多有意思的东西,不限于此。 16 | 17 | ## 0x01 加密明辨 18 | 19 | 了解完了,上面这些,我们就来看看怎么解这个脚本,你可以找一些现成的工具,当然也可以自己按照文件结构解包。不管怎么样,首先得了解的是,正常如果你自己按照文件结构来解包,用zlib解压后可以得到原始的ybn文件,当然ybn只是一个后缀,里面有多种文件头的文件,假设你是自己解出来的,这时候你可以看到文件头,但是文件的内容如果你自己翻翻,其实是加密过的,不像是明文,但是可以看到一堆像是大段文本的东西。 20 | 21 | 当然这样的才是游戏正常读进去的文件,也就是说,你把你自己解出来的文件,放到ysbin文件里,游戏是可以正常读取的。 22 | 23 | 当然大多数时候,我们可能用的都是三方的工具,比如Garbro,这些工具,有些会套用默认的密钥尝试在解包后继续对文件进行解密,有些时候成功,有些时候失败,这就导致解包出来的文件出现了,有些是完全解密的,有些原始文件的情况。游戏引擎只会机械的读取文件,进来后解密,所有如果你的解包工具帮你解密的文件,那么再放入ysbin的时候游戏就会把已经解密的文件当成没解密的文件进行解密,然后就boooooom,崩溃了!!!! 24 | 25 | 怎么判断有没解密文件,很简单,解包后按文件大小筛选,找到最大的文件,用winhex调到sjis编码,随便翻翻看看,能看到大段的游戏文本说明解密了,或者能看到一些英文单词啥的,当然你也能看到一些游戏菜单或人物名的字符串。如果都看不到,那就说明没帮你解密,当然最简单的是直接放到游戏目录下跑一下就知道了。 26 | 27 | ## 0x02 找密钥前传 28 | 29 | 早前我在某论坛发过一篇找破解某收费汉化组游戏的帖子,那个游戏恰好就是yuris的,而且那游戏已经打不开了,因为汉化组被绳之以法,想破解还真没那么简单,这东西就像是7z压缩包加密码了,除非硬算,或能进一次游戏,不然基本很难破解了。 30 | 31 | 当然由于一些加密工具的漏洞,我得到了游戏的ybn文件,但是ybn文件是加密的,就像是上面那样,看不到明文。但是你也进不去游戏,因为汉化组被绳之以法,加上汉化组还特意改了游戏的解密密钥,所以和日文版是不一样的。 32 | 33 | 那最后我是怎么解决的呢?其实很简单,我看了下网上yuris的ybn的加密方法,无非就是xor,它有一个长度固定的密钥,比如 0x99609960 好了,然后用这个密钥对ybn文件跳过文件头xor即可。如果它刚好对一段0x00000000进行了xor,那么它的密钥就写在脸上。所以我找到了日文版的游戏,找到里面ybn文件有大块00的地方(其实基本ybn文件开头都有大块00的地方,没有的话就四处拼接一下),直接读出了密钥。 34 | 35 | 这个故事也告诉我们,ybn的解密密钥是可以直接读出来的。 36 | 37 | 当然,由于我们是可以正常打开游戏的,所以就没必要这样了,等下找到密钥了,可以自己去读一个试试 38 | 39 | 40 | 41 | ## 0x03 开找! 42 | 43 | 这引擎找密钥就很套路了 44 | 45 | 第一步 46 | 47 | 搜索字符串 48 | 49 | ``` 50 | ysbin\yst%05d.ybn 51 | ``` 52 | 53 | 必然有这个,我还没见过没有的。这个看着就是一种格式化字符串的写法(sprintf)。 54 | 55 | 来到对应位置下断点 56 | 57 | ![图1](image/1.png) 58 | 59 | 看下面红色箭头指向的地方,有个jl往回跳了,这其实是一个循环,还可以看到里面有个很明显的xor字眼。 60 | 61 | ```ASM 62 | 0043690C | 33D2 | xor edx,edx 63 | 0043690E | 83C1 01 | add ecx,1 64 | 00436911 | 8BFA | mov edi,edx 65 | 00436913 | 83E7 03 | and edi,3 66 | 00436916 | 0FB687 2C876B00 | movzx eax,byte ptr ds:[edi+6B872C] 67 | 0043691D | 83C2 01 | add edx,1 68 | 00436920 | 3041 FF | xor byte ptr ds:[ecx-1],al 69 | 00436923 | A1 78886B00 | mov eax,dword ptr ds:[6B8878] 70 | 00436928 | 8B04A8 | mov eax,dword ptr ds:[eax+ebp*4] 71 | 0043692B | 3B10 | cmp edx,dword ptr ds:[eax] 72 | 0043692D | 7C DF | jl magustale.43690E 73 | ``` 74 | 75 | 这一句 movzx eax,byte ptr ds:[edi+6B872C] ,这个6B872C其实就是密钥的地址,跳到这个地址就可以读出密钥了,当然你实在不会就按f8跑,让他循环几下,然后你观察各个寄存器,eax ebx啥的,可以发现有一个寄存器是在四个数之间循环读取的。 76 | 77 | 当然这其实还不是密钥的产生地点,也就是说,这里的密钥是复制过来的,如果你关掉游戏,再次来到这个地址,发现这个地方是空的。 78 | 79 | 那么如何定位密钥的产生地点呢?其实很简单,先关掉游戏,来到入口点,对这个地址下一个硬件访问断点、 80 | 81 | DWORD或BYTE都行啦,然后跑一下,会来到这个位置 82 | 83 | ![图2](image/2.png) 84 | 85 | 可以看到它把EAX的值,一个个搬过去了,其实这个EAX的值就是密钥啦。如果你再对上面那个call下一个断点,你会发现,这个`Yu-ris`传进去计算出了一个密钥放到eax里。其实这个密钥也是最经典的yuris脚本的密钥。如果你把`Yu-ris`改掉,密钥也自然就不一样了。 86 | 87 | 这里也就可以做一下手脚了,如果你把这些搬运密钥的操作都nop掉,最后密钥就变成了0x00000000,对0 xor还是原来的数,那么这个时候你把解密的文件放到ysbin游戏目录下就可以正常跑了,当然,原来加密的就寄了。适合有些时候不想xor回去的情况。 88 | 89 | 以下是新版本的,大同小异,当然新版本就不能直接读取ysbin目录了,得稍微改一下,以后再说。 90 | 91 | ![图3](image/3.png) 92 | 93 | ![图4](image/4.png) 94 | 95 | -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 寻找脚本密钥/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 寻找脚本密钥/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 寻找脚本密钥/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 寻找脚本密钥/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 寻找脚本密钥/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 寻找脚本密钥/image/3.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 寻找脚本密钥/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 寻找脚本密钥/image/4.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/[YU-RIS] 收费组补丁破解之Kiss&Crisis.md: -------------------------------------------------------------------------------- 1 | # [YU-RIS引擎] 收费组补丁破解之Kiss&Crisis 2 | 3 | 以前发的贴,转到Github保存一下,略有改动。2022年05月29日 04点27分 4 | 5 | ------ 6 | 7 | 今天整理文件的时候,看了下YU-RIS的YSTB 文件的解密算法, 8 | 突然想到之前屋子的马甲 `胖次汉化组` 9 | 这个组之前屋子没被抓的时候,有个网站,挂了一些他们的焊化补丁 10 | 屋子那个是要付费才能下载的,这个是可以直接下载,下载后要买激活码才能进去 11 | 12 | ------ 13 | 14 | 当然了,这种能直接下载的一般都是白给,但是后面他们换了加密,没有之前的漏洞了,不过有几个游戏没换的 15 | 当然了老的加密直接bypass也是有点难的,我就直接利用他们老加密的漏洞,把汉化的文件提取出来,程序自己处理一下就好了。其实如果有老弟买了的话,能直接进游戏会方便很多。 16 | 17 | ------ 18 | 19 | 这里处理一个**Pure More** 社的,叫:**Kiss & Crisis** 20 | 我没破,因为是YU-RIS的,这引擎我没怎么研究过,当时dump完文件,发现密钥和原来的游戏不一样,就放着没看了,因为加壳,验证的时候,解密的只有壳和验证程序的代码,很难去找密钥。 21 | ![1](image/1.png) 22 | 23 | 今天傍晚看了下YSTB的加密,就是简单的xor,xor?哦?那岂不是不用密钥了? 24 | 毕竟我有日文版的文件,肯定不可能全部脚本都改掉 25 | 26 | **原文件 ---->xor{key} ---->加密文件** 27 | 28 | 按照这个思路,我甚至能读出密钥 ヽ(✿゚▽゚)ノ 29 | 30 | ------ 31 | 32 | 首先到日文版的exe里找了下YSTB的密钥 **0xEA04A545** 33 | 然后找个老的工具,提取**ysbin.ypf**搞出原始**加密的ybn** 34 | 然后可以直接用**GarBro**来提取出**解密的ybn**,**GarBro**支持猜密钥( 35 | 注意看上下两个文件,一个是加密的,一个是解密的 36 | 除去signature,盯着00看,图中红框两个,后面00 00(这加密是四位的) 37 | 很显然这个xor{key}的后两个就是 **A545** ,那么前两位呢? 38 | ![2](image/2.png) 39 | 40 | ------ 41 | 42 | 别急我们再往下翻,看有个居然是 **00 00 00 00** , 43 | 说明,这个对应上面的加密文件,就是我们的密钥啊! **0xEA04A545** ┌(。Д。)┐ 44 | 好了,到这就分析完成了,如何从原文件到加密文件读出密钥,接着迁移到屋子那个文件上看看。 45 | ![3](image/3.png) 46 | 47 | ------ 48 | 49 | 还是那个位置,我们打开dump好的屋子的文件。读出密钥为 **0x94114514** (°ー°〃) 居然这么简单? 50 | 当然这个位置焊化的文件可能变了,xor后就不是密钥了,那么我们可以找多处 **00 00 00 00** 的地方来比对 51 | 总之一番操作后,确定密钥就是这个了,接下来就简单了,先decrypt然后用原游戏的密钥xor回去 52 | ![4](image/4.png) 53 | 54 | ------ 55 | 56 | 当然了,这个时候还得结合一下汉化yuris的经验,读取封包,校验表改掉,放入ybn文件 57 | 启动!芜湖,完美(当然了,这只是想象的,实际上我还改了一堆东西T_T 58 | ![5](image/5.png) 59 | -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/3.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/4.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之Kiss&Crisis/image/5.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/[YU-RIS] 收费组补丁破解之ペトリコール.md: -------------------------------------------------------------------------------- 1 | # [YU-RIS引擎\] 收费组补丁破解之**ペトリコール -Petrichor-** 2 | 3 | 以前发的贴,转到Github保存一下,略有改动。2023年5月30日 4 | 5 | 从床上爬起来看了看手机,伦敦时间5点44,差不多快6点了,自律的人应该起床了。 6 | 起来热了下饭菜,打开YouTube看看台媒下饭。 7 | 边吃边看,然后在群里吹逼了几句,到七点半了。 8 | 9 | 然后打开了昨天下的里番开始导管 10 | 混账,自律的人怎么能天天导管呢?最近导的平凡了,一天十几次,所谓暴食斯英语。 11 | 自律的我必须找点事情干(今天)! 12 | 13 | 想起KF好像有人发了个汉化,还没看有没加密 14 | 哎,反正也没事干,看截图大概是没加密,那先下一个看看吧。 15 | 下来一看,好像是没加密,就是exe大小有点不对劲,然后看着是打的原封包 16 | 那Garbro解包看看,发现Garbro解包不了,这个情况想起来之前还有个屋子的补丁没破。 17 | ![img](image/1.png) 18 | (图裂了?因为是Github的链接,所以你得开代理小老弟:)) 19 | 20 | 屋子的补丁是一个叫 ペトリコール -Petrichor- 的游戏的,也是yu-ris引擎 21 | 我之前也破过一个屋子的同样的yuris引擎的游戏 22 | 不过那个就一个难点猜密钥,而且文件也没封包,直接就是解包后的文件,猜出密钥就秒杀了 23 | 这次有点不一样,封包了,而且还解包不了。当然最主要的情况是因为我不能运行这个游戏 24 | 如果可以运行那就几秒的事,因为屋子已经挂了,跑不起来就只能摁住猜了。 25 | ![img](image/2.png) 26 | 27 | 那个屋子补丁也是Garbro解不了,然后对着YPF的文件格式自己人肉解析了一下,发现原始数据开头是5A 28 | 对于zlib压缩的文件而言,那必不可能是5A,一般是7x多少,当然我也是不什么密码学专家 29 | 他这样一改,我有点玉玉了,你改这还能不能好好玩了,然后一直也没猜出是个什么加密方法。 30 | 如果他整体xor一层,我感觉这辈子都猜不出来了,何况可能还换了压缩的方法,而且yu-ris的脚本本身就有一层xor。 31 | 屋子是必然改了,因为汉化不可能全部文件都修改,但是xor密钥一改,全部文件都不一样了,想通过日文版的来对比 32 | 基本没戏。但是我发现其中一个yscfg文件把5A改成78后是可以正常被zlib解压的。 33 | 反正后面就研究到这就放硬盘里了,没啥思路,想着逆向不就这样,大起大落罢了,不如继续导管。 34 | ![img](image/3.png) 35 | 36 | 当然上面说的是之前的事情,看到这个情况脑子里一闪而过,现在我们继续看KF这个新发的汉化补丁。 37 | 既然Garbro解不了,还是报zlib的问题,说明是死在了解压上,那就看看汉化的exe吧。 38 | 看了下发现是upx,这个简单,学过脱壳的第一课应该就是脱这个,脱壳后发现exe有点小,怎么才2mb左右 39 | 比日文版的小了,1mb左右,嗨别理他,再查看一下有没别的壳,看样子是没有。 40 | 41 | 上手x64dbg调试一下,由于最近在更新YU-RIS引擎的相关教程,这个还是得心应手的,随便翻一下找到解压的地方看看。 42 | oh,一看到这个解压函数被套了一层,到这就水落实出了,再看看它的原始数据,oh,这个更是惊喜不断 43 | 看着这个数据的头几个字节和屋子那个简直是一模一样。我赶紧在一堆导管资料里翻出了屋子那个补丁。 44 | 45 | ![img](image/4.png) 46 | 47 | ![img](image/5.png) 48 | 经过对比我发现该新汉化补丁,实际上还是zlib压缩,只是头3个字节xor了一个数,然后偏移4个字节xor了文件的大小(压缩大小)。 49 | 当然到这个只是解决了这个补丁搞的东西,屋子那个还没看。 50 | 51 | 我想着如果是一样的话,屋子那个封包复制过来加载一下看看?跟踪了一下,结果在这个程序里的加密方法运算后确实头一个字节变成了0x7x 52 | 感觉有点希望,后面调用解压函数的时候倒是出错了,看来还是有点问题啊,你也很难保证这两是一样的吧,没准人家就喜欢5A开头呢? 53 | 54 | 经过反复对比我发现,只要把这个新汉化补丁里的对头3个字节xor的密钥 0x0040FB22 改成 0x0040BF22 就可以成功被zlib解压了。 55 | 56 | 赶紧起手写个程序把屋子那个文件处理一下,最近又降温,写的手有点哆嗦,也有可能是导多了。 57 | ![img](image/6.png) 58 | (你看导多了吧,不delete也不close) 59 | 60 | 处理完成后对原始数据用zlib解压,轻松得到YSTB文件,接着用之前为了讲YU-RIS教程写的猜密码和解密工具处理一下 61 | 62 | ![img](image/7.png) 63 | winhex看看效果 64 | 65 | ![img](image/8.png) 66 | ok轻松秒杀。 67 | 68 | 接着对日文版处理一下,把这个汉化文件搞上去,又是一个好补丁(焊化+1) 69 | 70 | ![img](image/9.png) 71 | 72 | 最后总结一波 73 | 74 | ```C 75 | #赤红幻境汉化组 -> CH 76 | #日文原版 -> JP 77 | #胖次汉化组(屋子) -> WZ 78 | #原始数据(即未解压未解密数据) -> RAW 79 | 80 | #日文版密钥 -> 0xC41386F5 81 | #屋子版密钥 -> 0x75F74413 82 | 83 | ----- First Four Bytes Of Raw Data ----- 84 | JP_RAW = 0x78DAXXXX 85 | WZ_RAW = 0x5A65XXXX 86 | CH_RAW = 0x5A21XXXX 87 | 88 | ----- Encryption Algorithms CH ----- 89 | CH_RAW + 0 xor DWORD 0x0040FB22 90 | 91 | CH_RAW[0] xor 0x22 = 0x78 92 | CH_RAW[1] xor 0xFB = 0xDA 93 | CH_RAW[2] xor 0x40 = ? 94 | CH_RAW[3] xor 0x00 = CN_RAW[3] 95 | 96 | CH_RAW + 4 xor DWORD szFile 97 | 98 | ----- Encryption Algorithms WZ ----- 99 | WZ_RAW + 0 xor DWORD 0x0040BF22 100 | 仅修改第二个字节为BF使得即使结果为0xDA 101 | 102 | WZ_RAW[0] xor 0x22 = 0x78 103 | WZ_RAW[1] xor 0xBF = 0xDA 104 | WZ_RAW[2] xor 0x40 = ? 105 | WZ_RAW[3] xor 0x00 = WZ_RAW[3] 106 | 107 | WZ_RAW + 4 xor DWORD szFile 108 | ``` 109 | 110 | -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/1.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/2.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/3.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/4.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/5.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/6.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/7.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/8.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 收费组补丁破解之ペトリコール/image/9.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 编码范围/image/2939730-20221117234154387-775355256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 编码范围/image/2939730-20221117234154387-775355256.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 编码范围/image/2939730-20221117234250081-1082177769.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 编码范围/image/2939730-20221117234250081-1082177769.png -------------------------------------------------------------------------------- /Reverse/[YU-RIS] 编码范围/image/2939730-20221117234258811-554349096.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dir-A/Dir-A_Essays_MD/eb87f07ee39e1d026901867169df7d7d43113ee3/Reverse/[YU-RIS] 编码范围/image/2939730-20221117234258811-554349096.png --------------------------------------------------------------------------------