10、代码的注入

上一篇文章中我们已经可以将砸壳后的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这两个工具这里就不为大家提供,大家可以在网上下载最新的版本使用。

你可能感兴趣的:(10、代码的注入)