关于静物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 首先对楼主的大力支持表示非常感谢!
想问一下,通过以上分析,能得出什么阶段性的结论吗? 或者说是否已经可以把字体文件的结构写出来了? Sl2fnt.dat文件格式分析如下:
+0 474D4742这个魔幻数
+4 C2010000表示有01C2个文件
+8 2F4558544441544153464F4E542F415249414C2031312E454E00
/EXTDATASFONT/ARIAL 11.EN.u
这个应该是文件头部,ARIAL表示字体,EN表示英语 11表示字号
751600 表示这个文件的大小
每个文件的偏移由上文中的最后那个函数得出
+46EE 此处开始是每个文件的正文
如上面我举的这个例子,文件正文内容起始地址+46EE,
结束地址为+(46EE+1675) 这个其实不用分析,这个dat是个包文件,已经有解包器了啊。
需要分析的是里面解出来的字体文件。字体文件的magic number是XCPK.
我想知道XCPK文件的结构。 http://aluigi.altervista.org/papers.htm
这里有stilllife2 dat文件解包器,配合quickbms使用
回 楼主(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
由于算法采用了浮点数指令,本人不太懂,边学习边研究中。。。。。。。。。 加油!UNICODE码内核的游戏?
看来汉化有希望啊。 只要知道游戏读取字符图片以后,以何种格式,放到哪个内存地址。
即使我们无法解压字库,也可以通过内挂一个DLL,传入字符编码,把我们自己的字符图片写入对应的内存地址。从而达到汉化的目的。
回 8楼(shane007) 的帖子
找到了内存中字库的地址,可在下面这个位置下断,02A0EA5C|. |8D0487 ||lea eax,dword ptr ds: ;eax存放的就是字库的地址
这个字库不是点阵的,经过修改,字符的形状可发生变化,应该是矢量字库