222011
 

 

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

 

 
首先,用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:SwdCFTextOn_LineMainA�000.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] != 0x80
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类型数值如果不分别是0x00x80,程序就会fclose然后退出读取,所以开头两个long类型数值必定为0x00x80
再根据fseek处,参数lOffsetesi为常量0x800x60EEB6mov esi,80),故在索引和数据中间应该还要有0x70个空字节

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

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

 

 

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

 

 

  有14 条回复 被发表在“【MOD开发】《云之遥》最新版本MOD开发工具 & 脚本压缩格式揭秘” 页面

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

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

  3. 学弟给力啊!

  4. 这个软件打不开,不知道是不是跟360有关

  5. 可以放出离线版本体和各种篇的全部的脚本吗,或者放出脚本解压解密工具也可以啊,很想收藏

  6. 大神,请问能不能做一个明星志愿3的脚本MOD制作工具,我看游戏文件夹中的脚本文件和云之遥脚本文件名字是一样的,可以有偿,求帮助

  7. 大神讲解一下脚本怎么逆向可以吗,想改明星志愿3QAQ

 发表评论

(required)

(required)

你可以使用下列HTML标签和属性:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>