我已经查看了IDA SDK,特别是segment.hpp文件,这就是我想出来的。IDA 有 12 种基于内核处理这些段类型定义的段类型。此外,还有几个“假”段,IDA 假定这些段不包含代码或数据。因此,这些完全被排除在拆卸之外。这是定义段类型的方式:
/* 94 */ uchar type; // Type of the segment. The kernel treats different
// segment types differently.
// Segments marked with '*' contain no instructions
// or data and are not declared as 'segments' in
// the disassembly.
#define SEG_NORM 0 // Unknown type, no assumptions
#define SEG_XTRN 1 // * segment with 'extern' definitions
// no instructions are allowed
#define SEG_CODE 2 // code segment
#define SEG_DATA 3 // data segment
#define SEG_IMP 4 // java: implementation segment
#define SEG_GRP 6 // * group of segments
#define SEG_NULL 7 // zero-length segment
#define SEG_UNDF 8 // undefined segment type (not used)
#define SEG_BSS 9 // uninitialized segment
#define SEG_ABSSYM 10 // * segment with definitions of absolute symbols
#define SEG_COMM 11 // * segment with communal definitions
#define SEG_IMEM 12 // internal processor memory & sfr (8051)
段的类按以下方式“映射”到其类型:
// "CODE" -> SEG_CODE
// "DATA" -> SEG_DATA
// "CONST" -> SEG_DATA
// "STACK" -> SEG_BSS
// "BSS" -> SEG_BSS
// "XTRN" -> SEG_XTRN
// "COMM" -> SEG_COMM
// "ABS" -> SEG_ABS
此外,我发现权限实际上是由特定的加载器模块“确定”和设置的,这些加载器模块还会根据加载文件的细节设置段类型(ergo 类)。