jinxin8866 发表于 2010-3-28 11:21

关于静物2的分析

00403CE0|> /3B96 10110000    /cmp edx,dword ptr ds:
00403CE6|. |1BC9             |sbb ecx,ecx
00403CE8|. |23D1             |and edx,ecx
00403CEA|. |8B8E 0C110000    |mov ecx,dword ptr ds:
00403CF0|. |8A0C0A         |mov cl,byte ptr ds:
00403CF3|. |3008             |xor byte ptr ds:,cl                   ;这个循环就是异或算法
00403CF5|. |83C2 01          |add edx,1
00403CF8|. |83C0 01          |add eax,1
00403CFB|. |83EF 01          |sub edi,1
00403CFE|.^\75 E0            \jnz short SL2.00403CE0


00401A42|.8D4C24 18      lea ecx,dword ptr ss:
00401A46|.51               push ecx
00401A47|.8D4C24 24      lea ecx,dword ptr ss:
00401A4B|.C68424 58110000 >mov byte ptr ss:,1
00401A53|.C687 08010000 00 mov byte ptr ds:,0
00401A5A|.E8 51240000      call SL2.00403EB0                           ;读取字体函数的开始四个字节
00401A5F|.817C24 18 474D47>cmp dword ptr ss:,42474D47          ;此处可判断出开始的四个字节应该是魔幻数
+0 魔幻数
+4 段数,
下面开始是每段的头部
+46EE 正文

0203DDE02F 45 58 54 44 41 54 41 53 46 4F 4E 54 2F 41 52/EXTDATASFONT/AR
0203DDF049 41 4C 20 31 31 2E 45 4E 00                  IAL 11.EN.

0203DEE0            75 16 00 00 (EE 46) 00 00 2F 45 58 54      ..頕../EXT
0203DEF044 41 54 41 53 46 4F 4E 54 2F 41 52 49 41 4C 20DATASFONT/ARIAL
0203DF0031 32 2E 45 4E 00                              12.EN.

上面表中的数据除了括号中的(EE 46),其余全部与解包后文件数据一致,
1675是这个段的长度,46EE是这个在文件中的偏移,每段偏移值的算法如下:

00401AE0|> /899401 08010000/mov dword ptr ds:,edx         ;edx=46ee
00401AE7|. |8B06             |mov eax,dword ptr ds:               ;存放读取字符的地址
00401AE9|. |039401 04010000|add edx,dword ptr ds:
00401AF0|. |83C3 01          |add ebx,1
00401AF3|. |81C1 0C010000    |add ecx,10C
00401AF9|. |3B5C24 14      |cmp ebx,dword ptr ss:            ;=1C2
00401AFD|.^\72 E1            \jb short SL2.00401AE0

shane007 发表于 2010-3-28 11:32

首先对楼主的大力支持表示非常感谢!
想问一下,通过以上分析,能得出什么阶段性的结论吗?

shane007 发表于 2010-3-28 11:34

或者说是否已经可以把字体文件的结构写出来了?

jinxin8866 发表于 2010-3-28 12:06

Sl2fnt.dat文件格式分析如下:
+0 474D4742这个魔幻数

+4 C2010000表示有01C2个文件

+8 2F4558544441544153464F4E542F415249414C2031312E454E00
/EXTDATASFONT/ARIAL 11.EN.u
这个应该是文件头部,ARIAL表示字体,EN表示英语 11表示字号

   751600 表示这个文件的大小

每个文件的偏移由上文中的最后那个函数得出


+46EE 此处开始是每个文件的正文

如上面我举的这个例子,文件正文内容起始地址+46EE,
结束地址为+(46EE+1675)

shane007 发表于 2010-3-28 12:11

这个其实不用分析,这个dat是个包文件,已经有解包器了啊。
需要分析的是里面解出来的字体文件。字体文件的magic number是XCPK.

我想知道XCPK文件的结构。

