要制作打包器,先得分析包文件格式,对CSI:NY的包文件格式初步分析如下:
5 k/ Z4 L: o2 l5 a! R& ^) A: |0 o. B4 D
包文件,可以分成三部分:0 f- _' m$ d2 C, F! T+ ^
1、文件头,0x00~0x0B,12个字节
: ]8 h S; \* P/ |; z0x00~0x08 头部标识,8字节,为475246050146524700719CAA ,“GRF FRG”
$ t9 ?+ r0 E" N0x08~0x0B 文件名表偏移量 4字节
9 L% R, s/ ?0 B$ H& L/ U
: y: ^; q+ U" a2、数据块
7 O, l7 M: e U! W/ oN个zlib压缩的数据块,依次存放9 f' W- `+ j4 j
6 \0 W/ W' Q0 i9 d% R4 |2 O3、zlib压缩过的文件名表8 |; S4 l W: q% A$ K% `
, p; r2 K. W/ M- ^3 _
——————————————————
: C1 ~1 N$ t6 F+ H* y8 p对于解压后的文件名表,可以分成两部分:* T/ o8 G l2 m0 R/ K0 u, C- S0 A
1、文件头,0x00~0x0A 10个字节3 w& e+ K, Z [$ c* x" n
0x01~0x06 头部标识,6字节,为05000174734C,“ tsL”
; w$ c$ o" o$ ?! t0x06~0x0A 文件数量,4字节
( t& N2 Q4 l- l! v0 Y6 D3 T
! I% Q( r9 A; p5 F& }2、文件数据4 d! x5 ?7 b( G$ Z6 I5 A
每一个文件的数据又如下0 C, Y; q& _' y# N& m9 o* {4 v( I+ e {
0x01~0x05 未知,估计可能是序号之类 5字节
+ d$ W: c2 `4 [# A5 \0x06~0x0E 标识符,8字节,为0145495201727453,“ EIR rts”
C b/ S" }) A0 ~0x0F~0x13 文件名长度N 4字节6 A* N6 Z2 i3 X0 b2 {
N字节 文件名4 O. r3 Q' ^& }5 a
4字节 偏移量,即该文件压缩后的zlib块在包文件中的位置9 v# F9 J3 L3 J, D
4字节 文件大小(压缩前,即原始大小)& f1 ^4 ?* O7 y) \1 t( }
1字节,结束符 0x01
6 j8 Z u6 V* t2 n( |
( K( u6 g' _% U7 N: R6 s——————————————————
, v9 z6 @* g8 M那么,如果替换包文件中的文件,已知需要修改的地方有:
) f3 G% f% I% Q) |包文件头的文件名表偏移量;文件名表中偏移量、文件大小。2 M9 V3 |# ~- @7 [$ C3 [
' r `& N E, R- `& F1 m, A- i( i; p
基于以上分析,我手工制作了一个新的包文件,用一个中文字体ttf文件替换掉包里的一个ttf文件,同时修改以上部分。修改后的包文件用老外的解包工具解包后就可以得到原来的资源文件和那一个替换后的ttf,所以上述几个部分的修改应该没有问题。" j) S0 A: ?- m, o$ P/ }
/ K/ f9 d* K& e5 M
但是将这个包文件替换到游戏里,游戏无法运行。所以猜测包文件中还有地方需要修改,根据以上分析,最有可能就是文件名表每一个文件的头5个未知字节。) q+ ~/ c' M) v R) E# K; e0 h
& t, Z+ q7 {# g/ H& f0 @; B! n% d
按顺序提取一些文件的这5个字节,同时计算其数值差,如下:' c! ?3 Y( g7 m6 E! w
003AD140.temp —390— 003AD4D0.png —20—( k. \& }+ V7 ~; i! c* X5 Y
003AD4F0.png —50— 003AD540.emi —50—
! {. ^4 r$ O& {( K/ K 003AD590.png —80— 003AD610.png —68—3 E2 u- x; ]8 z, U7 R! j4 `* [
003AD678.ttf —68— 003AD6E0.ttf —68—
; w; j2 }3 K* h7 \& H- V003AD748.png —50— 003AD798.anim
6 Y/ D6 q; e, M2 {
. N9 ~9 ^) S; w4 ]8 {' R00547718.png —68— 00547780.jpg —68—7 t4 `3 n. Z5 n+ O# i% J
005477E8.png —68— 00547850.jpg —68—6 F {0 L( A/ r) J, i$ u
005478B8.png —80— 00547938.theme- r0 C3 O$ l) y5 \& D, H
8 a7 E9 I) _6 ?4 s9 u+ m% D* J可以观察到,这些数值之差几乎都是几个恒定的值,0x80、0x68等
- |/ m# h, }3 j: T9 @0 S! a) h, }本来猜测是根据文件格式不同而产生不同值,但注上格式后查看似乎和文件格式没什么关系& ^/ N+ W1 k/ s" H+ i/ e0 F- _
——————————————————————————————————————————
% B/ M% J1 w! J2 _, n9 G0 e( ~* j目前的分析就到这儿,先写出来,各位高手如有相关心得,万望不吝赐教
/ g9 c/ y- a3 A& ]4 @" R' e: z& @4 J+ ?) }
另外写了个根据修改后的文件改写文件名表中各数据的小程序,不过手工都还没成功,暂时先搁着吧....
( I! @. @0 M: J+ L
6 E# l* i, h' H. I; R& w: r——————————————————————————————————————————* K7 W ` e1 h# j' E( K
10.02.28更新:
{2 w& {$ ? {) G今天用filemon(现在叫ProcessMonitor了)监视了一下,发现是自己粗心,在修改文件名表的时候漏了一个,改完后可以显示中文。那么上述那5个字节就可以暂时不考虑了。+ p( q7 { w( o5 r, N" }
汉化抓图见帖:https://www.chinaavg.com/read.php?tid=20946 |