冒险解谜游戏中文网 ChinaAVG

标题: 皇室的麻烦解包工具 [打印本页]

作者: shane007    时间: 2010-10-15 17:03
标题: 皇室的麻烦解包工具
本帖最后由 shane007 于 2011-4-5 11:52 编辑
8 z- q4 p( N" ]0 v- o  i! e0 W' |, N9 y* f2 @  A" l
在老外包文件结构的基础上。我写出了解包工具。- h2 r. s0 f. N1 N) C' D. D5 e6 B8 L2 d
大致看了一下,这个游戏汉化的希望是很大的,以后再继续研究。

  1. / h& K; H$ t/ M% w
  2. goto -1 ; K# t+ x2 D; `' Y0 d  e3 N+ k- c
  3. SavePos OFFSET_TAIL
    " j* q: ^6 t! v( M# [5 h
  4. goto 8* Q1 |# M7 P% t- P8 z$ D
  5. set FOLDER_NAME string ""7 e  N" m; ~. R2 U5 f
  6. set FILENAME string ""
    & r& S7 g- _% q2 z1 w# m3 f' r$ O
  7. set FULLPATH string ""& v* r; d! a! u7 M4 P2 c1 h% q" n( t
  8. Do
    $ Q& |6 x0 c3 I- i2 U+ C7 k
  9.     get NSIZE long- {. q0 J1 \- ]2 n! l/ X
  10.     GetDString FILENAME NSIZE
    0 O, k% K/ f' {2 z* V1 g7 ]1 H
  11.     get FILE_FLAG byte& t  ?  p) L6 R3 ]1 }; k' V
  12.     get OFFSET long& ~+ x0 t; o* `$ P4 h% @5 J
  13.     get UNK3 long4 I8 l& H) f1 Z% I) Z
  14.     get UNK4 long6 O' s% D2 g4 I3 J; O: m5 p
  15.     get SIZE long
    " R0 S! @% o! U
  16.     get ZSIZE long
    8 e. J5 G3 I: Y6 F
  17.     if FILE_FLAG = 0
    / e; ^/ T( p0 ~, d$ R
  18.         ComType bzip2
    7 z, S' `' {: \7 ^/ ]7 r; {4 w" C
  19.         string FULLPATH p= "%s\%s" FOLDER_NAME FILENAME: S9 L5 t. N) Q0 R( \& x
  20.         Clog FULLPATH OFFSET ZSIZE SIZE. R' O( s: p8 G# _
  21.     else
      c; a/ v; P6 [; M
  22.         string FOLDER_NAME = FILENAME$ X$ f4 S9 |. z+ n8 s+ r
  23.     endif
    & H  Y" X3 l( _5 c- c5 F8 \( c  Q
  24. While OFFSET < OFFSET_TAIL
    * C! N4 L2 x7 K2 [4 {. A$ c
复制代码
-------------------------------------------+ k/ L* \: R/ N2 a
2011.4.5 更新) I9 M" t# d( |. y  R
当文件为目录的时候,发现UNK4 是这个目录下的文件数。
$ f) U' j4 s. G" |3 k; l但发现目录有重复,以及同一个目录下的文件也有重复的情况。
  1. 7 ~1 U1 W. W0 P' x* p, i6 H5 j
  2. goto -1 2 k: L2 q: U6 S, {+ m
  3. SavePos OFFSET_TAIL
    & I. @/ C2 ?+ J( ?2 {9 @3 ]- [
  4. goto 8
    1 T8 S' L  g9 O- a& A
  5. 2 D* ]9 @: Q0 x2 `4 u% e( C
  6. set FOLDER_NAME string ""
    ' z! w# d4 w$ {+ f7 Q
  7. set FILENAME string ""
    * {/ L' W; C3 ]2 s
  8. set FULLPATH string ""
    0 S8 C9 k# v: b- t9 p
  9. ' z' ~, A5 Q8 b2 W  q/ p) }
  10. set idx long 0
    1 ]9 y& v& O3 P# r

  11. ) V! w7 A7 Z0 w1 a
  12. Do# ]2 Y& `' Y0 Y5 h* U
  13.     get NSIZE long/ j6 c% R7 u: u* L# N  B
  14.     GetDString FILENAME NSIZE) I7 e6 U# ~. T
  15.     get FILE_FLAG byte  ]  v" ]6 p9 x8 z; T! D
  16. ' \' S6 H0 b; |+ l& q- |: k
  17.     get OFFSET long/ p5 l; P: B5 D$ I9 u/ U
  18.     get UNK3 long6 Z' e7 r' R$ d5 G$ t8 I* G% i
  19.     get UNK4 long8 E0 D& Z% M' y0 f- e# V' O
  20.     get SIZE long
    6 ]9 W) d7 ~4 ^' n2 s, @$ M
  21.     get ZSIZE long/ g/ t: j  B7 ^  r# m) d  _

  22. : \+ b) \9 t( l+ W. [, {0 L
  23.     if FILE_FLAG = 0  r( b4 C& w5 V& {1 a3 {
  24.         #ComType bzip2: ?1 M' ?  w8 X: G
  25.         #string FULLPATH p= "%s\%s" FOLDER_NAME FILENAME0 \, e1 N8 S% \# L- K9 q
  26.         #Clog FULLPATH OFFSET ZSIZE SIZE
    ( X3 P- Q: i; q8 M+ r# s
  27.         print "%FILE_FLAG%,%UNK3%,%UNK4%,%FILENAME%"
    " c* i: R6 o' q+ p
  28.     else! I' v' E- U: w2 O% c
  29.         #string FOLDER_NAME = FILENAME
    ; o3 \7 B' j7 L; M
  30.         string FOLDER_NAME p= "%s####%d" FILENAME idx
    0 m' ~4 r6 g- F
  31.         print "%FILE_FLAG%,%UNK3%,%UNK4%,%FILENAME%####%idx%"
    6 M( A" Y: j$ L" T+ P; j
  32.         math idx += 1. k; n# s5 K4 ^, r9 f* S1 a% T, g
  33.     endif
    ! b8 H; Z. P! k6 G4 U3 ~$ a. ?

  34. " M3 a1 Z  r5 r( w+ F
  35.    
    # |$ ^; o' x3 g/ z
  36. " u7 X* U) c. @5 `
  37. While OFFSET < OFFSET_TAIL# l. R. t6 o1 h5 j( a, r7 A# F
  38. % E" l+ j- L0 ^4 a! m
复制代码

作者: byp100    时间: 2010-10-15 18:59
问一下
0 P5 g* @1 R4 o: P& F& T! N) \7 J0 |. }& o8 i
goto -1
* G  @, Q5 |$ E: H5 g* ^7 n! d6 ESavePos OFFSET_TAIL
1 v: S; ]( {% ]4 A$ P4 fgoto 8( g9 Y  [4 ^; Y; E# O" ?! q9 A
" ?1 z% C1 u! N. O' V4 P
三句的意思是什么
作者: shane007    时间: 2010-10-15 19:33
goto -1 ! s  m' `- E# F8 m7 W" v3 A
SavePos OFFSET_TAIL - H6 {/ C# ~2 D* n) J5 B3 C0 k! l
是保存一下尾部的位置
5 N, X4 r, P, ^4 k  b. p
) o  N! G: K/ x8 `/ e9 hgoto 8) K7 m7 i3 l4 u: G/ P- X6 H0 E6 Q
跳过头部8个无用的字节
作者: shane007    时间: 2010-10-15 20:52
这个游戏好像不支持免打包,要汉化的话需要制作打包器。
作者: shane007    时间: 2010-10-24 14:50
顶上来
作者: shane007    时间: 2010-10-24 14:54
补上包文件结构
( q) F: I) ?) b$ w! W8 j4 H8 N
4 V) }! G3 t! H' a. Y; r{
6 k% X  u3 B/ Z' i3 M' W. ~1 Tflag1 long% C8 J. `0 p  V5 c" C
flag2 long! ^. y: c/ w0 L4 c) H
{6 P5 Q+ T- a5 Z1 n9 C
NameSize long
% m' T% I2 W- A* ~8 t0 a5 R0 BName[size] char
; R, t3 j! d/ z  hisDir byte
% A; r- O5 B5 M! }5 `offset long6 k7 Z1 E7 ^) s4 Z# y
flag3 long
9 S0 {3 ~7 W+ iflag4 long
8 S! T" Z' V  m% Zsizeof(packed) long" X- {" q% [8 F, n1 B5 a3 `
sizeof(data) long
3 _2 L& C8 ]% i6 `. p}
# F* R! T3 F  P: R3 ^data byte0 |5 k3 ^9 A& K: j2 E8 I
}
作者: shane007    时间: 2010-10-28 21:33
顶上来
作者: potemkin    时间: 2010-11-4 01:34
抱歉晚了几天.
. o- f2 B; l4 P6 k4 _
1 L; v0 J5 B/ v- k; n% n Clog FULLPATH OFFSET ZSIZE SIZE 有些小问题' x, H3 u9 z: ^+ b
0 O( T7 e$ R# A- W
在打包的时候用bzip2打进去的,文件名没变。
0 E* A/ i2 R; c0 f
, W9 ^. Y7 N4 Z, T$ ^2 k+ T3 S解包的时候报错了: &quot;Error: the compressed zlib/deflate input is wrong or incomplete&quot; / v( @6 T) [- x# G% B1 A0 T# U4 t. E
是不是quickbms需要配置什么才能用bzip2解包?
作者: shane007    时间: 2010-11-4 07:58
引用第7楼potemkin于2010-11-04 01:34发表的 :
5 w# m6 L5 D" Y1 w4 C抱歉晚了几天.
' j# v! [$ Q3 a  H
8 G4 ]! Z$ m0 l; _Clog FULLPATH OFFSET ZSIZE SIZE 有些小问题 - \1 T: P* M# F4 p$ ~+ `& i

0 u# L5 V4 i/ A7 g( D; d' m5 J在打包的时候用bzip2打进去的,文件名没变。
0 u* B+ H$ C# e* G$ Y' R.......
9 X' k/ n6 A2 Y) A4 J! L" g* `

* g6 Q( B# E' c' g2 K5 O0 U" oComType bzip26 R- T4 b! h# @' R& ^7 v
上面这句有没有?把你的打包器发出来给我看看吧。
" a* e3 w9 R% S9 K7 L6 f另外请你压缩一个单独文件的.bz文件,并附上压缩前的文件。2 G: b  Z8 S$ D+ Y+ K( G
我看看你压缩得对不对。
作者: shane007    时间: 2010-11-4 08:00
试试看这个/ T, B  }' {, ]! P
https://www.chinaavg.com.cn/read.php?tid=24940
3 ]$ G& E6 {# F+ T0 `8 ]% m
  p6 U) {  U5 Z我测试过,压缩过的可以正常被quickbms解包。
作者: potemkin    时间: 2010-11-4 09:54
压缩包里是写的一个试验性质的打包器。之前没加入压缩部分正常运行。/ }3 S! n' R# z7 ^
晚上我试试你给的那个库  j9 _6 j+ B8 ~- ~9 m6 M2 P
2 \4 @' {0 g6 M, p
解包器:; m% ?: h* [# h$ S
get FILES long2 i* t9 ?( Y8 T6 w
get HEADERSZ long ' p( o1 G& }! F( \5 |) X+ ?
for i = 0 &lt; FILES ' {* J+ Z0 c, @) Q2 X! \/ O
get NSIZE short # f1 V# Q0 C/ c4 L0 r5 M: V
getdstring NAME NSIZE6 _6 U/ j& I! l+ @4 h& @0 H
get OFFSET long    2 V" Q8 K4 `* T
get SIZE long   
* P/ F' J3 _, D0 P& y- z  Hget ZSIZE long
4 b  X6 C$ d# VComType bzip2
0 n4 \- u* |4 V8 T% \0 O0 {clog NAME OFFSET ZSIZE SIZE   
# d* W" `: |- c2 z8 p1 Tnext i
作者: potemkin    时间: 2010-11-8 10:10
使用方法:  tripDir.exe 需要打包的文件夹名 打包文件名4 K9 @* `7 W1 c0 d/ l+ g' E( B
如果不给第三个参数, 默认会打包在 &quot;.\\zipPack.z&quot;
; D+ p! [" d* Q* B
3 M& C, J& z" T压缩包里面包括了bzip2的可执行程序。另外有个测试文件夹tst2, 包括子目录, 中文文件名等等。
  z9 B5 k+ n( K6 {& Y& t) _* P测试脚本: tripDir.exe .\\tst2
; r7 {5 x/ e8 A$ b. x# L) o
7 Z" C9 i- w: o$ f/ h  _# V: S* m" o源码里面加了很多注释, 各位可以看看, 有什么不decent的地方欢迎拍砖:D
* j! L5 n  A5 O+ B5 n$ u" ?$ U% s( \---------------------------------------+ C+ U7 |+ m3 y7 A
终于搞定了...这事情拖了好久, 找原因的话一个是自己windows系统编程方面不熟, 另外就是办事太拖拉了。
4 r7 ?9 N/ j& H
, k( v' |3 c% U; T. n主要是两个问题比较费时间:
+ c# Q! {5 H' R& o8 J* x1. 原来解压缩的问题, 是因为我用的quickbms是0.2.X的版本, 回头下了一个最新版本的就ok了
2 E; E. z8 ~' z/ N2. 就是windows系统下目录遍历的问题, 之前读写文件都是用c语言的函数的, 又是翻书上网查了一阵, 那些命名还有就是wchar/char的问题搞得有点晕。有个需要注意的地方就是这个脚本的目录和文件的打包规则不同——目录的路径是完全的, 而文件只有文件名没有目录, 之前的目录路径用的是一个上一级访问得到的目录名。带来的问题就是在打包一个文件夹时, 要先打包下面的文件, 在打包下面的子目录。因为如果交错打包子文件和子目录的话, 文件前面的路径就乱掉了
作者: shane007    时间: 2010-11-8 16:37
收到,非常感谢!& T6 l7 ]7 I( ?6 a8 @4 ~
等我抽时间来测试一下。
作者: 卡西莫多    时间: 2010-11-9 00:02
来报道 8 H6 \! I) \. g0 G8 R# j: R# O1 `
) F4 K  r9 Y! i8 N! M/ X
QQ:277161500
作者: potemkin    时间: 2010-11-12 11:45
去掉了包里的临时路径,试试看
作者: shane007    时间: 2010-11-12 22:10
还是不对,目录名前的斜杠也是不要的。" K6 b! Y9 F( [  ]0 w8 W: u5 P
9 c8 ~9 ~) A4 P3 Y
你最好还是下载一个游戏试试看吧,要求文件头部除了offset,size,zsie以外,其他的都和原文件一样。要求打包后游戏能正常运行。+ o4 I) ?6 K( s2 o' N' x

1 o. q' N3 _8 ]# v包文件结构应该是先是size,再是zsie,老外的资料写错了,但我的bms脚本是对的。
作者: shane007    时间: 2011-4-5 06:50
顶上来备用
作者: shane007    时间: 2011-4-5 11:49
2011.4.5 更新9 _" s6 k1 p, Y2 |/ @5 ]





欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2