shane007 发表于 2010-3-28 12:16

http://aluigi.altervista.org/papers.htm

这里有stilllife2 dat文件解包器,配合quickbms使用

jinxin8866 发表于 2010-4-1 10:58

回 楼主(jinxin8866) 的帖子

写屏函数:
02A0EA4C|> /8B00      |/mov eax,dword ptr ds:
02A0EA4E|. |0FB70450    ||movzx eax,word ptr ds:                  ;存放字符的UNICODE码
02A0EA52|. |8B7C24 14   ||mov edi,dword ptr ss:
02A0EA56|. |8B7F 2C   ||mov edi,dword ptr ds:
02A0EA59|. |8D04C0      ||lea eax,dword ptr ds:
02A0EA5C|. |8D0487      ||lea eax,dword ptr ds:                     ;eax存放字符编码表
每个字符码表占24(16进制)个字节
02A0EA5F|. |8B7C24 0C   ||mov edi,dword ptr ss:
02A0EA63|. |8D7C39 14   ||lea edi,dword ptr ds:                  ;edi就是显存地址
02A0EA67|. |D940 04   ||fld dword ptr ds:
02A0EA6A|. |83C2 01   ||add edx,1                                              字符个数加一
02A0EA6D|. |D95C24 30   ||fstp dword ptr ss:
02A0EA71|. |D900      ||fld dword ptr ds:
02A0EA73|. |D91F      ||fstp dword ptr ds:                              ;edi就是显存地址
每个字符占1C个字节,最后的四个字节都是一样的,可以认为是结束标志
02A0EA75|. |D94424 30   ||fld dword ptr ss:
02A0EA79|. |D95F 04   ||fstp dword ptr ds:
02A0EA7C|. |8B7C24 0C   ||mov edi,dword ptr ss:
02A0EA80|. |D940 04   ||fld dword ptr ds:
02A0EA83|. |8D7C39 30   ||lea edi,dword ptr ds:
02A0EA87|. |D95C24 30   ||fstp dword ptr ss:
02A0EA8B|. |D940 08   ||fld dword ptr ds:
02A0EA8E|. |D91F      ||fstp dword ptr ds:
02A0EA90|. |D94424 30   ||fld dword ptr ss:
02A0EA94|. |D95F 04   ||fstp dword ptr ds:
02A0EA97|. |8B7C24 0C   ||mov edi,dword ptr ss:
02A0EA9B|. |D940 0C   ||fld dword ptr ds:
02A0EA9E|. |8D7C39 4C   ||lea edi,dword ptr ds:
02A0EAA2|. |D95C24 30   ||fstp dword ptr ss:
02A0EAA6|. |D900      ||fld dword ptr ds:
02A0EAA8|. |D91F      ||fstp dword ptr ds:
02A0EAAA|. |D94424 30   ||fld dword ptr ss:
02A0EAAE|. |D95F 04   ||fstp dword ptr ds:
02A0EAB1|. |8B7C24 0C   ||mov edi,dword ptr ss:
02A0EAB5|. |D940 0C   ||fld dword ptr ds:
02A0EAB8|. |8D7C39 68   ||lea edi,dword ptr ds:
02A0EABC|. |D95C24 30   ||fstp dword ptr ss:
02A0EAC0|. |83C1 70   ||add ecx,70
02A0EAC3|. |D940 08   ||fld dword ptr ds:
02A0EAC6|. |D91F      ||fstp dword ptr ds:
02A0EAC8|. |D94424 30   ||fld dword ptr ss:
02A0EACC|. |D95F 04   ||fstp dword ptr ds:
02A0EACF|. |8B46 58   ||mov eax,dword ptr ds:
02A0EAD2|. |03C3      ||add eax,ebx
02A0EAD4|. |3B50 08   ||cmp edx,dword ptr ds:
02A0EAD7|.^\\0F8C 6FFFFF>|\\jl xcDxShad.02A0EA4C

