introspy的官网地址以及deb包地址:https://isecpartners.github.io/Introspy-iOS/
在官网https://github.com/iSECPartners/Introspy-iOS/releases中 该工具仅仅放出支持IOS7的版本,IOS8,IOS9均未放出deb安装包。
所以,我下载了源码,试图在IOS9上编译一份,结果如下
查阅原因发现 是我安装的theos安装版本太高了 把theos安装低版本 可安装
结果又发现如下
这就没有办法了,这个工具的源码不支持IOS9。
这里会感觉到很奇怪,这个工具关theos什么事。
关联如下
1:这个工具本身的作用 就是针对一些私有API进行监控,并将日志输出到xcode自己的log中。
2:这个工具采取的监控的原理 就是使用theos编写tweak API,从外部进行插入dylib的原理,只不过它已经将一个已有的tweak拆分成很多不同种类监控的文件。如下图
比如其中的NSData的tweak是这样的
完全就是theos中 tweak hook的语言组织 而且hook的即是IOS私有类NSData中的关键函数 与之前对theos中的调研一致
而之外的一些类文件 则是为不同类型的hook提供工具类,如上图的CallTracer类
此处的Tweak起着一个总的调度的作用,makefile打包安装成最终的deb形式。
如下图tweak调用各种不同类型的hook
在IOS7中,追踪的信息会被保存成一个数据库introspy-com.XX.XX.db 这个数据库存放在 ./private/var/mobile/Applications/E5DF194C-0B29-4211-B243-68DBA847DCDE/Library/introspy-com.XX.XX.db里面
Introspy-Analyzer直接将这个数据库直观的解析出来,当然在xcode的log上也会有显示
在总的调度tweak中 有这个路径的数据库的初始化和写入
此为我们记录分析提供了很好的工具和思路
虽然现在未能使用这个工具 但是这个工具给我们研发工作一个很好的范例,它本身已经解决了如下问题
1:很多私有API的检测问题,证实了通过外部插入dylib是目前最好的hook方式
2:它已经解决了通过一个插件就能自动开关所有应用的hook的问题 这是在IOS6上的使用状况(官网的图)
因为现在无法使用,所以仅仅看这个图的话,这个工具已然满足多样本实时监控
这种即是IOS上 setting bundle的一种机制 为插件单独添加preferences 还有一种解决方案:FLEX嵌入:https://yohunl.com/ios-yue-yu-de-tweakkai-fa/
在源码中找到了 Preferences中plist文件 这个在theos创建工程的时候选择创建application就能生成settings。
tweak中调度的代码中,对开启了监控的app的bundle ID进行了过滤:即开启了的,为其创建DB,没有开启的便不为其创建DB。
但为何能实现在不用重新加载tweak的前提下就能实现多APP的监控??
这里我找到一种解决多样本控制的办法 在原创建的工程文件里 有一个plist存放的是有效bundle ID。
发现其中的bundle ID是可以添加很多的,只要这个app满足 则对这个app生效
测试结果发现只要原始的tweak插件生成过程中,有这个bundle ID的,则hook一律有效,不必重新生成插件。
所以,我猜想,introspy是将这个bundle ID的选择权利通过setting bundle的添加交给了用户,让用户手动输入是否支持监控,从而在手机插件的内部操作了这个plist文件,来实现多样本监控。
在introspy的源码处 tweak总调度插件处找到了证明我猜想的代码
theos tweak实现多样本自动支持的问题得到解决
这个图说明了tweak的bundle ID的生效过程,也是introspy能动态监控的原理。
但是基于本项目动态养殖涉及到的问题,需要找到tweak存放bundle ID的plist文件的位置,由于越狱系统仅仅开放部分文件权限,所以目前并不知道这个plist文件存放的位置,如能找到这个
则有如下的流程
样本静态分析得出app的bundle ID—>找到tweak在iphone中存放plist的文件,并将bundle ID添加到其中--->tweak对这个app生效—>app安装,监控目的达到
发现可以找到这个文件
这个文件的路径是: //Library/MobileSubstrate/DynamicLibraries
由此 只需编写shell命令来写入这个文件即可
3:这个工具 为输出监控日志提供了很好的思路 可以使用syslogd这个插件 也可以使用xcode自动log工具 如下图
还可以使用IOS的DB数据库操作,每一个app单独为其创建一个DB。introspy则是使用的这样方式的输出。
4:同时这个工具 为我们写自动化工具监测 提供了良好的模板框架的借鉴。
综上所述 IOS下的hook有两种方式:
1:采用外部加载插入dylib的方式,这种以theos tweak工具为代表,并进一步演化出了introspy的监控输出日志的工具。
2:采用内部method swizzling来hook,代表工具即是cycript。这种工具需要采用句柄来一步步获取目标函数所在对象的指针,达到hook的目的。
第一种方式与我们预期的相匹配。