概述
当我们要调试一个三方APP的时候,就少不了让三方的APP执行我们自己写的代码,或者是截获三方APP的某一些方法,这样我们就要把我们写的代码注入到三方APP,这个过程也叫HOOK。一般情况下都是采用动态库注入的方式,在做代码注入之前首先要对APP重签名,可以参考我的这篇文章。
在iOS应用中,我们所写的代码最终都会被放入MachO文件中被执行,如果我们想改变三方APP的代码,就要改变可执行文件
注入方式分为静态注入和动态注入
静态注入:对可执行文件进行直接修改(比较困难,一般不用)
动态注入:程序运行的过程中,通过底层的函数去注入,常用方framework动态库注入
一、Framework注入
1、重签名安装三方APP
3、将framework写入machO文件,使用工具yololib,下载工具放入usr/local/bin目录下 ,可以通过MachOView工具查看是否已经注入
$yololib 可执行文件名 framework路径 (yololib WeChat FrameWorks/Hook.framework/Hook.framework)
可以通过MachOView工具查看是否已经注入
4、将调试的三方APP的MachO文件替换为注入framework的MachO文件,运行成功代表已经注入
5、在framework中添加文件,想要代码在程序加载的时候就执行,
需要把方法写在load方法内
二、破坏微信的注册
1、在开始之前首先使用class-dump 导出微信头文件(具体如何导出后续会在补充,大家可以先搜索一下安装步骤和使用方法,一定要是砸壳之后的才可以导出头文件)
2、重签名微信,并运行在真机上
3、通过Debug View调试拿到注册按钮所在的类,和方法名称
如图可知,类名为:WCAccountLoginControlLogic 方法名称为:onFirstViewRegester
4、创建一个类,归属于注入的Framework,在load方法内利用runtime的方法交换,交换微信注册按钮的点击方法为我们自定义的方法
+(void)load{
Method old = class_getInstanceMethod(objc_getClass("WCAccountLoginControlLogic"), @selector(onFirstViewRegester));
Method new = class_getInstanceMethod(self, @selector(test));
method_exchangeImplementations(old, new);
}
- (void)test{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"哈哈,不能注册" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
[alert show];
}
5、运行项目,效果如图,至此已经大功告成
补充
要实现上面的功能其实还有很多的准备工作要做,我在这里只是介绍了重点的部分,后续会慢慢补充上一些其他相关的内容,欢迎有兴趣的朋友一起交流学习,如果大家有什么疑问,欢迎留言。
特此声明:以上所使用的三方APP仅限学习交流,不做其他任何用途