# 10.通过符号表找到符号

## 一、需要用到的结构

### 1.1 懒加载符号表

懒加载符号表是再用到的时候才会进行符号绑定的表。 我们分析MachO可以发现NSLog就在这里面

![1](https://4193904735-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI8JgbGh3U6X_oedqkm%2Fsync%2F3ef42424058bc59498c95754bf6c212df29a33de.png?generation=1621265706538869\&alt=media)

### 1.2 总符号表

完整的符号表在这里

![](https://4193904735-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI8JgbGh3U6X_oedqkm%2Fsync%2F4befa9c137a45e1fa65b7ab700e89c4ec7256357.png?generation=1621265706942895\&alt=media)

### 1.3 间接符号表

在懒加载符号表中，我们发现，都有个`Indirect Pointer`。 这就说名这里是间接符号。 先在我们来到间接符号表：

![](https://4193904735-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI8JgbGh3U6X_oedqkm%2Fsync%2Fe0e7b2679b256b3bb38155d8b108e22aaf967879.png?generation=1621265706660877\&alt=media)

我们可以发现这里面和懒加载符号表中标有`Indirect Pointer`的有对应关系。

### 二、找到NSLog的符号

在`IndirectSymbols`中我们找到NSLog。

![](https://4193904735-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI8JgbGh3U6X_oedqkm%2Fsync%2F66f942a5a2d549d5547503c46fa91f44186b3d3c.png?generation=1621265706310162\&alt=media)

#### 2.1 Data=000000B8

这里的值代表了当前间接符号在总表中的下标。我们换算一下十进制：`184`

#### 2.2 Symbols

找到下标184的，Data为`000000CE`，description:`String table index`。也就是`String Table`的下标。

#### 2.3 StringTables

来到`StringTable`，第一个地址为`00011230`，我们加上下标`000000CE`，得到`0x112FE`

![](https://4193904735-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI8JgbGh3U6X_oedqkm%2Fsync%2F138f90e9def4149d329832e58f8a0ea8e27878db.png?generation=1621265706195798\&alt=media)

这里我们就找到了`_NSLog`

## 三、fishhook是和我们这种反向的一个过程

[11.fishhook原理](https://ryukiedev.gitbook.io/wiki/ni-xiang/11.fishhook-yuan-li)
