冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2009-5-10 09:03
标题: 林登布鲁克的冒险解包器
林登布鲁克的冒险 Adventures of Natalie Brooks  解包器 9 X' G* N5 a! d. t9 S
要配合QuickBMS使用。
: L$ q" i& J- K4 ]; p& [2 t! x2 h. o$ ^3 X( S, Y- s8 G# ^
-----------------------------------------------------------------
1 u: z$ Q, t! d- n$ u; K2009.1.11 第1次更新
: C# o& j0 g5 z6 f+ I% W- w% g, I+ W) i9 d5 e4 C* A' a
我大致看了一下,觉得肥牛分析的还有些问题。
( r( i. m7 W6 Y3 w6 \- ^# }我先纠正第1个问题。文件的结构应该是这样的:
) s# o) r/ }/ D; C1 U字体文件名长度 4bytse ' `! X8 Y8 c+ `4 i" L$ N5 G
字体文件名 nbytes
2 U  q7 N8 f2 c! h7 \字体高度 4bytse 4 ~( P% Z3 S. O& L& X0 V
字体数 4bytse
6 b" Y0 ]0 V' V1 n字模数据 字体数X24 bytes ; Y& P4 I- T) `
尾部未知数据 nbytes ' R! Y4 x, j. V9 q( B- |5 c
. T# D2 L) V" G& b* u4 R2 V: d4 m( g) c
肥牛可能只分析了1个字体文件,正好那个文件的字体高度是0x18. 所以误认为那是每条记录的字节数。其实再看看其他文件,应该会发现那是字体高度的可能性最大。 1 @7 W0 B1 o( V; s- ~8 Z( ^
! e( p% B  o, d% o
------------------------------------------------------------------ ' y7 j# S' Q. i# @5 `) D) a
2009.1.11 第2次更新 1 x: T# p7 R, H* {* N* Q
肥牛说字符是按照ASCII码的顺序排列。我不知道是怎样看出来的?
: w$ N: y8 N+ J  J1 F5 {据我观察字符并不是按照ASCII码的顺序排列。 9 I; ]3 Q1 h1 b4 y

# J) L( e0 f" l% m. T1 D首先,我们估计在每条记录的24个字节中,有4个字节记录了这个字符的编码。
  H# B% C/ r! d. ?我们知道A这个字幕,ascii码和utf-8是0x41,utf-16码是0x41 0x00. 4 B' c, v8 y+ X; K  b; |. `9 k) R. e
如果A-Z按顺序排列的话,我们会在字体定义文件中发现等间距(24byts)的 . _; X- e; K9 |# N2 ]; B$ G
0x41,0x42....这样的数据。但是实际上文件中并没有发现,
, s( ~! P# q! A1 V8 C8 K: a所以字符应该不是按照ASCII码的顺序排列。' E& {2 i  ]6 S: ]/ X

0 Q' y% Q6 a$ r' p; M另外,肥牛说索引文件会长度由26K变成了1M以上。
7 F, J+ W9 k$ v$ a! r; g; q我不知道肥牛是如何算出来的,每条记录24bytes,汉字算它9000个字。
) |8 i. r8 G. {$ Y) g. r算下来也就216K左右。远小于1M。
作者: shane007    时间: 2010-1-11 00:27
顶上来,此游戏下载* J/ h. ]+ l! m
https://www.chinaavg.com/read.php?tid=19777
作者: 肥牛    时间: 2010-1-11 08:42
没看到楼顶这个帖子,从网上搜了一个解包器,估计跟楼顶的这个一样。
7 |4 w( M0 N: y- A! g: b, |& T2 q7 S1 s" z/ n& X3 l: f* V
解包Localization后,会出现三个目录, xml、texture、font
) A1 E8 G0 s2 [9 l其中,texture目录中的保存的是PNG格式的字库图片,font目录中保存的是字库的索引文件,xml中就是可翻译的字符串了。7 A4 e+ I' g  ~5 S) [6 O/ Q
9 P1 L% I8 I, \+ f+ F
PNG的图片就不用说了,我们经常遇见。下面说说font目录中的字库索引文件。(解包后的东西在家里的电脑上,现在凭印象写这个东西,有什么不对的晚上回去以后再更正。), ]/ W8 e7 K) p1 e. D( i8 R/ ~
在font目录中,简单看了一下,文件的第一个字节表示每个字符由几个字节组成。比如0B就是11个字节,16就是24个字节。以24个字节的为例,文件头部有对应的图片文件名,然后是表示此索引包含多少个字符。后面就是每个字的数据内容了。字符是按照ASCII码的顺序排列。每个字符占24个字节,左、上、右、下各占4字节,然后是8个字节的0X00。如果此ASCII码的字符在字库中没有,那么它对应的24个字节全为0X00(好像就是为了占位)。- R' P9 `* u# p. P/ K

' K+ Q9 ?7 H) n4 j疑问:
/ p. p- z! \" }* C1 o1、索引文件末尾的几个字节不知道是做什么用的。; W/ m! P( C) @: c
2、按照我的想法,将汉字的双字节作为ASCII码,依照顺序写入索引文件。同时修改索引文件头部表示字符数的部分。这样却导致进入游戏后文字都不显示了。不知道是什么原因。
- w2 _1 @0 I& ~5 p, [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不相信我的分析,那我就用实例来说明吧。
9 O! V6 C3 H6 H' q+ }# K" z6 G以font目录中的font_game_menu_buttons为例,用16进制工具打开它,我们就能看到:
1 e2 w/ }8 n8 K7 x& {8 cOffset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
5 ~* }$ R/ }; T% v6 L4 K% Q4 |' Z6 B* i) Y, T( C' x) \4 w3 i; Y
00000000   16 00 00 00 66 6F 6E 74  5F 67 61 6D 65 5F 6D 65   ....font_game_me
, |0 j8 [+ R( u/ T# P! G; ~# q00000010   6E 75 5F 62 75 74 74 6F  6E 73 21 00 00 00 50 04   nu_buttons!...P.& W4 R* a% n2 }( Q
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................# m  D5 v* c# t& n$ K6 V6 q
00000030   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................/ J% Q8 N  T3 \! M# t, T1 _
" x; }1 ?: y7 C7 e' N
第一个字节0x16表示每个字符的占位是24个字节,偏移量0x1e开始的4个字节0x0450代表这个索引表一共有这么多个字符。! j; r# v0 m$ [1 t

5 L0 v, I+ m4 H- \再跳到数据部分:8 Z5 u& k6 X, A; L3 r
2 v! x  V- d2 u# Q4 B/ A+ `
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F( R( }* v; O, v" L

  j1 ^  x/ H8 x+ L, K8 ^+ U00000320   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
" e; c6 [: @8 u! y00000330   00 00 00 00 00 00 00 00  00 00 6A 01 00 00 AE 00   ..........j...?' Z) X6 U$ \, D
00000340   00 00 6F 01 00 00 CF 00  00 00 00 00 00 00 00 00   ..o...?........
# d6 D# X) S# ?- |% l7 H; T) L2 @00000350   00 00 EF 01 00 00 AE 00  00 00 F5 01 00 00 CF 00   ..?..?..?..?7 G* @6 u# H) [! h# E$ L$ ]" c/ ?
00000360   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................( R( w; P- h$ N4 q9 k" d* K
00000370   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
" s2 Q3 p* [; b8 _3 t: k8 Q9 p
! a/ K8 U8 w# ?; ~8 ]" w' a9 u0x016A, 0x00AE,0x016F,0x00CF分别是左上角的横纵坐标,右下角的横纵坐标,我们看看这个范围在对应的图片中是什么:
9 p: M3 D  C; P! ?8 f5 G' p  l% b4 g
, U, L% N  B! {! s, q [attach]15004[/attach]
; G3 B7 z& \1 L6 L* }2 z# l从图中可以看出,这个范围对应的是字符"!"。同样,跳过8个字节的00后,0x01EF, 0x00AE, 0x01F5, 0x00CF也能对应出相应的字符。
8 ?# a+ m. d) {  B, d* h  R
& X; e( ?# t0 b" ]为此,我专门写了一个小工具来查看显示顺序与图片之间的关系。这个工具只能证明字符的存储是按照ASCII顺序,而不能说明是从哪个字符开始的。! T+ J- d% A& H7 M/ W
[attach]15005[/attach] . E$ n; ]$ M2 x
当然,这个工具中我做了一些处理。因为第一个显示的字符是"!",所以我将它的ASCII码定为33了。
# [/ k3 K7 t, V3 s/ V! S. c我们点击SPIN的上下箭头,调整ASCII码,就可以看到该顺序在索引中取出的是什么字符图片。
作者: 肥牛    时间: 2010-1-11 19:39
另外,说一下汉字导致文件长度增长的问题。
: T( I7 r; g* }* e/ }+ M" a并不是说我们有9000个汉字,就多了9000*24这么多个字节。因为汉字占的双字节与单字节字符是不连续的。以第一个汉字"啊"字为例,双字节是B0 A1,换成10进制就是45217,也就是说,在这个“啊”字前面,至少有45000个24个00的空占位。所以才导致这个字库的索引文件超过1M。8 K! ?, }+ a& \! s
当然,我这样说的前提是基于索引表是连续的这个假设的前提下,如果能找到俄文字符的对应关系,可能就不会有这么大了。
作者: 肥牛    时间: 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发表的  :
: Z: u2 B; M! v7 C+ z: z3 K9 ]; r8 c% g突然想到,007下载的游戏是不是跟我的版本不一样?我是从Reflexive网站上直接下载的。其中Localization文件4.60 MB (4,826,852 字节)。
# {' G3 A4 d8 o, u0 s; K. r; B
先回答这个,我用的也是这个版本。文件大小一样。
作者: shane007    时间: 2010-1-11 20:55
引用第6楼肥牛于2010-01-11 19:39发表的  :& |  H% x5 i8 D3 [
另外,说一下汉字导致文件长度增长的问题。4 Z! g( G; w% Y. Y: F9 b, V
并不是说我们有9000个汉字,就多了9000*24这么多个字节。因为汉字占的双字节与单字节字符是不连续的。以第一个汉字"啊"字为例,双字节是B0 A1,换成10进制就是45217,也就是说,在这个“啊”字前面,至少有45000个24个00的空占位。所以才导致这个字库的索引文件超过1M。
3 l1 v! y  D& ~: W当然,我这样说的前提是基于索引表是连续的这个假设的前提下,如果能找到俄文字符的对应关系,可能就不会有这么大了。
* S8 v. u3 ?9 \' r: l- l
你的意思我明白了。
; m" j; m; _9 a+ ~你是说在字体索引文件里包含了所有的码位。; L, S0 l1 @* Y- V, H( N5 x
我的疑惑是,如果是这样的话,码位的数量在定义文件头部有定义,; i- n( m, V8 k- R* U
但是起始码和终止码在何处定义的呢?
作者: shane007    时间: 2010-1-11 21:15
下面针对肥牛5楼的说明来说一下,
& R1 K2 |9 K8 |9 V* \9 n* C0 o; X
第1个字节是0x16, 也就是10进制22 而不是24,所以是font_game_menu_buttons的字符串长度。9 V9 r! z3 t2 y3 g6 g* k: s0 ~8 |; k
我想这是肥牛犯的一个低级错误。
# g3 O3 c+ I3 J& j5 u我在顶楼说了,每个字符的记录的长度的确是24个字节,这个24是定死的。$ [3 p" n, r- j3 l( }8 X6 @: c5 n
在定义文件中并不出现,肥牛认为是记录的长度的那个字节,应该是字符的高度。
" n# V( G) h7 `; B+ J1 b8 r" r7 Z- @, ]" D& ]
肥牛你的那个工具好像没法用. 点箭头没反应啊?- Q6 s. e, [: `- }
我想知道,如果是按ascii字符的顺序,ABCD。。。应该是连续定义的吧?5 k& v0 J: c$ j8 M
能指出定义在哪吗?* ]$ j  n5 S& ]( t7 g, l
还有最关键的一点,如何判断是按单字节ascii顺序定义的还是按双字节utf-16顺序定义的?
* d! `) B& e8 s. `! L从文件内容来看是不容易判断得出的。
  [$ Q, ~0 ^5 ~3 Z' F' N; V! W不知道这个游戏有没有俄文版的。
作者: 肥牛    时间: 2010-1-11 21:57
的确,我也是刚刚发现,我竟然把0x16算成是24了,真是个低级错误。可能就是因为开始对24这个长度先入为主吧。, {4 A  [4 h- l) a3 y! H& K# ?" c

* y7 |5 s' \, C/ z2 j另外,那个工具,点到33以上才会有反应。ABCD的确是连续出现的,65是A,66是B,67是C。俄文字母大写的A出现在第1040,我不知道在英文的WINDOWS系统中,俄文大写字母的ASCII码应该是多少?9 W: ?2 [' W7 Q, P4 Y
序号是1040,那么在索引文件中的起始位置应该是
; k1 j* d, R% o' P, L(1040-33)*24+0x33A = 0x61A2  ;                                          33为第一个字符!的序号, 0x33A是该字符的起始位置5 L1 a) v) W# q* t

, Z3 D" V6 W) \: M, r; V查看这个文件,可以看到0x61A2前面有很长的空白填充。 如果我们有证据显示俄文的A序号是1040,那就麻烦了。那样就说明我们的汉字确实需要按照这个规律向后排列。) q4 _2 c8 u. c# d

  H2 w+ E$ @* d3 G' u2 g8 h不管怎样,通过这个游戏的分析,又学到一些新东西。应该对将来的汉化分析工作有帮助。
作者: shane007    时间: 2010-1-11 22:41
引用第11楼肥牛于2010-01-11 21:57发表的  :
# o3 j9 {" z7 J6 {% I& R! d7 f- A的确,我也是刚刚发现,我竟然把0x16算成是24了,真是个低级错误。可能就是因为开始对24这个长度先入为主吧。
' m" r4 A, b3 }. p' i5 Q9 u# @% p: W) t, R6 B" P
另外,那个工具,点到33以上才会有反应。ABCD的确是连续出现的,65是A,66是B,67是C。俄文字母大写的A出现在第1040,我不知道在英文的WINDOWS系统中,俄文大写字母的ASCII码应该是多少?
  K# p7 V' T  s2 ^( c序号是1040,那么在索引文件中的起始位置应该是2 j9 o2 k9 l2 |8 D5 ?( p
(1040-33)*24+0x33A = 0x61A2  ;                                          33为第一个字符!的序号, 0x33A是该字符的起始位置0 `& g& ]4 B5 D8 o3 t( K$ B. @
.......

. t1 L, `, z6 g: N' ^8 b我算了一下,1040转换为16进制是0x410,utf-16 的10 04 对应的字符正好是俄文大写字母A。
. W3 [& D; j5 D7 P# F3 C) {所以可以确定,你说的字符排列顺序是对的,是按utf-16编码顺序来排列的。! C! |# v" H/ V0 T6 \5 @  a0 c

, y/ Q9 x( I  O- }1 ~8 D' u1 d所以汉化应该是可行的,其实文件大一点应该也没关系,多占一点内存而已,应该不会出问题。
作者: shane007    时间: 2010-1-11 22:46
对了,对于这个游戏,估计你只是想分析一下,不是真的要汉化吧。
+ b6 g# {- ]* c3 p不知道你最近有没有时间,如果有时间的话想请你帮忙制作【福尔摩斯:觉醒汉化项目】的工具。
" V- M; W9 L) \7 S2 Z9 S分析基本都完成了,文件的结构和这个游戏很相似。
- c" j( K: ~7 |- U3 `如有兴趣的话可以检索【福尔摩斯:觉醒汉化项目】。
; X+ ~& Q! @6 k! z需要制作一个图片字库和字库定义文件。
作者: 肥牛    时间: 2010-1-12 19:04
正在从VERYCD上下载这个游戏,打算试试。
作者: shane007    时间: 2010-1-12 20:00
引用第14楼肥牛于2010-01-12 19:04发表的  :
0 I" o7 w7 ]; f7 g( \正在从VERYCD上下载这个游戏,打算试试。
  ^1 i4 S) E4 Y6 T! p! ?
要是下不动的话可以从论坛ftp下
作者: shane007    时间: 2010-7-11 15:25
顶上来,这个系列是有汉化可能性的




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