希德船长 - 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的汉化组里面也有一只山口山白啊~~
只不过没山口山组那么厉害就是了。。。