2019-11-05-Lucifen脚本结构初读

*.sob

010 editor脚本(*.1sc)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//------------------------------------------------
//--- 010 Editor v8.0.1 二进制模板
//
// File:
// Authors:
// Version:
// Purpose:
// Category:
// File Mask:
// ID Bytes:
// History:
//------------------------------------------------
#define u8 unsigned char
#define u32 unsigned long


struct MainSobHeader{
char magic[4]; //"SOB0"
int init_table_len;
};
MainSobHeader hdr;


//之下到code之前全部是各种导入、重定位表
u32 init_var_count;
struct InitVar{
u32 code_offset; //在code中的偏移
u32 var_index; //UserVar的idx
}; //将idx在UserVar.sob中的地址写入code中的指定位置
InitVar init_vars[init_var_count];

u32 func_addr_count;
struct InitAddr{
u32 code_offset;
u32 func_tbl_idx; //exe函数地址表偏移
}; //相当于PE文件导入表,将code指定位置填入exe中的地址
InitAddr init_addrs[func_addr_count];

u32 unk_count;
struct UnkReloc{
u32 code_offset;
u32 unk_idx;
};
UnkReloc unk_reloc[unk_count];

u32 unk_count; //似乎是从func_lib.sob导入的函数(in VM)
struct UnkReloc1{
u32 code_offset;
u32 unk_offset;
};
UnkReloc1 unk_reloc[unk_count];

u32 main_reloc_count;
struct MainRelocEntry{
u32 code_offset_dest;
u32 code_offset_src; //这是相对code+res段的偏移,运行时计算出绝对地址填入指定位置
};
MainRelocEntry main_relocs[main_reloc_count];

u32 code_len;
u32 code_and_res_len;
u8 code[code_len];
u8 res[code_and_res_len-code_len];

对比可知脚本在最尾部

偏移重点在MainRelocEntry,如s01_01a.sob的code_offset_src固定,为res开始的地址到最尾部。

1572945944908

而code_offset_dest不同,再研究,肯定是剧本的某种偏移