※※※※※※《云之遥》脚本压缩格式分析※※※※※※

 

 
首先,用HEX工具任意打开一个脚本文件,在文件末尾可以看到如下HEX数据: 
11 00 00
 
 
这是什么?当然是LZO的标识了,往上面看,很明显,越往后面走,数据可识别性越差,因此这里可以大胆猜测脚本文件采用了LZO压缩,究竟是不是LZO压缩,我们可以尝试用LZO来解压一下试下 

  

 以《云之遥》繁体版V2.3.0脚本文件0000.C01为例,选择0x80h0x218BF7,存入一个新文件,然后利用MiniLZO尝试进行解压,结果返回值为LZO_E_OK即成功解压,再用HEX工具打开解压后的文件,发现很多东西已经明码显示,这证明《云之遥》的脚本就是采用了LZO压缩 

 

接下来是索引信息问题,首先通过直接观察可以发现(仍以0000.C01为例),0x8h处的一个long类型数值恰好是解压后的脚本文件大小,0xCh处的一个long类型数值恰好是解压前的脚本文件大小(不带索引信息),打开其他脚本文件,发现情况完全相同,所以这里可以确定这两个数值分别为解压后的大小和解压前的大小

  

前面还有2个数值,那又是做什么用的呢?所有文件都是一样的,只能调试分析了。

 

OD载入云之遥主程序,分别下断点CreateFileWReadFile,并对读入的数据设置硬件访问断点,可以很快定位到这段代码,整理后:

0060EE9A    53              push    ebx
0060EE9B    55              push    ebp
0060EE9C    56              push    esi
0060EE9D    57              push    edi
0060EE9E    68 44997B00     push    007B9944                                    ; ASCII “rb”
0060EEA3    50              push    eax
0060EEA4    E8 1B251200     call    007313C4
0060EEA9    8BD8            mov     ebx, eax
0060EEAB    83C4 08         add     esp, 8
0060EEAE    85DB            test    ebx, ebx
0060EEB0    0F84 88010000   je      0060F03E                                    ; if fp=fopen(“E:\SwdCF\Text\On_Line\MainA\0000.C01″, “rb”) != NULL
0060EEB6    BE 80000000     mov     esi, 80
0060EEBB    B9 1E000000     mov     ecx, 1E
0060EEC0    33C0            xor     eax, eax
0060EEC2    8D7C24 20       lea     edi, dword ptr [esp+20]
0060EEC6    C74424 18 00000>mov     dword ptr [esp+18], 0
0060EECE    897424 1C       mov     dword ptr [esp+1C], esi
0060EED2    F3:AB           rep     stos dword ptr es:[edi]
0060EED4    53              push    ebx
0060EED5    6A 01           push    1
0060EED7    8D4C24 20       lea     ecx, dword ptr [esp+20]
0060EEDB    56              push    esi
0060EEDC    51              push    ecx
0060EEDD    E8 DA231200     call    007312BC                                    ; fseek(fp, esi, 1)
0060EEE2    83C4 10         add     esp, 10
0060EEE5    83F8 01         cmp     eax, 1
0060EEE8    74 16           je      short 0060EF00
0060EEEA    53              push    ebx
0060EEEB    E8 F21B1200     call    00730AE2
0060EEF0    83C4 04         add     esp, 4
0060EEF3    32C0            xor     al, al
0060EEF5    5F              pop     edi
0060EEF6    5E              pop     esi
0060EEF7    5D              pop     ebp
0060EEF8    5B              pop     ebx
0060EEF9    81C4 8C010000   add     esp, 18C
0060EEFF    C3              retn
0060EF00    397424 1C       cmp     dword ptr [esp+1C], esi                     ; if [esp+1C] != 0×80
0060EF04    74 16           je      short 0060EF1C
0060EF06    53              push    ebx
0060EF07    E8 D61B1200     call    00730AE2                                    ; fclose(fp)
0060EF0C    83C4 04         add     esp, 4
0060EF0F    32C0            xor     al, al
0060EF11    5F              pop     edi
0060EF12    5E              pop     esi
0060EF13    5D              pop     ebp
0060EF14    5B              pop     ebx
0060EF15    81C4 8C010000   add     esp, 18C
0060EF1B    C3              retn
0060EF1C    8B4424 18       mov     eax, dword ptr [esp+18]
0060EF20    85C0            test    eax, eax
0060EF22    74 16          je      short 0060EF3A                              ; if [esp+18] != 0
0060EF24    53              push    ebx
0060EF25    E8 B81B1200     call    00730AE2                                    ; fclose(fp)

 

很明显,如果开始两个long类型数值如果不分别是0×00×80,程序就会fclose然后退出读取,所以开头两个long类型数值必定为0×00×80
再根据fseek处,参数lOffsetesi为常量0×800x60EEB6mov esi,80),故在索引和数据中间应该还要有0×70个空字节

因此,脚本文件结构就非常明显了,如下:

 

脚本文件索引头信息为四个long型数值,分别为0×0(常量),0×80(常量),lDecompressedSize(解压后大小),lCompressedSize(解压前大小),紧接着是0×70个空字节,后面就是压缩的脚本文件数据了

 

 

至于进一步的脚本反编译,这里不作探讨

 

 

7 回应 到 “【MOD开发】《云之遥》最新版本MOD开发工具 & 脚本压缩格式揭秘”

  1. sfeed 说道:

    能不能抽空做个新手视频什么的?

  2. xjboss 说道:

    求云之遥石皮解补丁 蛋疼的全程在线

  3. 轩辕剑云 说道:

    学弟给力啊!

  4. 春风朝露 说道:

    这个也是基于LUA吧

回复

(必须)

(必须)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2012 MaYaFei's StuDio Suffusion WordPress theme by Sayontan Sinha