段类名用类名(例如CODE,FAR_DATA或STACK)标识段。链接器将具有相同类名的段放置到运行时内存映射中的连续内存区域中。
IDA具有以下预定义的段类名:
CODE - Pure code
DATA - Pure data
CONST - Pure data
BSS - Uninitialized data
STACK - Uninitialized data
XTRN - Extern definitions segment
据我所知,某个段已经提供了所有相关信息。
段类名称的确切目的(或适用用法)是什么? IDA如何在内部利用它?
#1 楼
我浏览了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类)。
#2 楼
此外,尽管权限或多或少是标准化的,并且可以告知您在段中找到的数据/代码的类型,但请记住,如果您在谈论恶意软件分析,则不能保证段上的权限就是您所期望的。更不用说,除了非标准内存使用率之外,经常还会发生大量的标头篡改。实际上,这通常可以告诉您某些东西是用汇编语言编写的,还是用工具修改过的,还是用其他某种语言编译的。
#3 楼
除权限外,细分类型之间也存在差异。例如,XTRN用于在反汇编视图中显示要导入的粉红色区域。我想信息还可以在IDA的自动分析阶段为代码,数据和const段提供帮助。代码部分中的元素更有可能是代码而不是数据,反之亦然。
堆栈的显示和处理方式显然很不相同。
评论
@Nirlzr“我想信息在代码,数据和const段的自动分析阶段还可以帮助IDA”。
– PSS
13年7月6日在19:30