黎明杀机相关

日常不务正业

Posted by 恋 on March 8, 2019

咸鱼的时候突然遇到杀鸡更新新版本测试服(屠夫 瘟疫)。发现能解包后突然特别想做点东西,越扯越远。

点我

emmmmm 首先是解包语言文件(等等,正常人不是都想要模型吗!)

对于解包没有丝毫经验的我直接搜了一下,然后发现有人推荐QuickBMS。这是个通用解包工具,对不同引擎的游戏加个规则就能用。根据不记得哪里看到的帖子所说,杀鸡是UE4的 - 所以,选择在QuickBMS的网站上下载了最新的unreal_tournament_4.bms。

这个工具的用法很简单,命令行能看到帮助,官方支持论坛(ZenHAX)上也有批量解包的脚本。放到.pak所在的文件夹(Steam/steamapps/common/Dead by Daylight/DeadByDaylight/Content/Paks)里就能用,解包出来的结果在同一个文件夹里。

因为解包出来的结果也有目录结构,为了防止混乱,解包出来的目录结构前加了个@。

在Everything的帮助下语言包找起来不是很难,一下就找到了。@DeadByDaylight\Content\Localization\Game\LanguageCode\DeadByDaylight.locres

Locres文件的读取是一个问题。经过努力的搜索,我最后发现只有一个工具能提取。这个是真的难受,而且提取出来的只有字符串 - 如果顺序变了,那整个文件都坑了(而且我总不能把那些字符串排序一次吧!)。而且我找了好一会儿都没看到资料,于是就想把那个工具也研究一下。这工具是个AutoIt的脚本打包出来的 - 并且居然没有人做提取工具!看了一下AutoIt的wiki,发现他们官方提供一个反编译器,而且讨论非官方反编译器会被封号…

* Admitting you have decompiled your own script with a 3rd-party decompiler.
* Admitting you have decompiled another user's script with a 3rd-party decompiler.
* Posting any script that has been decompiled by a 3rd-party decompiler.

承认使用第三方反编译器反编译自己的脚本、承认使用第三方反编译器反编译他人的脚本、发布使用第三方反编译器反编译出来的脚本 可能会使你在社区被封禁。

但是问题是,这个官方反编译器在新一点的版本里已经移除了。看着他们的论坛,对反编译意见非常大

Decompile others hard work to claim it as you own work ha?

但是十分显然,真正的程序员…

经过各种辛苦后,成功找到了一个可以用的工具。感觉像是内存dump那一类的,把一大堆native import都搞出来了。反正最后的结果大概长这样:

var data = File.ReadAllBytes("DeadByDaylight.locres");
var dataStart = BitConverter.ToInt32(data, 17);
var count = BitConverter.ToInt32(data, dataStart);
var keysData = new byte[dataStart - 0x29];
Buffer.BlockCopy(data, 0x29, keysData, 0, keysData.Length);
dataStart += 4;
var valueData = new byte[data.Length - dataStart];
Buffer.BlockCopy(data, dataStart, valueData, 0, valueData.Length);
var kbr = new BinaryReader(new MemoryStream(keysData));
var vbr = new BinaryReader(new MemoryStream(valueData));
for (var i = 0; i < count; i++)
{
    var str = Encoding.Unicode.GetString(kbr.ReadBytes(64)); // 一个Unicode的32位十六进制字符串,貌似是Hash
    kbr.ReadBytes(2); // 总是00 00
    var key = kbr.ReadInt32(); // 无规律的疑似随机数,和Hash相关(Hash相同时这个值相同)
    var unknown = kbr.ReadInt32(); // 从0开始 貌似是按顺序增加
    kbr.ReadBytes(4); // 总是DF FF FF FF
    // 字符数量 ^ 0xFFFFFFFF,* 2后为字节数
    var value = Encoding.Unicode.GetString(vbr.ReadBytes(-2 - (vbr.ReadInt32() * 2))) + $" #{str},{key},{unknown}";
    vbr.ReadInt16(); // 总是0
}

此段代码适用于Dead By Daylight 2.5.4

这就让人很难受了,我能找到这个疑似Hash的玩意儿,但是Hash和字符串tm的居然不是按顺序一一对应的?感谢@月落大佬的提醒,我加入了GitHub上的一个有二十万人的大型组织UnrealEngine要关联账号加入组织才能看代码

经过一定的咸鱼后,我成功做出了一个很方便的解包工具放在了我的GitHub上。它按照Unreal Engine的规则来解析数据,然后导出为.json。

然而,我要怎么用这些东西啊!第一反应是做个翻牌子网站

话说,杀鸡里的技能图标的背景是有颜色的… 我怎么把没有颜色(白色)的东西靠网页的css这一类的操作染色成彩色啊!

emmmm 到现在为止 就做好了个翻牌子 我好菜啊

四月二日更新:

做了个全自动的工具:输入用户名密码,自动下载资源解包,然后更新到github… 目前已更新:Ash vs Evil Dead

(未完待续)