ls的解压本坛有工具,但压缩的没有。github上也能搜到解压的代码
又看了一下主程序代码和他人的文档,可以使用解压后的文件,需要对r3文件作拼接和修改。
读取资源、解压缩在这里
seg001:2080 ; 从文件读资源
seg001:2080 ; Attributes: bp-based frame
seg001:2080
seg001:2080 ; int __stdcall __far s_ReadFileByIndex(int handle, int buff, int seg, int index)
seg001:2080 s_ReadFileByIndex proc far ; CODE XREF: sub_10F74+30P
seg001:2080 ; sub_111D8+44P ...
ls文件由10字节(以下均为16进制)文件头,100字节压缩字典,压缩节表C * N,分节的压缩数据构成
压缩节表在110这个位置,每个节由C字节构成,最后以2字节00收尾
每节表的信息:
seg001:20B8 8D 86 F8 FB lea ax, [bp+var_408] ; 之前猜测有误,这个是压缩的节表
seg001:20B8 ; 每节信息是数组变量,长度C,存读出来的数据
seg001:20B8 ; 前4个为压缩后长度,如0000 20e4表示压缩后长度20e4
seg001:20B8 ; 中4个为压缩前长度,如0000 3900,表示压缩前长度3900
seg001:20B8 ; 后4个为资源偏移,如0000 0138表示从文件0138处解压
seg001:20BC 16 push ss ; seg
seg001:20BD 50 push ax ; buff
seg001:20BE 6A 0C push 0Ch ; bytestoRead
seg001:20C0 FF 76 06 push [bp+handle] ; handle
seg001:20C3 9A D4 4F F6 0C call s_ReadFile_1
主程序是写死的
,默认就是ls文件,所以解压后的他不认
seg001:219A 8B 46 FC mov ax, [bp+var_4_beforpacked]
seg001:219D 8B 56 FE mov dx, [bp+var_2]
seg001:21A0 39 46 F8 cmp [bp+var_8_afterpacked], ax
seg001:21A3 75 16 jnz short l_F11B_need_unpack
seg001:21A5 39 56 FA cmp [bp+var_6], dx
seg001:21A8 75 11 jnz short l_F11B_need_unpack
seg001:21AA FF 76 0A push [bp+seg] ; seg
seg001:21AD FF 76 08 push [bp+buff] ; buff
seg001:21B0 50 push ax ; bytestoRead
seg001:21B1 FF 76 06 push [bp+handle] ; handle
seg001:21B4 9A D4 4F F6 0C call s_ReadFile_1
seg001:21B9 EB 0F jmp short loc_F12A
seg001:21BB ; ---------------------------------------------------------------------------
seg001:21BB
seg001:21BB l_F11B_need_unpack: ; CODE XREF: s_ReadFileByIndex+123j
seg001:21BB ; s_ReadFileByIndex+128j
seg001:21BB FF 76 0A push [bp+seg]
seg001:21BE FF 76 08 push [bp+buff]
seg001:21C1 50 push ax ; length
seg001:21C2 FF 76 06 push [bp+handle]
seg001:21C5 9A 08 20 F6 0C call s_EF68_unpack?
21A0处有比较,看节表中压缩后、压缩前数据是否相等,不等则去解压,相等则直接读。
既然是写死的,只能拼接文件了
R3文件解压缩后,原始R3文件节表之后的数据全部删除(最后一项0000之后),然后把解压后的数据拼过来。这时要改几个数据,把每一项节表的压缩后数据都改为压缩前,使21A0处比较相等,再把偏移改成解压后的
比如hexgrp原始节表
before after off
20e4 3900 0138
02a5 032f 221c
027d 04d2 24c1
改成
before after off
3900 3900 0138
032f 032f 3a38
04d2 04d2 3d67
附上修改后的hexgrp,测试是可用的。