首页
社区
课程
招聘
[求助] 关于ZLIB 压缩算法的求助
2022-6-11 22:17 5096

[求助] 关于ZLIB 压缩算法的求助

2022-6-11 22:17
5096

如题所述,我最近在汉化一款游戏时遭遇到了困难。
游戏文本字符串是用xml格式储存的,直接用Notepad++ 打开会乱码无法正常显示.
图片描述
进过一番查询发现该文件是使用 ZLIB 算法进行了压缩
图片描述
使用offzip程序对其进行解包提取后发现,字符串已经能正常显示
图片描述
现在问题来了,如果使用offzip程序对其进行打包操作会报错,提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\Users\pengzhen\Desktop\5555\offzip>offzip.exe -a -r Language_EN.xml
 
Offzip 0.4.1
by Luigi Auriemma
电子邮件:aluigi@autistici.org
网站:aluigi.org
 
- 打开输入文件:Language_EN .xml
- 要检查的压缩数据:32 字节
- 压缩窗口位:15
- 查找偏移量:0x00000000 (0)
 
+------------+-----+------- ----------+----------+
| 十六进制偏移量 | ... | zip -> 解压缩大小/偏移量 | | 之前的空格 信息 |
+------------+-----+----------------+- ---------------------+
  0x00000008 。< reimporting 00000008.wdproj
.........
错误:压缩后的数据比原来的大0x17字节

直接无法生成XML文件,如若换做pakzip程序进行打包,哪怕在我不修改一个字符的情况下,游戏是无法正常读取语言的。
图片描述
图片描述
我想请教的问题是,在已知偏移的情况下我该如何编写打包程序,达到生成XML文件的效果,谢谢!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
C:\Users\pengzhen\Desktop\5555\offzip>offzip.exe -s Language_EN.xml
 
Offzip 0.4.1
by Luigi Auriemma
e-mail: aluigi@autistici.org
web:    aluigi.org
 
- open input file:    Language_EN.xml
- zip data to check:  32 bytes
- zip windowBits:     15
- seek offset:        0x00000000  (0)
 
+------------+-----+----------------------------+----------------------+
| hex_offset | ... | zip -> unzip size / offset | spaces before | info |
+------------+-----+----------------------------+----------------------+
  0x00000008
 
- 1 valid compressed streams found
- 0x00000000 -> 0x00000000 bytes covering the 0% of the file

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞2
打赏
分享
最新回复 (7)
雪    币: 360
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
迷茫by蝼蚁 2022-6-11 22:20
2
0
编程基础为0的小白一枚,请求大佬的帮助,谢谢!
雪    币: 267
活跃值: (620)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hypersine 2022-6-12 09:06
3
1

你既然都找到游戏xml的format specification了,为什么不加把劲用自己最熟悉的编程语言写一个解包程序呢?我不相信你真的是编程0基础,因为你干的事就不是编程小白干的。


如果是我,人生苦短,我用python。


unpack.py内容如下

#!/usr/bin/env python3
import sys, struct, zlib

with open(sys.argv[1], 'rb') as f:
    header = f.read(4)
    assert header == b'ENC\x02'

    uncompressed_size, = struct.unpack('<I', f.read(4))

    compressed_data = f.read()

    uncompressed_data = zlib.decompress(compressed_data)
    assert len(uncompressed_data) <= uncompressed_size

    with open(sys.argv[2], 'wb') as ff:
        ff.write(uncompressed_data)


pack.py内容如下

#!/usr/bin/env python3
import sys, struct, zlib

with open(sys.argv[1], 'rb') as f:
    header = b'ENC\x02'
    uncompressed_data = f.read()
    uncompressed_size = len(uncompressed_data)

    with open(sys.argv[2], 'wb') as ff:
        ff.write(header)
        ff.write(struct.pack('<I', uncompressed_size))
        ff.write(zlib.compress(uncompressed_data, level = zlib.Z_BEST_COMPRESSION))


解包代码是unpack.py,打包代码是pack.py。

# 从Language_EN.xml输出解包的Language_EN.unpack.xml
$ unpack.py Language_EN.xml Language_EN.unpack.xml

# 将Language_EN.unpack.xml重新打包为Language_EN.xml
$ pack.py Language_EN.unpack.xml Language_EN.xml


最后于 2022-6-12 09:07 被hypersine编辑 ,原因: 调整格式
雪    币: 222
活跃值: (1871)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lhglhg 1 2022-6-12 15:20
4
0
学习一下!!!
雪    币: 3726
活跃值: (3733)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2022-6-12 16:28
5
1

给你写个exe吧.

de-en-code.rar


直接修改了加密回去就行了

最后于 2022-6-12 16:28 被Mxixihaha编辑 ,原因:
上传的附件:
雪    币: 360
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
迷茫by蝼蚁 2022-6-12 21:08
6
0
hypersine 你既然都找到游戏xml的format specification了,为什么不加把劲用自己最熟悉的编程语言写一个解包程序呢?我不相信你真的是编程0基础,因为你干的事就不是编程小白干的。如果是我,人生苦短 ...
感谢回复,虽然问题没有解决,估计是我想的太简单了,按照这种方式修改的文件直接导致无法进入游戏了,直接报语言包错误,看样子还是要靠OD去分析了,还是谢谢您的回复!
雪    币: 360
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
迷茫by蝼蚁 2022-6-12 21:09
7
0
Mxixihaha 给你写个exe吧.de-en-code.rar直接修改了加密回去就行了
感谢回复,虽然问题没有解决,估计是我想的太简单了,按照这种方式修改的文件直接导致无法进入游戏了,直接报语言包错误,看样子还是要靠OD去分析了,还是谢谢您的回复!
雪    币: 360
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
迷茫by蝼蚁 2022-6-12 23:26
8
0

感谢各位的回复,问题已解决,国外论坛的大佬帮我写了个解密脚本,解密后的脚本已经成功加载,顺带贴出源码

注意,这是quickbms使用的BMS脚本

####################################
get FILESIZE asize
get FILENAME basename
idstring "ENC"
get VERSION byte
get SIZE long
string NAME p= "%s/%s.xml" decompressed FILENAME
math FILESIZE -= 8
math ZSIZE = FILESIZE
savepos OFFSET
clog NAME OFFSET ZSIZE SIZE

然后发现没有中文字库无法显示中文,又想办法去搞中文字库

游客
登录 | 注册 方可回帖
返回