IDA:段类名称

逆向工程 拆卸 艾达
2021-07-08 06:36:16

根据IDA 在线帮助

段类名用类名(例如 CODE、FAR_DATA 或 STACK)标识段。链接器将具有相同类名的段放入运行时内存映射中的连续内存区域。

IDA 具有以下预定义的段类名称:

    CODE    -       Pure code
    DATA    -       Pure data
    CONST   -       Pure data
    BSS     -       Uninitialized data
    STACK   -       Uninitialized data
    XTRN    -       Extern definitions segment

据我所知,对某个细分市场的许可已经提供了所有相关信息。Segment Class Name的确切用途(或适用用法)是什么?IDA 如何在内部使用它?

3个回答

我已经查看了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 类)。

此外,虽然权限或多或少是标准化的,并且可以告知您在段中找到的数据/代码的类型,但请记住,如果您谈论的是恶意软件分析,则无法保证段上的权限是您所期望的.

更不用说除了非标准内存使用之外,通常还有相当数量的标头篡改。事实上,这通常是您如何判断某些东西是用汇编编写的、被工具破坏的还是从其他语言编译的。

除权限外,段类型之间存在差异。例如,XTRN 用于在反汇编视图中显示导入的粉红色区域。我想这些信息也有助于 IDA 在代码、数据和常量段的自动分析阶段。代码部分中的元素成为代码的可能性高于数据,反之亦然。堆栈的显示和处理方式显然非常不同。