Mach-O文件中如何查找到函数源码

2019-08-09  本文已影响0人  无名27号

1.函数的实现存储于_TEXT 段

包括 _TEXT (汇编源码) _TEXT,_text 、 _TEXT,_Stubs 段等
其中
_TEXT,_text存储的是本地源码

_TEXT,_Stubs 存储的是共享动态库源码

2. 函数的查找依赖符号表,符号表中存储了函数名、函数源码指针等信息。

符号表的位置


image.png

3. 符号表

符号表的数据结构

struct nlist_64 {
    union {
        uint32_t  n_strx; /* 函数名在String Table中的偏移量*/
    } n_un;
    uint8_t n_type;        /* 函数集合类型 */
    uint8_t n_sect;        /* 函数源码所在的section */
    uint16_t n_desc;       /*  描述信息一般空置 */
    uint64_t n_value;      /* 函数源码地址(函数指针)*/
};
image.png

3.1 符号表查找函数源码

去_Text,text 地址 1790查找对应的函数源码信息


image.png

ret 在汇编中相当于return 标志一个函数结束

3.2 符号表查找函数名

image.png

由于函数名的偏移地址是一个双层数据结构

 union {
        uint32_t  n_strx; /* 函数名在String Table中的偏移量*/
    } n_un;

所以无法直接看出
但是根据fishhook源码可知

 //根据符号取得 字符串表(函数名)偏移量
        uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx; //可以直接在符号表中拿到符号
  //取出  取得函数名 (带点)
        char *symbol_name = strtab + strtab_offset;

4. 间接符号表

间接符号表中存储的是符号在符号表中的下标


image.png

从图上看,这个间接符号表貌似是存储了函数地址 section信息等,但是实际上只是0000087B-000007C 这个数据宽度只够存储一个下标。剩余的信息都是MachOView软件自动填充的

5 函数与方法的区别

函数与方法的区别如下:

方法的函数名为 -[类名 + 方法名]或者+[类名 + 方法名]
如图


image.png
上一篇 下一篇

猜你喜欢

热点阅读