shane007 发表于 2010-4-26 22:03

引用第29楼jinxin8866于2010-04-26 21:26发表的 :

现在我们已经分析出了字库文件解压后的三种文件格式,我觉得没必要再分析XCPK文件,把我们自己的字符图片写入以下结构对应的内存地址
可以了

str[] = {pbuffIn, lenIn, unknow, pbuffOut, lenOut, unknow1, NULL, str1};
....... https://www.chinaavg.com/p_w_picpath/back.gif


理论上说的确是可以,不过这个些编程对我来说还有些难。
jinxin8866会不会做个内挂DLL来实现这些功能?

我能做的是等xcpk格式分析出来后,在外部对xcpk文件作修改。

solidji 发表于 2010-4-27 00:36

XCPK的格式我也大概看了下,结构并不复杂,就是分支跳转多一点
我在找更简洁些的解压接口,应该是有的

我们可以把XPCK的明文全部DUMP出来,你修改好之后,挂个DLL写回去
这个不难
分析道这种程度,理论上来说SL2的汉化确定是可以了
剩下一些程序上的细节,明天继续。。

shane007 发表于 2010-4-27 08:00

加油!

如果在exe加内挂的话,最好在正式版的exe上做。
能否在xcengine.dll里面加内挂呢?

xcengine.dll----->proxy.dll.decoding()--->decode.decoding()

solidji 发表于 2010-4-28 18:31

rererererer


xcengine.dll----->proxy.dll、
为xcengine.dll做代理是很难实现的,没有开放接口的开发库,最多模仿个类指针来调用一下
关键又是由类似COM接口的对象注册方式,整个解压流程都是以对象方法来调用的

注释的那两个就是XcFileZip和XcBitmap对象
10020316|.8B7C24 18         mov edi,dword ptr ss:
1002031A|>8B4E 10         mov ecx,dword ptr ds:
1002031D|.8B01            mov eax,dword ptr ds:
1002031F|.8B40 34         mov eax,dword ptr ds:
10020322|.6A 04             push 4
10020324|.8D5424 1C         lea edx,dword ptr ss:
10020328|.52                push edx                                                      ;//前面比较过是否XCPK头
10020329|.FFD0            call eax                                                      ;// ::Read
1002032B|.85C0            test eax,eax                                                    ;//根据长度与名字Yellowjacket 18读取完整的xpck文件
1002032D|.^ 0F85 55FFFFFF   jnz xcEngine.10020288                     ;//本次是读取39B3,到88 A9 4E 03,在往下正好是下个XCPK头
上面方法本身类结构
003EDF50BC 8E 0A 10 00 00 00 00 03 00 03 00 01 00 00 00紟..........
003EDF6000 00 00 00 04 00 00 00 90 B0 12 00 01 00 00 00.......惏....
003EDF7088 A9 4E 03 00 00 01 00 B3 39 00 00 D0 54 4E 03埄N...?..蠺N
88 A9 4E 03 指向从Sl2fnt.dat读进来并XOR之后的内容,B3 39 00 00 本次读取长度,D0 54 4E 03 指向返回类

返回类指针指向结构
034E54D09D A9 4E 03 9E 39 00 00 15 00 00 00 4C B0 12 00潻N?.....L?.
034E54E000 00 00 00 08 00 00 00 00 00 00 00 D8 82 4E 03...........貍N
034E54F000 6E 07 10 20 6E 07 10 00 00 00 00 05 00 00 00.n n.......
9D A9 4E 03 表示目前未读的缓冲区指针,9E 39 00 00为剩下长度,15 00 00 00 表示已经解压长度,4C B0 12 00解压缓冲区尾指针

这里可以看到读取地址根据之前的GMGB文件来获取

02220C98B7 39 00 00 CF 7A 40 00 2F 45 58 54 44 41 54 41?..蟴@./EXTDATA
02220CA853 46 4F 4E 54 2F 59 45 4C 4C 4F 57 4A 41 43 4BSFONT/YELLOWJACK
02220CB845 54 20 31 38 2E 46 52 00 00 00 00 00 00 00 00ET 18.FR........
0012ADF8    00501684/CALL 到 SetFilePointer 来自 SL2.0050167E
0012ADFC    00000690|hFile = 00000690 (window)
0012AE00    00407ACF|OffsetLo = 407ACF (4225743.)
0012AE04    0012AE18|pOffsetHi = 0012AE18
0012AE08    00000000\\Origin = FILE_BEGIN


