美文网首页iOS开发资料收集区
利用 mach.o section 段 进行存储函数和执行

利用 mach.o section 段 进行存储函数和执行

作者: 沧海小鱼儿 | 来源:发表于2020-01-16 21:07 被阅读0次

mach.o 文件巧妙存储函数和执行

typedef enum WypValueType
{
    WypValueTypeString = 0,
    WypValueTypeFunction
} WypValueType;

typedef struct WypHeader
{
    WypValueType type;
    void *value;
}WypHeader;

typedef void (*func) (void);


__attribute((used, section("__DATA, wangyp"))) static const WypHeader value1 = (WypHeader){WypValueTypeString,"hello wordl"};

static void wangyp_fucn(void);
static void wangyp_fucn()
{
    printf("hello wangyp\n");
}
__attribute((used, section("__DATA, wangyp"))) static const WypHeader value2 = (WypHeader){WypValueTypeFunction,wangyp_fucn};


读取

    uint32_t c = _dyld_image_count();
    for (uint32_t i = 0; i < c; i++) {
        const struct mach_header* image_header = _dyld_get_image_header(i);
        Dl_info info;
        if (dladdr(image_header, &info) == 0) {
            continue;
        }
        const void *mach_header = info.dli_fbase;
        const struct section_64 *section = getsectbynamefromheader_64((void *)mach_header, "__DATA", "wangyp");
        
        if (section == NULL) {
            return;
        }
        uint16_t step = sizeof(WypHeader);
        for (uint16_t offset = section->offset; offset < section->offset + section->size; offset += step) {
            WypHeader headerP = *(WypHeader *)(mach_header + offset);
            if (headerP.type == WypValueTypeString) {
                printf("String = %s\n",(char *)headerP.value);
            }
            
            if (headerP.type == WypValueTypeFunction) {
                func f = headerP.value;
                f();
            }
        }
    }

###  用途
1.配置作用,把配置在编译时写入段中,直接从段中读取配置项。
2.函数注册

相关文章

  • 利用 mach.o section 段 进行存储函数和执行

    mach.o 文件巧妙存储函数和执行 读取

  • mach.o 文件研究系列

    mach.o 文件: 1,含有section 段,可以作为存储数据仓库;2,含有符号表,可以作为crash 分析的...

  • ASM简介(四)

    函数 我们在使用ASM相关API对函数进行操作之前,我们需要了解函数在字节码的存储格式及其执行模型。 执行模型 我...

  • sections(代码划分执行)

    每个section负责一段代码的执行,有且仅有一个线程负责执行这段代码,各个section的线程随缘启动执行。 s...

  • C中全局变量和static变量的存储与初始化

    目标文件、可执行程序及其他二进制文件以ELF格式存储在磁盘中,该文件有两个重要的段(section),即代码段和数...

  • 函数

    一:函数的概念: 就是封装了一段可被重复调用执行的代码块。 二:函数的使用: 利用函数计算1-100之间的累加和 ...

  • MySQL存储过程和存储函数

    一、存储过程 MySQL存储过程存储过程和存储函数参考文章 SQL语句需要先编译然后执行,而存储过程(Stored...

  • Linux x64下调试汇编代码

    1、将下述代码存储为sh.s,其功能为执行/bin/sh section .text global _start ...

  • 4.存储过程(一)

    1. 存储过程和函数概述 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和...

  • 存储过程

    4.1 存储过程和函数概述 存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过...

网友评论

    本文标题:利用 mach.o section 段 进行存储函数和执行

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