本游戏字符编码采用UNICODE,
对字符码表的操作:
10028807|> /0FB702      /movzx eax,word ptr ds:      读字符的UNICODE码
1002880A|. |8D04C0      |lea eax,dword ptr ds:
1002880D|. |8D0483      |lea eax,dword ptr ds:   根据UNICODE码求得字符码表的地址
10028810|. |33C9      |xor ecx,ecx
10028812|. |DB40 20   |fild dword ptr ds:
10028815|. |D95C24 14   |fstp dword ptr ss:
10028819|. |D94424 14   |fld dword ptr ss:
1002881D|. |D9C0      |fld st
1002881F|. |D84E 14   |fmul dword ptr ds:
10028822|. |D94424 0C   |fld dword ptr ss:
10028826|. |D9C0      |fld st
10028828|. |DEC2      |faddp st(2),st
1002882A|. |D9C9      |fxch st(1)
1002882C|. |D95C24 14   |fstp dword ptr ss:
10028830|. |D8D3      |fcom st(3)
10028832|. |DFE0      |fstsw ax
10028834|. |F6C4 01   |test ah,1
10028837|. |74 2B       |je short xcEngine.10028864
10028839|. |D94424 14   |fld dword ptr ss:
1002883D|. |D8D3      |fcom st(3)
1002883F|. |DFE0      |fstsw ax
10028841|. |F6C4 41   |test ah,41
10028844|. |7A 04       |jpe short xcEngine.1002884A
10028846|. |DDD8      |fstp st
10028848|. |EB 1A       |jmp short xcEngine.10028864
1002884A|> |D9C9      |fxch st(1)
1002884C|. |D8D3      |fcom st(3)
1002884E|. |DFE0      |fstsw ax
10028850|. |F6C4 05   |test ah,5
10028853|. |7A 04       |jpe short xcEngine.10028859
10028855|. |DDD9      |fstp st(1)
10028857|. |EB 0B       |jmp short xcEngine.10028864
10028859|> |D9C9      |fxch st(1)
1002885B|. |D8DC      |fcomp st(4)
1002885D|. |DFE0      |fstsw ax
1002885F|. |F6C4 41   |test ah,41
10028862|. |75 05       |jnz short xcEngine.10028869
10028864|> |B9 01000000 |mov ecx,1
10028869|> |85C9      |test ecx,ecx
1002886B|. |8B4424 18   |mov eax,dword ptr ss:
1002886F|. |D940 14   |fld dword ptr ds:
10028872|. |DECA      |fmulp st(2),st
10028874|. |DEC1      |faddp st(1),st
10028876|. |D95C24 0C   |fstp dword ptr ss:
1002887A|. |75 05       |jnz short xcEngine.10028881
1002887C|. |834424 10 0>|add dword ptr ss:,1
10028881|> |83C2 02   |add edx,2
10028884|. |83EF 01   |sub edi,1
10028887|.^\\0F85 7AFFFF>\\jnz xcEngine.10028807
由于算法采用了浮点数指令,本人不太懂,边学习边研究中。。。。。。。。。

shane007 发表于 2010-4-1 11:13

加油!UNICODE码内核的游戏?
看来汉化有希望啊。

shane007 发表于 2010-4-1 11:17

只要知道游戏读取字符图片以后,以何种格式,放到哪个内存地址。
即使我们无法解压字库,也可以通过内挂一个DLL,传入字符编码,把我们自己的字符图片写入对应的内存地址。从而达到汉化的目的。

jinxin8866 发表于 2010-4-2 09:48

回 8楼(shane007) 的帖子

找到了内存中字库的地址,可在下面这个位置下断,

02A0EA5C|. |8D0487      ||lea eax,dword ptr ds:                     ;eax存放的就是字库的地址
这个字库不是点阵的,经过修改,字符的形状可发生变化,应该是矢量字库
页: [1] 2 3 4 5
查看完整版本: 关于静物2的分析