美文网首页
Mach-O文件中如何查找到函数源码

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

作者: 无名27号 | 来源:发表于2019-08-09 16:08 被阅读0次

    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;
    
    • 1.函数名长度有长有短,所以函数名的计算方式是StringTable起始地址 + 偏移量
      1. 函数名字符串第一个字符串是"." 也就是函数名之间都是以"."分开的

    4. 间接符号表

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


    image.png

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

    5 函数与方法的区别

    函数与方法的区别如下:

    • 函数是一段指定格式的汇编代码。

    • 方法是一种特殊的函数。方法一般不接调用。是通过objc_msgsend调用。而objc_msgsend 的第一个入参即是对象。所以通常也可以说方法的调用是依赖对象的

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


    image.png

    相关文章

      网友评论

          本文标题:Mach-O文件中如何查找到函数源码

          本文链接:https://www.haomeiwen.com/subject/ktehjctx.html