在使用theos hook第一个越狱ios系统的app一文的基础上进行延伸 进行私有API的调用 本例是打电话函数
有两种hook的方式
1:在APP调用私有API的函数中进行hook
即对这个函数进行hook。
这个当然可用做到 如下
但是这样做的弊端有如下
a:对于每一个使用过此私有函数的函数 都要进行单独hook 这样就需要动态的在tweak脚本里编写每一个函数 相对很麻烦
b:对于获取打电话的参数也十分麻烦
因此 我采取了第二种hook的方式 去私有框架中hook 私有API
2:去私有框架中hook 私有API
通过class-dump 可以dump出所有不同版本的IOS私有公有框架的头文件https://github.com/nst/iOS-Runtime-Headers/releases
找到 UIApplication 的头文件 UIApplication.h
找到openURL的方法如下
于是在这个层面进行hook
得到结果
这种方式明显比上一种的方案要好得多,弥补了第一种方式的不足。
但这种hook的方式仍然不够优化,问题有如下
1:对于每一个app都只能产生指定的插件,如果换了bundle ID的话,又需要重新生成插件。当然重新生成也不是非常麻烦的事情,但如果能做到即便换了bundle ID也无需重新生成插件的话,是最完美的。这是即将研究的问题一。
2:每次安装完插件,系统都将重新启动一次,即Spring Board要重新启动。这个可能会给自动化测试带来一定的阻力。也是鉴于此,实现1成为了自动化实现的关键一步。
3:如果这个方案可行的话,还需要在hook的函数过程中加以判断,系统当前存在的进程,是哪一个进程调用这个API。
4:如果这个方案可行的话,当对每一种私有API的每一个IOS版本分别进行研究汇总。
问题2的研究比较简单,对Spring Board进程启动注入一个tweak即可。
对问题1的研究过程如下
当在同一个APP的基础之上 更改bundle ID的话 之前是(com.antiy.chendan)
重新运行,发现插件无效
bundle ID改回来,删掉APP,又重新装入APP 这个时候插件hook仍然有效
结论如下
创建每一个hook的插件,与bundle ID有关,即与app的标识有关。简而言之,不管这个app是否安装,只要关于与这个app关联的插件已经存在ios系统中,即是存在cydia中,则无论这个app是否安装,一旦它安装,hook一定存在。
为了解决这个问题 有三种思路
1:在app安装之前,通过静态分析 把app的bundle ID改成指定的ID,如此可不必每次启动更新插件来进行hook。但这样有可能会伤及样本本身。
2:theos的tweak每次hook的时候,势必要对bundle ID进行判断,找到这个判断条件,取消即可。
3:或者搞清楚tweak的每一步的具体是怎样操作的 或许其中有办法解决这个问题
bundle ID的判别过程:http://security.ios-wiki.com/issue-7-1/
可知bundle ID的判别过程是由cydia来操作的 跟theos无关··
这个阶段的研究可告一段落 看看后面两个工具如何使用的 再综合考虑吧··