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分的那么细,可能也是我并没有理解到水果在用户层怎么管理的,我只需要看到这里其它可以自己慢慢往下看。
转载于:https://blog.51cto.com/haidragon/2406235