dlopen 和 dlsym 动态调用函数
dlopen 和 dlsym 动态调用函数
iOS/MacOSX/移动安全 exchen 2年前 (2018-08-20) 2997浏览 0评论
Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS 和 iOS 上也支持。
dlopen 打开一个库,获取句柄。
dlsym 在打开的库中查找符号的值。
dlclose 关闭句柄。
dlerror 返回一个描述最后一次调用dlopen、dlsym,或 dlclose 的错误信息的字符串。
动态调用 printf 函数,编写测试代码如下:
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 26 27 28 29 30 31 32 33 34 35 36 37 |
#import <dlfcn.h> typedef int (*printf_func_pointer) (const char * __restrict, ...); void dynamic_call_function(){ //动态库路径 char *dylib_path = "/usr/lib/libSystem.dylib"; //打开动态库 void *handle = dlopen(dylib_path, RTLD_GLOBAL | RTLD_NOW); if (handle == NULL) { //打开动态库出错 fprintf(stderr, "%s\n", dlerror()); } else { //获取 printf 地址 printf_func_pointer printf_func = dlsym(handle, "printf"); //地址获取成功则调用 if (printf_func) { int num = 100; printf_func("Hello exchen.net %d\n", num); printf_func("printf function address 0x%lx\n", printf_func); } dlclose(handle); //关闭句柄 } } int main(int argc, char * argv[]) { @autoreleasepool { dynamic_call_function(); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } |
在手机上运行的输出结果如下:
1 2 |
Hello exchen.net 100 printf function address 0x189f0da78 |
转载请注明:exchen's blog » [iOS Hacker] dlopen 和 dlsym 动态调用函数
补充dlsym():
获取新符号
进程可以使用 dlsym(3C) 获取特定符号的地址。此函数采用句柄和符号名称,并将符号地址返回给调用方。该句柄通过以下方式指示符号搜索:
#include <stdio.h>#include <dlfcn.h>main(){void * handle;int * dptr, (* fptr)();if ((handle = dlopen("foo.so.1", RTLD_LAZY)) == NULL) {(void) printf("dlopen: %s\n", dlerror());exit (1);}if (((fptr = (int (*)())dlsym(handle, "foo")) == NULL) ||((dptr = (int *)dlsym(handle, "bar")) == NULL)) {(void) printf("dlsym: %s\n", dlerror());exit (1);}return ((*fptr)(*dptr));} |
首先会在文件 foo.so.1 中搜索符号 foo 和 bar,然后在与此文件关联的所有依赖项中搜索。接下来,在 return() 语句中使用单个参数 bar 调用函数 foo。
使用前面的文件 main.c 生成的应用程序 prog 包含下列依赖项。
dlopen 和 dlsym 动态调用函数相关推荐
- linux dlopen函数,dlopen 和 dlsym 动态调用函数
Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS 和 iOS 上也支持. dlopen 打开一个库,获取句柄. dlsym 在打开的库中 ...
- dlopen 和 dlsym 动态链接库调用函数
Linux提供了一套API来动态装载库.下面列出了这些API:函数 - dlopen,打开一个库,并为使用该库作些准备.spa- dlsym,在打开的库中查找符号的值.命令行- dlclose,关闭库 ...
- python调用函数示例_python 动态调用函数实例解析
1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数) 2. 根据字符串 动态调用类中的静态方法,getattr(ClassNa ...
- java 动态调用函数_深入讲解Java语言中的函数动态调用方式
相 信 有 不 少 人 使 用C 语 言 的 函 数 指 针 实 现 过 函 数 的 动 态 调 用. 适 当 地 运 用 函 数 动 态 调 用 功 能 不 仅 能 减 少 代 码 数 量, 而 且 ...
- 【python】动态调用函数名
环境: C:\Users\DELL\Desktop>python -V Python 3.9.10 源码: #!/bin/env python # encoding = utf-8 import ...
- dlsym 动态调用动态链接库
dlsym 样例 hello.c hello_test.c 执行.a 样例 hello.c #include <stdio.h> int xx = 996;void test() {pri ...
- php 动态修改函数,php – 动态调用函数
是的你可以: $varFunction(); 要么: call_user_func($varFunction); 确保您为恶意输入验证$varFunction. 编辑: 对于您的模块,请考虑这样的(取 ...
- C语言dlopen()和dlsym()获取函数的运行时地址
在C语言中,可以使用库函数dlopen()和dlsym()来获取函数的运行时地址.dlopen()函数用于打开共享库,dlsym()函数用于查找共享库中的符号(函数名),并返回其地址. 下面是一个示例 ...
- 【转】采用dlopen、dlsym、dlclose加载动态链接库
1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主控制逻辑不变,将各个业务以动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...
最新文章
- Spring AOP编程-传统基于aspectJ切点AOP开发
- 2016年-2020年 考研 国家线汇总
- 如何定义一个有效的OWIN Startup Class
- 一个古怪的VISTA网络问题解决的坎坷经历
- Linux下的 FTP
- python要背的单词_Python-默背单词
- AD转换中参考电压的作用 .
- 蚂蚁技术专家:一篇文章带你学习分布式事务
- 开源正在吞噬软件业?看开源的7大理念
- 转: c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
- docker强制删除none的image镜像
- android 删除wifi文件,如何删除无线配置文件
- echarts无数据时显示暂无数据进行占位
- Python 身份证校验代码
- 福利:appium+selenium+python 模拟手工点击趣头条(app赚钱软件)
- 局域网或者本地开发https自签名证书解决办法
- Bus error的调试解决方法
- 计算机图形学——反走样技术
- 6000级石阶见证绝世爱情
- STM32唯一序列号UID--HAL_GetUIDw0详解