冒险解谜游戏中文网 ChinaAVG

标题: 林登布鲁克的冒险解包器 [打印本页]

作者: shane007    时间: 2009-5-10 09:03
标题: 林登布鲁克的冒险解包器
林登布鲁克的冒险 Adventures of Natalie Brooks  解包器 2 v- Z1 S6 ~0 j. m6 n
要配合QuickBMS使用。 1 X1 N/ X  N- k3 X+ C' V3 ^$ h: f( Y- I

3 g" _1 E. G6 v----------------------------------------------------------------- ; J" A. j2 E5 H' j
2009.1.11 第1次更新
8 ~7 q9 p7 i) _0 E4 ]  t
! E* B  W$ x# ?* U, d% k) ^" q我大致看了一下,觉得肥牛分析的还有些问题。 # l2 V$ H/ Q- q) F/ A4 O
我先纠正第1个问题。文件的结构应该是这样的: ! P2 h1 w7 j' S2 T# w
字体文件名长度 4bytse
7 V" o8 Y: ~( a7 o& I3 b字体文件名 nbytes
* f( S" K: C% Z9 ~字体高度 4bytse ) `5 K: g8 v5 B/ ~. A0 c' ^5 b
字体数 4bytse 1 O7 O- L9 N  o/ \# A
字模数据 字体数X24 bytes 4 F: a# M( C$ w
尾部未知数据 nbytes
" \4 q+ b8 T6 F1 _: p  |7 R: b/ ^6 L/ U2 Q
肥牛可能只分析了1个字体文件,正好那个文件的字体高度是0x18. 所以误认为那是每条记录的字节数。其实再看看其他文件,应该会发现那是字体高度的可能性最大。
3 S1 E% a& O1 A9 C8 D
  ~( }$ q, I, F1 X------------------------------------------------------------------
2 l( \9 [( o, z" u- y2009.1.11 第2次更新
' x* Y5 L( u+ b7 N& O肥牛说字符是按照ASCII码的顺序排列。我不知道是怎样看出来的?
% e" K/ e) s0 p( _' F  F据我观察字符并不是按照ASCII码的顺序排列。
3 D/ C& K2 j8 ~" z. L) S- I/ G4 r8 K
# @( \9 l; [* T- _$ w首先,我们估计在每条记录的24个字节中,有4个字节记录了这个字符的编码。 . J  n" w5 M- I9 B4 V3 J
我们知道A这个字幕,ascii码和utf-8是0x41,utf-16码是0x41 0x00. - [6 M" J2 k2 D! s5 o
如果A-Z按顺序排列的话,我们会在字体定义文件中发现等间距(24byts)的 4 `: l  h/ x2 b' i; w& i) }
0x41,0x42....这样的数据。但是实际上文件中并没有发现,
8 w! W+ a& @8 d2 p- {. N% f; i8 n所以字符应该不是按照ASCII码的顺序排列。2 y! R, h' W0 s: Q
( x% L  h9 E0 m
另外,肥牛说索引文件会长度由26K变成了1M以上。6 F( s. V7 H& [7 f
我不知道肥牛是如何算出来的,每条记录24bytes,汉字算它9000个字。; w6 s! _- N$ E( V. b: D
算下来也就216K左右。远小于1M。
作者: shane007    时间: 2010-1-11 00:27
顶上来,此游戏下载
( o# T6 ~5 r& l0 ghttps://www.chinaavg.com/read.php?tid=19777
作者: 肥牛    时间: 2010-1-11 08:42
没看到楼顶这个帖子,从网上搜了一个解包器,估计跟楼顶的这个一样。
- u3 _$ U( D' b$ ^# p8 C/ w( q% B
5 Z+ ^( B; S1 }' A$ M4 r解包Localization后,会出现三个目录, xml、texture、font
* c* m8 L; C- e' D. o8 ?其中,texture目录中的保存的是PNG格式的字库图片,font目录中保存的是字库的索引文件,xml中就是可翻译的字符串了。
5 d# B& _' H9 B9 S) [! W: J* Z: t2 Q5 ]3 N! }! d
PNG的图片就不用说了,我们经常遇见。下面说说font目录中的字库索引文件。(解包后的东西在家里的电脑上,现在凭印象写这个东西,有什么不对的晚上回去以后再更正。)
/ ]7 W. W7 b. ?! O/ n: X0 w在font目录中,简单看了一下,文件的第一个字节表示每个字符由几个字节组成。比如0B就是11个字节,16就是24个字节。以24个字节的为例,文件头部有对应的图片文件名,然后是表示此索引包含多少个字符。后面就是每个字的数据内容了。字符是按照ASCII码的顺序排列。每个字符占24个字节,左、上、右、下各占4字节,然后是8个字节的0X00。如果此ASCII码的字符在字库中没有,那么它对应的24个字节全为0X00(好像就是为了占位)。) E0 V$ Q7 w& U  i3 _3 l+ S

4 `6 G( j1 D$ U& g" j  m3 n疑问:6 d2 O% g& Z8 n+ D, S- w' O1 t
1、索引文件末尾的几个字节不知道是做什么用的。
- c8 I5 T  H, f  ?7 I1 t) [& ?2、按照我的想法,将汉字的双字节作为ASCII码,依照顺序写入索引文件。同时修改索引文件头部表示字符数的部分。这样却导致进入游戏后文字都不显示了。不知道是什么原因。, |2 G! f- @1 O
3、在字库的图片中,我看到了俄文。在字库的索引文件中找到对应的位置,发现与该俄文的ASCII码对应不上。不知道这个对应关系的话,汉字的索引就不知道怎么加进去。以汉字双字节的方式写入索引文件,只按二级字库就是几千个。导致索引文件长度由26K变成了1M以上。而xml目录中保存的文件是UTF8格式的,汉字将占三个字节。如果真的是按照UTF8的编码写入,那这个索引文件就太大了。所以,如果能知道俄文的索引对照关系,也许这个文件就解决了。
作者: shane007    时间: 2010-1-11 12:49
2009.1.11 第1次更新
作者: shane007    时间: 2010-1-11 13:03
2009.1.11 第2次更新
作者: 肥牛    时间: 2010-1-11 19:29
好吧,既然007不相信我的分析,那我就用实例来说明吧。
: `; e+ f" |- ?, y9 Q, s7 X以font目录中的font_game_menu_buttons为例,用16进制工具打开它,我们就能看到:3 [4 ?* P2 V9 H" X! u' ~" P
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
8 f2 C1 R2 O, _, D3 p- G
+ @- O$ c* X7 e8 d# Q; {00000000   16 00 00 00 66 6F 6E 74  5F 67 61 6D 65 5F 6D 65   ....font_game_me4 G+ ]9 e: {3 r; p  N* _% s6 `
00000010   6E 75 5F 62 75 74 74 6F  6E 73 21 00 00 00 50 04   nu_buttons!...P.# L* ^: U0 |4 [1 D: P
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
  K0 S  u( ]3 d" n& v7 ], V00000030   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
" `- N) @4 I2 g- k4 y2 _- y, ]" {# R7 E* W" r3 F1 W- M. q
第一个字节0x16表示每个字符的占位是24个字节,偏移量0x1e开始的4个字节0x0450代表这个索引表一共有这么多个字符。
1 D( b2 {- c- O: H. q
% R! z% L9 E1 G& G* q再跳到数据部分:( J- E1 G% ~1 _  w( {

) h- h' @* D$ o0 uOffset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
3 d2 |+ _1 Z: {9 g
* C1 k  r- @* q; |) }3 d00000320   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
6 ?- I+ ]( @6 ?/ Z! @; @* g, O00000330   00 00 00 00 00 00 00 00  00 00 6A 01 00 00 AE 00   ..........j...?
- o. M# |7 P& \1 G% c( B00000340   00 00 6F 01 00 00 CF 00  00 00 00 00 00 00 00 00   ..o...?........
6 z8 @1 r# G6 H, K5 P00000350   00 00 EF 01 00 00 AE 00  00 00 F5 01 00 00 CF 00   ..?..?..?..?
7 E, X! V: ^; S. v8 F00000360   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
5 G/ U% X4 w$ w5 Q: q3 Z00000370   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................( ~0 Y* U7 V1 M! |; B7 B; i
. y) ?6 X9 ~& o, g4 v9 `
0x016A, 0x00AE,0x016F,0x00CF分别是左上角的横纵坐标,右下角的横纵坐标,我们看看这个范围在对应的图片中是什么:
6 m/ Z/ r; B, r; T; `7 z
+ A( [* h1 L$ W$ e1 V# B [attach]15004[/attach] 5 S; P  |3 Y7 S- S8 w1 H+ B
从图中可以看出,这个范围对应的是字符"!"。同样,跳过8个字节的00后,0x01EF, 0x00AE, 0x01F5, 0x00CF也能对应出相应的字符。4 T0 P; v" g# H7 V
& F2 }% k4 ^8 H& I. W3 c
为此,我专门写了一个小工具来查看显示顺序与图片之间的关系。这个工具只能证明字符的存储是按照ASCII顺序,而不能说明是从哪个字符开始的。
% v+ J$ t- b, h  n" K& Q [attach]15005[/attach] 3 R: K% A/ A6 ]% d: k; z6 a2 ~
当然,这个工具中我做了一些处理。因为第一个显示的字符是"!",所以我将它的ASCII码定为33了。0 C& o9 k7 n. N) D1 k9 g9 T1 B
我们点击SPIN的上下箭头,调整ASCII码,就可以看到该顺序在索引中取出的是什么字符图片。
作者: 肥牛    时间: 2010-1-11 19:39
另外,说一下汉字导致文件长度增长的问题。5 w8 O) x5 V* P5 b$ v7 O+ p) ~
并不是说我们有9000个汉字,就多了9000*24这么多个字节。因为汉字占的双字节与单字节字符是不连续的。以第一个汉字"啊"字为例,双字节是B0 A1,换成10进制就是45217,也就是说,在这个“啊”字前面,至少有45000个24个00的空占位。所以才导致这个字库的索引文件超过1M。
* Y3 o; c# c# E当然,我这样说的前提是基于索引表是连续的这个假设的前提下,如果能找到俄文字符的对应关系,可能就不会有这么大了。
作者: 肥牛    时间: 2010-1-11 19:42
突然想到,007下载的游戏是不是跟我的版本不一样?我是从Reflexive网站上直接下载的。其中Localization文件4.60 MB (4,826,852 字节)。
作者: shane007    时间: 2010-1-11 20:46
引用第7楼肥牛于2010-01-11 19:42发表的  :6 v- i; f" R% ]& l$ k: K& @
突然想到,007下载的游戏是不是跟我的版本不一样?我是从Reflexive网站上直接下载的。其中Localization文件4.60 MB (4,826,852 字节)。
! {' U* ~- q3 L3 f3 I
先回答这个,我用的也是这个版本。文件大小一样。
作者: shane007    时间: 2010-1-11 20:55
引用第6楼肥牛于2010-01-11 19:39发表的  :! w) W  R& g! d- ?$ A1 v( {$ I
另外,说一下汉字导致文件长度增长的问题。( B8 Z7 g% q7 [' U$ i4 p9 |
并不是说我们有9000个汉字,就多了9000*24这么多个字节。因为汉字占的双字节与单字节字符是不连续的。以第一个汉字"啊"字为例,双字节是B0 A1,换成10进制就是45217,也就是说,在这个“啊”字前面,至少有45000个24个00的空占位。所以才导致这个字库的索引文件超过1M。
: r# G) T, }0 u$ }当然,我这样说的前提是基于索引表是连续的这个假设的前提下,如果能找到俄文字符的对应关系,可能就不会有这么大了。
3 g, ~- z' M$ \9 Q
你的意思我明白了。
; {6 n. ~9 h4 ~8 b. r5 v1 r" \你是说在字体索引文件里包含了所有的码位。
, Q/ _% a- L1 l0 d/ [我的疑惑是,如果是这样的话,码位的数量在定义文件头部有定义,
$ e7 `8 h* P- Y* M: u: `: ]. F但是起始码和终止码在何处定义的呢?
作者: shane007    时间: 2010-1-11 21:15
下面针对肥牛5楼的说明来说一下,
/ J; R: }3 \$ N# w. r2 t, i+ Q* U; g" @9 j
第1个字节是0x16, 也就是10进制22 而不是24,所以是font_game_menu_buttons的字符串长度。0 ?, e$ X3 d( H3 b
我想这是肥牛犯的一个低级错误。
" z9 H7 E& Y7 y. g  O我在顶楼说了,每个字符的记录的长度的确是24个字节,这个24是定死的。( i& z! t6 k) ]" U8 h7 G1 \$ U% `% Q
在定义文件中并不出现,肥牛认为是记录的长度的那个字节,应该是字符的高度。* A/ A# a, Y" H$ }; h7 h
; F: ~* L7 Q. M1 V6 F
肥牛你的那个工具好像没法用. 点箭头没反应啊?
. J; t# n& W+ v1 w我想知道,如果是按ascii字符的顺序,ABCD。。。应该是连续定义的吧?# L. D. W" k! n- x, X: D7 ^
能指出定义在哪吗?! S" f/ Q# ?" K9 W+ u8 v! ?' U5 S
还有最关键的一点,如何判断是按单字节ascii顺序定义的还是按双字节utf-16顺序定义的?
6 T+ [0 d; t( k, j, C从文件内容来看是不容易判断得出的。
# p+ A$ x  i7 E不知道这个游戏有没有俄文版的。
作者: 肥牛    时间: 2010-1-11 21:57
的确,我也是刚刚发现,我竟然把0x16算成是24了,真是个低级错误。可能就是因为开始对24这个长度先入为主吧。" q0 x; }% |/ [/ x+ M

5 t/ W1 a: m1 m8 B另外,那个工具,点到33以上才会有反应。ABCD的确是连续出现的,65是A,66是B,67是C。俄文字母大写的A出现在第1040,我不知道在英文的WINDOWS系统中,俄文大写字母的ASCII码应该是多少?
! R7 a, ?' R' ?. y5 K序号是1040,那么在索引文件中的起始位置应该是! Q% ^9 ?% U0 Y; R2 G- d
(1040-33)*24+0x33A = 0x61A2  ;                                          33为第一个字符!的序号, 0x33A是该字符的起始位置
, t" t0 K9 v5 o! e# C9 R' V5 ~1 @3 t7 [
查看这个文件,可以看到0x61A2前面有很长的空白填充。 如果我们有证据显示俄文的A序号是1040,那就麻烦了。那样就说明我们的汉字确实需要按照这个规律向后排列。4 Y9 s* V/ J& n  q9 B  S( P( K

% U: z5 i. m  P7 E- v6 t3 \不管怎样,通过这个游戏的分析,又学到一些新东西。应该对将来的汉化分析工作有帮助。
作者: shane007    时间: 2010-1-11 22:41
引用第11楼肥牛于2010-01-11 21:57发表的  :3 _( Y$ {1 n/ d& _0 T& q+ J
的确,我也是刚刚发现,我竟然把0x16算成是24了,真是个低级错误。可能就是因为开始对24这个长度先入为主吧。5 o6 S2 s5 o" p

+ E, {. Y0 a9 R另外,那个工具,点到33以上才会有反应。ABCD的确是连续出现的,65是A,66是B,67是C。俄文字母大写的A出现在第1040,我不知道在英文的WINDOWS系统中,俄文大写字母的ASCII码应该是多少?8 S/ O% b# ^/ I+ N' k
序号是1040,那么在索引文件中的起始位置应该是
" H4 N& O8 B6 C% d* t9 F  D(1040-33)*24+0x33A = 0x61A2  ;                                          33为第一个字符!的序号, 0x33A是该字符的起始位置8 A8 a. K) Y" d" J0 L" |  `# o
.......

2 `. B8 Y* v3 m% c. Z/ I$ t我算了一下,1040转换为16进制是0x410,utf-16 的10 04 对应的字符正好是俄文大写字母A。
3 o! e7 F) k/ f4 t. O& I$ r- @所以可以确定,你说的字符排列顺序是对的,是按utf-16编码顺序来排列的。- L" K- e2 T8 W- E# a: z1 z' O

. H7 b# U" r( l所以汉化应该是可行的,其实文件大一点应该也没关系,多占一点内存而已,应该不会出问题。
作者: shane007    时间: 2010-1-11 22:46
对了,对于这个游戏,估计你只是想分析一下,不是真的要汉化吧。' _' p  j% f% z3 i* ?3 f
不知道你最近有没有时间,如果有时间的话想请你帮忙制作【福尔摩斯:觉醒汉化项目】的工具。
  F' C) _0 h! t, Z' \分析基本都完成了,文件的结构和这个游戏很相似。/ l+ ^8 {& `; r& }* y2 l; k9 o
如有兴趣的话可以检索【福尔摩斯:觉醒汉化项目】。5 ~: X! `% K/ K4 [: m
需要制作一个图片字库和字库定义文件。
作者: 肥牛    时间: 2010-1-12 19:04
正在从VERYCD上下载这个游戏,打算试试。
作者: shane007    时间: 2010-1-12 20:00
引用第14楼肥牛于2010-01-12 19:04发表的  :9 `' L2 O6 ~1 N6 `
正在从VERYCD上下载这个游戏,打算试试。

: X  E, `7 t% G# Y% Y8 p要是下不动的话可以从论坛ftp下
作者: shane007    时间: 2010-7-11 15:25
顶上来,这个系列是有汉化可能性的




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