上一篇文章中我们已经可以将砸壳后的APP安装到我们的手机上面了,这里我们将我们自己的代码,注入到APP中,在APP运行的同时也执行我们自己的代码。
- 首先我们要思考的是,我们的代码以什么样形式去注入到APP中?
1、别人的APP的源码我们是拿不到的,那么去修改别人的代码是无法做到的。
2、我们都知道,APP中会引用一些第三方的库,APP在运行的时候会使用到三方库的一些内容。既然三方库可以在APP运行的时候被执行,那我们我们就写一个三方库,然后将库文件注入到APP包里面,那么我们的代码不就会被执行了吗!!!
⚠️ ⚠️⚠️ :我们下面的操作是在9、应用重签名原理中最后的使用shell脚本
的工程基础上做的操作。
动态库的注入
- 1、将动态库拷贝到APP包里面
首先我们创建一个Framework
的动态库,名字就叫JaxHook
:
创建Framework
然后我们在JaxHook
里面写上这样一段测试代码:
测试代码
然后我们编译一下,并查看此时APP包里面的Frameworks
文件夹里面的内容:
JaxHook
可以看到我们自行创建的JaxHook.framework
已经被拷贝到APP包里面了。
这样我们的第一步就完成,也就验证了我们自己的动态库确实可以注入到APP包里面。 - 2、使用
yololib
可执行文件,将我们的动态库引入到APP中的可执行文件里面,这里引入的是地址。
$ ./yololib <可执行文件名> Frameworks/JaxHook.framework/JaxHook
⚠️ 注意:在我们第二步执行完毕之后,需要将修改过的可执行文件从新拷贝到APP包里面去的。这里建议大家从新打包,替换之前的ipa包
(ipa包 -> 解压 -> 将修改后的可行性文件进行替换 -> 替换之后从新打包
)
///打包指令
$ zip -ry xxx.ipa <解压后的文件>
将从新打包后的ipa包
,替换之前的ipa包
,然后从新运行工程,运行结果如下:
到这里,有一点大家要注意。第一不是为了搞清楚我们自己的动态库到底能不能注入到APP里面。其实如果我们已经很明确动态库的名称和注入后的地址的话,直接操作第二步就可以了。因为动态库的注入,是Xcode帮我们完成的。
- 使用
shell
脚本注入代码
1、首先要将yololib可执行文件拷贝到我们的工程根目录下面。
2、在上一篇文件脚本的基础上,加上下面一句指令:
./yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/JaxHook.framework/JaxHook"
3、运行我们的工程就可以了。执行效果和上面的一样。
yololib
是逆向的时候,使用到的一个工具,大家可以去Google一下。
修改APP中的方法执行
上面我们讲到了怎么去在APP中注入代码,但是仅仅是注入代码是不够了。下面我们一起来探讨一下,如何去影响APP原有方法的执行。
这进行下面的探讨的之前,大家要对一个知识点有所掌握,那就是Method Swizzle
。
利用OC的Runtime
特性,动态改变SEL(方法编号)
和IMP(方法实现)
的对应关系,达到OC方法调用流程改变的的目的。主要用于OC方法
- 获取APP中的方法信息(动态分析)
在知道怎么去影响APP的的方法执行之后,我们就需要去获取APP的方法的相关信息。这个时候,我们可以利用Xcode自带的ViewDebug
来查看一下,各个控件对应的信息。
可以看到,我们可以通过ViewDebug
查看到控件所在的类名,以及其对应的方法名。这个时候我们就可以通过Method Swizzle
去修改这个方法。让APP去执行这个方法的时候,实际是在执行我们的方法。 - 获取APP中的方法信息(静态分析)
我们还可以利用工具来静态分析可执行文件里面的函数。然后结合动态分析来快速的定位到我们要修改的部分。
这里推荐一款工具class-dump用于可执行文件的静态分析,导出里面的方法名。
$ ./class-dump -H <可执行文件名> -o ./headers
/// 将可执行文件里面的函数名全部导出到执行的文件里面(此时指定的文件为`headers`)
yololib和class-dump这两个工具这里就不为大家提供,大家可以在网上下载最新的版本使用。
网友评论