FF14拆包
骂了这么久的FF14了为了表达我内心的愤怒 也为了显得比那些键盘格斗家们更闲更有决心
我花了将近1个星期的时间 把FF14里的sqpack打包文件给解析后拆开来一解心头之恨
首先要感谢这位博主
http://www.yumao.name/read/tag/sqpack/
他的几篇文章给了我很多思路 虽然其实文章里几乎每一篇都有不少疏漏的地方 导致其结论大多数情况根本无法直接使用……
发现网上现有资料实在少的可怜 就算有的一些 正确性也比较差
于是最后我选择了最传统的 直接跟踪反汇编游戏执行程序的方式 去拆包
先吐槽下这个包格式 说实话觉得蠢的有点躁
打包后的文件里不包含任何信息可以恢复出原文件结构的
每个文件用一个HASH值索引到一个数据块内 仅此而已
所有原文件结构和名字信息完全没有任何手段恢复出来
在执行文件中 通过事先知道的文件信息单向得到HASH值去访问文件
最要命的是 有些情况下文件并不是使用字符串常量来访问的
因此仅仅靠取出全部字符串常量来排列组合的方式也是没办法恢复出原有文件结构的
我这里采用的方式是 跟踪了游戏的启动过程 把游戏启动阶段的所有打开文件操作 全部给LOG了下来
然后依照这个LOG里的文件名和地址来HASH解压
至于HASH算法 也是反汇编出来的
不过这个记录只有游戏在启动时预读入的那些文件 数量相当有限
我目前从9G多包里依照这个记录 只解压出不到100M的内容
应该是游戏材质什么的大文件都要正式进游戏后才会载入的原因
如果谁有好的方法得到这个原文件结构 可以和我联系
根据上述记录 解包出来的结构大概是这样的
http://img5.tuchuang.org/uploads/2014/10/QQ图片20141009221045.jpg
这里exd里是游戏文本 也是比较关心的部分
里面有exh和exd两种文件 前者相当于一个索引 后者为真正使用的文本 使用UTF-8编码
但是游戏在启动阶段 只预载入了大多exh文件 因此我这对那个启动载入记录稍微处理了一下 推导出了对应的exd文件并解压出来了
这里贴随便贴几个
http://img4.picbed.org/uploads/2014/10/QQ%E5%9B%BE%E7%89%8720141009220953.jpg
http://img3.tuchuang.org/uploads/2014/10/QQ图片20141009220803.jpg
http://img3.tuchuang.org/uploads/2014/10/QQ图片20141009220604.jpg
http://img1.picbed.org/uploads/2014/10/QQ图片20141009220510.jpg
http://img5.picbed.org/uploads/2014/10/QQ图片20141009220352.jpg
(吐槽 仔细看下的话 其实游戏文本里有不少日文 都写着不用翻译……只能说其实游戏版本是比较新的 只是被用某些手段阉割了……
而等新版本的 我觉得至少要先等他们有人去把新版本的本地化做完……)
下面是重点了 先啥都不说直接放代码了
http://pan.baidu.com/s/1hqkotZQ
代码是PYTHON2写的 因为我是PYTHON控 但是又跟不上潮流
至于名字为毛叫ix而不是xiv……这个拜托别吐槽了……一时手误之后就懒得改了……
包里包括一个我解压出来的output文件夹 里面只有我之前提到的 预读取的那部分内容
_main那个文件是主程序 里面运行_filelist那个函数就可以解压filelist文件中列出的全部文件
在_search那个文件里设置游戏安装目录
不过估计其实根本没多少人会直接去运行吧 对代码兴趣估计也不大
对拆包后的玩意有点兴趣的直接看看output那个文件夹里的东西就完了
考虑到想学术讨论的人大概不大多
而且我又直接放了源码
说100句不如看1句源码
这里我就不详细解释拆包过程了
不过如果有人真的有兴趣要我讲一下的
回复在后面 我看到后大概会补一下吧
目前的解包代码 可以顺利解包3种不同数据头 分别在包头中用2,3,4来表示的
2类头就是最前面提到的那个博主分析过的那个头 不过他的分析也还有点不完善
4类头是大的材质贴图文件常用的头 稍微复杂一些 但是我解析的比较透彻了 至少我记录了的这些文件 全部可以顺利对应解包了
3类头比较少见 我只见到后缀为mdl的文件是这种头 这个头太多未知 里面大半字段不知道干嘛用的 但是至少能明白如何解包 所以就草草的给解包了事 无法深究
最后提一句 按照我目前的代码 稍做修改 应该是可以实现数据回注到游戏的数据包中的
但是为了我的帐号着想 我暂时不想自己去作这个死…… 虽然我也不大相信盛犬真的会检测这个……
因此这里我并没有做数据回注实验
有兴趣的人可以自己试试
最后的最后
此代码仅作学术探讨之用 如有违法违规使用 千万别来找我负责任
不过如果你有所引用 请你还是想起稍微注明出处
围观技术帝 好!
能把自己的工作分享出来很了不起了 不设权限吗?虽然也只是掩耳盗铃
----发送自 Sony Ericsson LT26w,Android 4.1.2 盛大应该鼓励传播相关工具以求裸体补丁和日文语音降低国服流失率 瓦拉几亚之夜 发表于 2014-10-10 00:57
不设权限吗?虽然也只是掩耳盗铃
----发送自 Sony Ericsson LT26w,Android 4.1.2
不会弄 感觉蛮麻烦的样子
有人觉得有必要的话 就帮忙加一个吧
有人觉得得删帖的话 那就直接删好了
反正我拆这个包 发这个帖子也只是为了发泄心中对这游戏的不满
弄了一个星期 弄出来了 感觉心满意足了
剩下的随便怎样都无所谓了 裸体补丁1.0就已经有了 拆包后可以上日语语音么!!!! 支持一下 神一样的楼主! 本帖最后由 w酱 于 2014-10-10 10:57 编辑
看了一下代码,感觉se这么设计很奇葩,于是真实的文件名列表其实游戏是放在哪里的?通过网络实时读取然后再计算hash索引文件包?
那个异或key也很有病的节奏..... w酱 发表于 2014-10-10 10:55
看了一下代码,感觉se这么设计很奇葩,于是真实的文件名列表其实游戏是放在哪里的?通过网络实时读取然后再 ...
放在游戏执行文件里应该没错
但是大概不是网络读取的……
因为跟踪反汇编没法跟踪到联网后的部分
所以这个我也不大确定……
deadbeef 发表于 2014-10-10 10:59
放在游戏执行文件里应该没错
但是大概不是网络读取的……
IDA里能看到一部分文件名数据,但是感觉那个表不太全,只有大概一千个文件 有日语补丁的话,我就玩了 跪求日语语音 跪求果体补丁【喂 同且只关心日语补丁,国配那语气听得想来个泰坦掀桌! 同求日语跟裸体补丁! 我很好奇数据回注可以实现什么样的功能呢?
页:
[1]