nlist-Mach-O文件重定向信息数据结构分析

0x00 摘要

在研究Mach-O的重定向相关内容时,就一定会遇到nlist这个数据结构,他定义在文件中,简单的对头文件中的注释做了翻译和整理,体现在图上面,nlist的数据结构看似非常简单,使用的时候却有点复杂,理解nlist的数据结构是进一步对OSX内核进行分析非常重要的一步。

nlist分析图

0x01 简单介绍

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
struct nlist {
union {
#ifndef __LP64__
char *n_name; /* for use when in-core */
#endif
uint32_t n_strx; /* index into the string table */
} n_un;
uint8_t n_type; /* type flag, see below */
uint8_t n_sect; /* section number or NO_SECT */
int16_t n_desc; /* see <mach-o/stab.h> */
uint32_t n_value; /* value of this symbol (or stab offset) */
};

/*
* This is the symbol table entry structure for 64-bit architectures.
*/

struct nlist_64 {
union {
uint32_t n_strx; /* index into the string table */
} n_un;
uint8_t n_type; /* type flag, see below */
uint8_t n_sect; /* section number or NO_SECT */
uint16_t n_desc; /* see <mach-o/stab.h> */
uint64_t n_value; /* value of this symbol (or stab offset) */
};

1.1 n_type

n_type拥有8个bit,他的分配如下。

1
2
3
4
5
6
7
8
/*
* The n_type field really contains four fields:
* unsigned char N_STAB:3,
* N_PEXT:1,
* N_TYPE:3,
* N_EXT:1;
* which are used via the following masks.
*/

N_TYPE又分出好多种,具体的定义可以参见上面的思维导图,或者源码中的注释。

n_type字段主要用来标识重定义符号不同的种类。

1.2 n_desc

n_desc的用法与n_type类似,也是被掩码切分成好多块,分别表示不同的含义。用来标识重定义符一些特性。

1.3 n_value

n_value值的具体意义根据n_typen_sect的变化,而拥有各自不同的含义。

0x02 小结

其实中的注释已经解释的非常清楚了,在阅读本文之后,结合思维导图阅读源码文件,不仅可以减少理解的时间,而且可以更加系统的去理解nlist数据结构,或者有目的性的阅读与当前需求相关的部分。

文章目录
  1. 1. 0x00 摘要
  2. 2. 0x01 简单介绍
    1. 2.1. 1.1 n_type
    2. 2.2. 1.2 n_desc
    3. 2.3. 1.3 n_value
  3. 3. 0x02 小结
,