在制作解包器之前,我们一般都要把包文件的格式写出来,在这个格式的基础上就制作解包器。
& x7 _' x! Z" v9 m甚至分析者和解包器制作者不是一个人也没问题。
( d1 l6 t8 ^* C6 l) v9 g1 e在此公布一下包文件格式书写的大致格式及一些例子,提供给大家汉化时参考和学习。( ?' W/ D5 A0 t6 H5 U
- p& X# ]2 U: V8 X2 v D5 l% G; H J- k4 `
一般包文件分为+ Q( z1 O7 Q& t- y
Header
* b* v6 M3 B6 \& T- P4 k z: q9 JFilename table
7 M& R c$ ?; g: U7 g; E9 RBody# m2 D: b, u$ E$ Y# ]' }
Footer
' J# }( x8 J' {3 q& F% H. M几个部分,Filename table里一般纪录了每个子文件的offset和length.file count等。 W$ a+ S. D% U( V6 A" k' B
Filename table一般在文件头部,有时在文件的尾部。有时还有Dir table.# @8 [1 ?1 @! v" B( }
在书写包文件格式的时候只要准确包含了这些信息即可,具体占多少字节当然是必不可少的。8 i. o0 |/ H: K5 Y$ ?6 r
0 @$ Y5 b7 N; N5 |' G6 o下面公布一些例子
, f; t* K3 C- |# b8 ?: k+ h0 `# J- E% {* N6 b& Q
例子1
$ W- I( o# q' P6 P+ k3 E) R8 a3 V-------------------------------------------------------------------------------
3 N) j( i: z. J$ C( lArc Layout$ v, ^- S. |; d5 e- o$ s
+ h5 D1 Y- R2 D; H% a/ m
Header:: S) B3 P: U- g: r
0 - Magic - Chars(4) //"ARC "
2 u3 A4 s: |/ a& \) Q4 e9 C/ h& [4 - Version - Int16, Z8 K) x$ V( c1 G: j# l
8 - FileCount - Int16! h4 B. U/ ~; N3 e5 R) e
7 D8 k% w5 V8 `7 nFiles:, |( H. e6 i9 _0 C w- m. R1 |
0 - FileName - Chars(64)7 ^2 `9 }: Q; `1 ^
64 - Unknown - Int32 //Not important, some sort of flag6 e! v) o# N4 x$ ]
68 - CompressedSize - Int32
$ ~, y7 @6 X( w4 w K D72 - DecompressedSize - Int32
; k3 j1 t e& N7 _/ h76 - Offset - Int32
$ o4 ?( F' a" v- J9 h2 Z-------------------------------------------------------------------------------
1 Y- V# |; Y* s+ m例子2; n( S2 K& i* t0 \: I% L/ l
3 V' U1 w$ a. W1 Z! MMagic:
4 u: S/ {. X: Q& I# w7 Q8 U: NDE AD C0 DE JUNK3 ?8 b5 I) b) m1 q0 N8 z" `, z! a
00 02 00 00 Version, if <> 200h, then no XOR-encryption of filename; e( g8 A0 \2 v% A3 ^' r
0 w6 ^3 b4 \3 z: ~) |. i6 J
7 a0 O9 y+ A2 P/ {( FTable:) r1 ~6 @! a8 i! @
% B3 G0 n: n3 a/ z5 b1 |( O
db len,description(len-1)
4 c. p( b: q+ Y* Z- @db 0
! |; m* l% ~3 q. V/ o Z( Sdword number_of_files
* G! R, A" w# d4 a
% ~( u5 H2 K7 l( E' ^$ F& Wbyte length name
- N% @) p, z4 U4 t2 y- mbytes Name, (xor-value: 44h, only if Version 200h)0 q H8 N2 ?, c ~5 z# n
dword Offset data. \" E) x* \* h) j ]2 \
dword uncompressed length of data
7 I# L4 o) Q+ e0 b A# U S0 Wdword compressed length of data (or 0, if not compressed)
- o i; _" s3 b: I8 m5 j6 o+ Jdword 0
, k! w$ u% q! l' u- m# Xdword CRC(?) ;only if Version 200h
. \' B5 C2 |5 wdword 0 ;only if Version 200h
1 m$ F8 s7 q8 b4 I2 ^* i9 \! j. l: g-------------------------------------------------------------------------------. S6 |; J7 {5 `5 Y1 O* g
例子3
, d' ^5 p; Q9 R: N: n
# x( {" @9 Q" C6 X, M4 K: }Header:
9 `1 W i) N, ldword "VXGB" - Marker$ `& V. w4 p5 B) h4 k% `3 E
dword ? - size filetable4 | O. N. n8 y$ l
/ p$ q) r# @7 Y7 Y* X# DFiletable-entry:; L6 G/ A2 t' V0 k* y* f2 W" I
db ? dup(?) - file name, variable length, 0-terminated$ C# l8 u: r: \( b0 I: D
dd ? - Length of data9 `& Z9 C9 y6 e& v3 q$ S
------------------------------------------------------------------------------- |