KeyFansClub

首页 » - 同人讨论区 - » 综合同人区 » th09(东方花映塚)文件提取器 试作型 (充当生日礼物的东西)
希德船长 - 2006/7/8 1:17:00
仅以此不完善的东西献给MIKA前辈,大头前辈和其他所有这阵子过生日的人们。


[URL=upload/KFCFile9497_th09file.zip]th09(东方花映塚)文件提取器 试作型[/URL]

提取结果为 一部分图片,音效, 结局脚本和其他各种子文件包
我觉得这东西比th075的提取器要难做得多。

此物不完善之处有三:
1。只能提取,无法把提取的东西再压回去。
2。提取出的文件中仍有一部分是打包的格式(例如.anm),无法进一步提取
3。只对1.50a版游戏做过少量测试,其他版本未测试过。

我会针对以上三点继续完善,如果有强人先我一步把th09的文件解析做完了,还希望能为在下鉴定一下这东西的正确性。

这阵子因为毕业论文,答辩和离校忙得不可开交,离校后又没法上网,结果长眠了将近两个月。
昨天刚拉了铁通的线路,看见有这么多人过生日,就来祝贺一下。
wzwzw - 2006/7/15 15:59:00
想要永夜超的提取器
撒旦 - 2006/7/18 22:46:00
=.=

TH09的提取以及合并程序早在半年前就做出来了……

其实TH09的加密算法和TH08的一模一样……就是加密参数不同而已。

在做TH08汉化的时候就已经写好的TH09的解码程序……

可惜现在渔场汉化组集体偷懒中……不知道啥时候才做th09的汉化……
撒旦 - 2006/7/18 22:54:00
def deobfuscate(src, xorval, xoradd, blocksize, changesize):
    src = array('B', src)
    dest = array('B', src)
    size = len(src)
   
    restsize = size % blocksize
    if restsize >= blocksize / 4: restsize = 0
    restsize += (size & 1)

    size -= restsize

    src_idx = 0
    dest_idx_block = 0

    while changesize > 0 and size > 0:
        if size < blocksize:
            blocksize = size

        dest_idx_block += blocksize

        dest_idx = dest_idx_block - 1
        for nothing in range((blocksize + 1) >> 1):
            dest[dest_idx] = src[src_idx] ^ xorval
            xorval = (xorval + xoradd) % 256
            dest_idx -= 2
            src_idx += 1

        dest_idx = dest_idx_block - 2
        for nothing in range(blocksize >> 1):
            dest[dest_idx] = src[src_idx] ^ xorval
            xorval = (xorval + xoradd) % 256
            dest_idx -= 2
            src_idx += 1

        size -= blocksize
        changesize -= blocksize

    size += restsize
    assert dest_idx_block == src_idx
    assert size == len(src) - src_idx
    return dest

class reader(object):
    def __init__(self, infile):
        self.infile = infile

    def read_entries(self):
        (magic, blob) = struct.unpack('<4s12s', self.infile.read(16))

        check.equal('Magic number', magic, 'PBGZ')

        blob = deobfuscate(blob, 0x1B, 0x37, 12, 1024)

        (num_entries, index_offset, index_size_unpacked
        ) = struct.unpack('<LLL', blob)

        num_entries -= 123456
        index_offset -= 345678
        index_size_unpacked -= 567891

        print '%s files' % num_entries

        self.infile.seek(0, 2)
        filesize = self.infile.tell()

        self.infile.seek(index_offset)
        index_size_packed = filesize - index_offset
        packed_index = array('B')
        packed_index.fromfile(self.infile, index_size_packed)

        packed_index = deobfuscate(packed_index, 0x3E, 0x9B, 128, 1024)

        index = array('B', 'x' * index_size_unpacked)
        lzss.decompress(packed_index, index)

        entries = self.parse_index(index, num_entries)

        end_entry = dat.entry()
        end_entry.offs = index_offset
        for e, next_e in util.iterate_pairs(itertools.chain(entries, [end_entry])):
            e.packed_size = next_e.offs - e.offs
            print '%s: offs %s, packed size %s, unpacked size %s, flags %s'                  % (e.name, e.offs, e.packed_size, e.size, e.flags)
            yield e

    def parse_index(self, index, num_entries):
        entry_pos = 0
        for nothing in range(num_entries):
            name_len = 0
            while index[entry_pos + name_len]:
                name_len += 1

            e = dat.entry(self)
            e.name = index[entry_pos : entry_pos + name_len].tostring()
            (e.offs, e.size, e.flags) = struct.unpack('<LLL',index[entry_pos+name_len+1:entry_pos + name_len + 13])
            entry_pos += name_len + 13
            yield e

    def read_compressed(self, entry):
        self.infile.seek(entry.offs)
        entry.packed = array('B')
        entry.packed.fromfile(self.infile, entry.packed_size)

    def decompress(self, entry):
        entry.data = array('B', 'x' * entry.size)
        lzss.decompress(entry.packed, entry.data)
        if entry.data[:3].tostring() == 'edz':
            print chr(entry.data[3])
            entry.data = deobfuscate(entry.data[4:],*obfuscations[chr(entry.data[3])])


关键的解码就这些了……
airzhangfish - 2006/7/20 9:19:00
渔场汉化组暂时等同于渔场山口山组....
char1aznable - 2006/7/20 10:46:00
上浮的章鱼ip=欧洲的ip

kfc的汉化组里面也有一只山口山白啊~~

只不过没山口山组那么厉害就是了。。。
1
查看完整版本: th09(东方花映塚)文件提取器 试作型 (充当生日礼物的东西)