您的位置:首页 > 其它

dyld方式遍历模块源码讲解

2019-06-07 14:50 731 查看

mac ios上遍历模块的有几种方式(其实不叫遍历模块,应该叫做遍历进程内所有的macho可执行文件,看完就知道为什么了)。
这里只看dyld方式遍历的,dyld大家都知道这个是水果支持动态链接启动macho文件用的,也就当你要依赖其它库时dyld会给也把这些坑填了,遍历模块代码是:https://blog.51cto.com/haidragon/2164203

用到的函数有:

int32_t nModNums= _dyld_image_count();  //获取所有image
pModSlide  = _dyld_get_image_vmaddr_slide(i);//获取单个image随机基址
pszModName = _dyld_get_image_name(i);//名称
pModHeader = _dyld_get_image_header(i); //头

我们直接看dyld源码,因为这些函数都是上面封装的函数dyld是没有的,但是我们可以看下面的真正实现,如图我们可以看到有一个getImageCount();函数。

看源码,如图所示。

直接就是返回sAllImages,说明是一个全局变量。

果然是一个向量。双击它下面就会有对应的引用。


我们看第一个addImage函数。

然后继续看addImage谁引用了它,如图所示。

有4个函数。我们直接看第二个,如图所示。

我们看到了这个函数要一个随机基址值。说明这个调用这个函数的时候已经安排了地址。可以看这个基址怎么来的,我在这里主要是要说的是通过分析,镜像是保存在一个全局变量中,我开始认为会是保存在像windows上的那种进程,线程环境块。可能是没有windows分的那么细,可能也是我并没有理解到水果在用户层怎么管理的,我只需要看到这里其它可以自己慢慢往下看。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