上次发了个编译pyside的帖子拿了个精怪不好意思的, 翻了翻硬盘决定发点存货出来.
存货之一, 仙剑的sce反编译和编译工具, 叫做SceCompiler, 当然因为是坑掉的东西, 刚看了看居然还有Longkui拼写成longui问题, 我已经无法确认是整理官方头文件时候拷贝错误还是他夹杂的头文件确实是旧版错误的了.
顺便一提 没想到那时候的帖子还在
http://bbs.gameres.com/showthread.asp?threadid=2511
这个设计的初衷是能够反编译sce成半吊子的脚本, 然后再修改对话后编译的sce能够被引擎识别. 做到脚本和源文件一样那是不大可能的了, 但是sce一样那是可以的. 首先请看截图.
左侧是官方打包时候, 混在了游戏资源里面的策划资源. 同时混在里面的还有3ds的场景, 粒子系统参数说明的doc, 各种.bak等等等等.
右侧是从M23.cpk里面提取的m23.sce反编译后的结果, 当然注释部分是反不出来的… 还有一些循环结构也需要润色.
为啥要做这个东西的说来话长了, 我只记得雪见跳炉时候老子正在吃白吉馍, 一把攥的白吉馍的肥肉汁液飞溅, 马上读取存档, 第二次是龙葵妹妹跳了!!!
在妹子和妹妹之间, 当然我再次选择了龙葵妹妹, 千年之前就为了哥哥受苦, 起码这辈子一定要保护好, Load, 雪见又跳了一次, 可怜我还是第一次玩这种虐心的游戏, 以前一直打怪时候倒不觉得, 忽然少了一个人, 那种心中少了一块的感觉是怎么的一回事…
当时到寰宇之星论坛发了一通牢骚以后, 我也意识到要什么隐藏结局那是不可能的, 但是天无绝人之路, 有一次仙三打补丁打了一半崩溃了. 再启动游戏, 来个提示, lzo block错误什么的, 顿时我就跟打了鸡血一样兴奋了起来, 那时候正好所在的网站喜迎改版, 喝了一肚子啤酒滚回网站就开始打开WinHex, 大眼瞪小眼地想要把文件解出来.
怎么找到头绪的我也记不得了, 最后取得进展还是因为music.cpk和movie_end.cpk吧, 那时候有个工具叫做MediaRipper32吧, 是根据在流里面搜文件头部特征来提取文件的, 从这两个文件里面提取出mp3和bik以后, 顺利地从WinHex搜到了同样内容所在的地址, 再搜到了记录地址和大小的索引信息, 最后是把前后的看起来像是文件内部偏移的值都跳转一遍, 找到了文件名.
PS: 其实刚写帖子时候弄错了, 刚翻出了以前记下来的wps文件, 发现是靠FileMon这种原始的手段, 监控游戏读取文件时候都从什么位置, 读取了几个字节做为突破口的, 然后去WinHex里面把对应的数据复制出来分析.
具体读取的流程可以去看MainUnt.pas里面的OpenCpkThreadExecute这个函数, 这里大概简述一下.
TVMBR = packed record
Magic: array[0..2] of Byte;//RST
RevM: Byte; //$1A
Rev1: DWORD; //$01,00,00,00
VFatOffset: DWORD;//$80
EmbOffset: DWORD; //$00E00080
Rev2: DWORD; //00,80,00,00
BlockNum: DWORD; //记录数
RevZ: DWORD; //00000000
RevVF1: DWORD; //80
BlockNum2: DWORD;
Rev3: DWORD;//00,80,00,00
RevZ2: DWORD;//0000000
CpkSize: DWORD;//整个Cpk长度
RevNU: array[0..$4F] of Byte;
end;
TRecBlock = packed record
vID: DWORD; // 记录ID
Rev2: DWORD; // 节点种类
ParentvID: DWORD; // 上级ID
Offset: DWORD; // 偏移
lzosize: DWORD; // 压缩后尺寸
filesize: DWORD; // 原始尺寸
RevFnLen: Integer; // 名称长度
RecIdx: DWORD;
end;
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)