接下来看看XCPK文件解压前的结构
10020431|> /8B4E 10         /mov ecx,dword ptr ds:
10020434|. |8B11            |mov edx,dword ptr ds:
10020436|. |8B52 34         |mov edx,dword ptr ds:
10020439|. |6A 08             |push 8
1002043B|. |8D4424 2C         |lea eax,dword ptr ss:
1002043F|. |50                |push eax
10020440|. |FFD2            |call edx                                                       ;XCTGX
10020442|. |85C0            |test eax,eax
10020444|.^|0F85 3EFEFFFF   |jnz xcEngine.10020288
1002044A|. |817C24 28 5843544>|cmp dword ptr ss:,47544358
10020452|. |0F85 81010000   |jnz xcEngine.100205D9
10020458|. |8B46 10         |mov eax,dword ptr ds:
1002045B|. |8B4C24 2C         |mov ecx,dword ptr ss:
1002045F|. |8B40 14         |mov eax,dword ptr ds:
10020462|. |03C1            |add eax,ecx
10020464|. |894424 24         |mov dword ptr ss:,eax
10020468|. |894C24 1C         |mov dword ptr ss:,ecx
1002046C|> |8B4E 10         |/mov ecx,dword ptr ds:
1002046F|. |8B11            ||mov edx,dword ptr ds:
10020471|. |8B52 34         ||mov edx,dword ptr ds:
10020474|. |6A 08             ||push 8
10020476|. |8D4424 34         ||lea eax,dword ptr ss:
1002047A|. |50                ||push eax
1002047B|. |FFD2            ||call edx                                                      ;//Read 依次读取标记字符(bits,name,flag,wdth,hgth,fmt ...)
1002047D|. |85C0            ||test eax,eax
1002047F|.^|0F85 03FEFFFF   ||jnz xcEngine.10020288
10020485|. |8B46 10         ||mov eax,dword ptr ds:
10020488|. |8B0B            ||mov ecx,dword ptr ds:
1002048A|. |8B5424 18         ||mov edx,dword ptr ss:
1002048E|. |8B78 14         ||mov edi,dword ptr ds:
10020491|. |8B0C0A            ||mov ecx,dword ptr ds:
10020494|. |8B01            ||mov eax,dword ptr ds:
10020496|. |8B40 08         ||mov eax,dword ptr ds:
10020499|. |037C24 34         ||add edi,dword ptr ss:
1002049D|. |56                ||push esi
1002049E|. |8D5424 34         ||lea edx,dword ptr ss:
100204A2|. |52                ||push edx
100204A3|. |FFD0            ||call eax                                                      ;// LoadChunk 根据标记字符读取一个块并解压
100204A5|. |8B4E 10         ||mov ecx,dword ptr ds:
100204A8|. |8B11            ||mov edx,dword ptr ds:
100204AA|. |8B42 3C         ||mov eax,dword ptr ds:
100204AD|. |6A 00             ||push 0
100204AF|. |57                ||push edi
100204B0|. |FFD0            ||call eax
100204B2|. |8B46 34         ||mov eax,dword ptr ds:
100204B5|. |B9 F8FFFFFF       ||mov ecx,-8
100204BA|. |2B4C24 34         ||sub ecx,dword ptr ss:
100204BE|. |014C24 2C         ||add dword ptr ss:,ecx
100204C2|. |85C0            ||test eax,eax
100204C4|. |74 49             ||je short xcEngine.1002050F
100204C6|. |DB4424 14         ||fild dword ptr ss:
100204CA|. |8B4C24 2C         ||mov ecx,dword ptr ss:
100204CE|. |85C9            ||test ecx,ecx
100204D0|. |8B56 38         ||mov edx,dword ptr ds:
100204D3|. |DC05 A0570B10   ||fadd qword ptr ds:
100204D9|. |52                ||push edx
100204DA|. |DB4424 30         ||fild dword ptr ss:
100204DE|. |7D 06             ||jge short xcEngine.100204E6
100204E0|. |D805 38580B10   ||fadd dword ptr ds:
100204E6|> |DA7424 20         ||fidiv dword ptr ss:
100204EA|. |51                ||push ecx
100204EB|. |DEE9            ||fsubp st(1),st
100204ED|. |DC0D 20590B10   ||fmul qword ptr ds:
100204F3|. |DA7424 18         ||fidiv dword ptr ss:
100204F7|. |D95C24 28         ||fstp dword ptr ss:
100204FB|. |D94424 28         ||fld dword ptr ss:
100204FF|. |D91C24            ||fstp dword ptr ss:
10020502|. |FFD0            ||call eax
10020504|. |83C4 08         ||add esp,8
10020507|. |85C0            ||test eax,eax
10020509|.^|0F85 92FDFFFF   ||jnz xcEngine.100202A1
1002050F|> |837C24 2C 00      ||cmp dword ptr ss:,0
10020514|.^|0F87 52FFFFFF   |\\ja xcEngine.1002046C

"XCPK" "bits" len <bits内容,也就是之前dump下来的字库块> "name" len <文件名Yellowjacket 18.en > "flag" <字库的像素度,长宽等信息>........."XCPK"(下一个XCPK文件头)

先Read到字符串"bits",然后把"bits"作为参数LoadChunk 实际内容,然后一直循环到结尾

solidji 发表于 2010-4-28 18:57

说得比较混乱,不过相关代码和结构都提了下,自己跟一下应该就清楚了
总结XCPK文件就是
xcpk bits bitslen (一段bits具体内容) name namelen (文件名Yellowjacket 18.en)....
这样一直到结尾遇到下个xcpk 字符
分析差不多就这样了,代码怎么写,怎么来打这个钩子有空QQ上讨论分工下吧
我最近都没太多时间coding

shane007 发表于 2010-4-28 19:11

收到,我先仔细看一下。

shane007 发表于 2010-4-28 19:20

我想先提个问题。
游戏里可能有不少XCPK格式的图片,不仅仅是图片字库。
我们把内挂打上去以后,如何来替换呢?
如何判断哪个图片是哪个呢?

canmover 发表于 2010-5-10 17:55

jinxin8866,你是怎么把图片从内存Dump出的?

solidji 发表于 2010-5-17 14:57

rerererere

解压部分最后的程序看来没人接上,看我有没有时间补完吧

另外我一直研究的通用代理D3D的汉化方式,有了关键性的突破,已经能完整在自己的设备窗口重现游戏字幕了
如图



SL2也是可以用这种方式搞定的,剩下的是将文字数据做MD5与中文数据映射
最终易用性和性能上如何优化还待定,欢迎各位汉化前辈多给建议

shane007 发表于 2010-5-17 17:08

看到楼上有了关键性的突破真是非常高兴,期待早日放出相关的程序和工具,早日开工。
页: 1 2 3 [4] 5
查看完整版本: 关于静物2的分析