一次对Wallpaper Engine的pkg文件的解压过程

Author Avatar
混淆者· 2018年12月23日 本文共计3321字|已被浏览803次
  • 在其它设备中阅读本文章

问题开始

咳咳
今天心血来潮想解包WE的壁纸
(我才不会告诉你我是想收R-18壁纸里面的图呢)
Wallpaper Engine的壁纸目录在
SteamLibrary\steamapps\workshop\content\
打开以后发现是scene.pkg占用主要大小
遂分析该文件


方法1(无效)

CSDN论坛找到一个解包Pkg的方法(测试无效
里面的程序是采用python2编写的
直接运行会报错Memory Error
于是我更改了部分语法移植到python3
更改后的代码如下:

# -*- coding: utf-8 -*-
import sys, os, struct, zlib

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print('''Arguments :
        pkg.py pkgfile.pkg extractdir''')
    else:
        pkgfilename = sys.argv[1]
        outdirname = sys.argv[2]
        pkgfile = open(pkgfilename, 'rb')
        pkgfile.read(4)
        filenums, = struct.unpack('I', pkgfile.read(4))
        filename_table_offset, = struct.unpack('I', pkgfile.read(4))
        filename_table_len, = struct.unpack('I', pkgfile.read(4))
        pkgfile.seek(filename_table_offset)
        print('Total %d Files.'%(filenums))
        for index in range(filenums):
            name_len, = struct.unpack('H', pkgfile.read(2))
            name = pkgfile.read(name_len)
            pkgfile.read(4)
            offset, = struct.unpack('I', pkgfile.read(4))
            size, = struct.unpack('I', pkgfile.read(4))
            zlib_size, = struct.unpack('I', pkgfile.read(4))
            current_pos = pkgfile.tell()
            pkgfile.seek(offset)
            text = pkgfile.read(zlib_size)
            text = zlib.decompress(text)
            pkgfile.seek(current_pos)
            outfilename = os.path.join(outdirname, os.path.join(os.path.splitext(os.path.basename(pkgfilename))[0], name))
            print('\rProccess:%d/%d'%(index+1, filenums),end='')
            os.path.join(os.path.splitext(os.path.basename(pkgfilename))[0], name)
            if not os.path.exists(os.path.dirname(outfilename)):
                os.makedirs(os.path.dirname(outfilename))
            open(outfilename, 'wb').write(text)

运行以后报错struct.error: unpack requires a buffer of 2 bytes
判断无法正确解包


方法2

采用WinHEX打开该pkg文件后发现,在0-16字节处有PKGV0001字样
于是进行Google搜索找到一个Github项目
这个项目采用了C++撰写,使用了boost(所以你应该知道要先把这个库装上)
然后直接make就行,make无错误的话会在目录下产生一个we的可执行文件,使用--help参数可以看到具体的使用方法
然后请照着使用方法去做,应该能正确解包
(我不是作者,我也不知道会发生什么牛鬼蛇神的事情)


问题解决

我这边在我的服务器上运行出错了

PKGV0001 - 9 files
data_structure pointer: 185
[1]    19017 segmentation fault  ./we x scene.pkg

但是能够正常显示里面的文件列表

PKGV0001 - 9 files
data_structure pointer: 185
    scene.json (1574)
    models/Konachan.com - 154973 sample.json (86)
    shaders/effects/xray.vert (1245)
    materials/Konachan.com - 154973 sample.json (240)
    materials/effects/xray.json (161)
    materials/Konachan.com - 154973 sample.tex (1070349)
    materials/kugayama konoka.tex (3153556)
    effects/xray/effect.json (366)
    shaders/effects/xray.frag (1896)

目前暂时没有解决,打算换台电脑用WSL试试


相关文件

编译完成的we文件请点击这里下载

本文链接:https://blog.mnixry.cn/Technology/wallpaper-engine-unpack.html
该博客遵守 CC BY-NC-SA 4.0 协议

    Сialis
    Сialis  2019-04-09, 17:20

    Howdy! I know this is kinda off topic but I'd figured I'd ask.
    Would you be interested in exchanging links or maybe guest writing a blog article or vice-versa?
    My site discusses a lot of the same subjects as yours and I believe we could greatly benefit from
    each other. If you're interested feel free to send
    me an email. I look forward to hearing from
    you! Great blog by the way!

坐亦禅,行亦禅,一花一世界,一叶一如来,春来花自青,秋至叶飘零,无穷般若心自在,语默动静体自然。----《佛教禅语》