美文网首页
五:代码注入

五:代码注入

作者: Ray_lawq | 来源:发表于2019-02-15 11:47 被阅读0次

    一:使用framework 注入

    1. 新建工程,使用第四讲的方法重签名APP,使新工程跑起来(加载的是重签名的APP)
    2. 新建framework(myF),将库文件加载到APP包里边,跑起来,看看打印🍺没有,如果打印,说明注入成功,如果没有打印,注入失败
    • 结果是失败,why?因为frameworks 文件夹里边没有新建的myF.framework,所以不会加载新建的framework,也不会打印🍺
    • 还有一种方法证明:查看machO文件,LC_LOAD_DYLIB 里边是否有新建的framework(machO文件里边的LC_LOAD_DYLIB 字段就是当前APP 使用的三方库,Value 里边保存的就是这个库的路径)
    • 那么怎么才能让新建的framework,加载到frameworks文件夹里边呢(使 LC_LOAD_DYLIB 包含新建的framework)?
    1. 使用yololib工具给原始的app 包里边注入你自己新写的Framework (修改mochO文件)
      3.1 打开原始的app 包,找到Framework 路径,例如:Frameworks/myF.framework/myF

    3.2 在app包 里边直接执行 yololib 命令,注入成功

    【注】

    • 1.为什么不是用重签名完成的app 而是原始的app?
      首先:xcode 运行 先编译你自己的工程,如果这时候注入Framework,那么就直接打包到Frameworks 文件夹里边去了
      然后:再执行重签名,原始app 直接覆盖 xcode 编译完成的app 包,所以注入也就失败了(使用这种覆盖app欺骗的xcode 的方法来进行重签名)

    • 2.为什么不重签名不一次性签名成功,每次启动都要重新签名一次?
      重签名的本质就是解密app包,苹果的加密过程我们不知道,(就算是破解了加密过程,如果苹果修改了加密过程,就的重新破解,费时费力),所以重签名的过程是:当app启动的时候(app加载到内存的时候,这个时间app是解密的),再进行重签名、

    • 3.可以直接把yololib 放到usr/local/bin 目录下,终端直接敲yololib 命令

    • 4.简易方法
      如果重签名使用的是 shell 脚本的方法,可以在脚本里边直接添加下边的一句,直接重签和注入都使用sell 脚本完成,比较方便(原理其实是一样的,都使用yololib 命令,只是操作简化了)

    二. 使用dylib 代码注入

    1. 新建一个dylib
    1. 修改dylib 的 Base SDK 属性,原来为 macOS ,修改为ios(因为 dylib 是 macOS的,现在要加载到app里边,所以要改)
    1. 新建一个 copy Files ,add 自己的dylib
    【注】为什么要新建一个copy Files?
     因为编译完成以后,dylib 没有直接加入到Frameworks 文件夹里边,使用这个可以
    
     第一种Framework注入的时候,在高版本的Xcode中直接加入到文件夹里边,而低版本的Xcode也需要这样配置 
    
    1. 直接使用shell 脚本的方法(为了简便),完成
    1. 当使用免费证书的时候,会出现崩溃
    • 崩溃内容:新建的库签名信息有问题?去掉第3步,直接把 dylib 打包好丢入到原始app包里边,重新打包,然后再重签名,代码注入就好了。

      【注】Framework 和 dylib 的区别请参考 [https://www.jianshu.com/p/a37328bcee8f](https://www.jianshu.com/p/a37328bcee8f) 
        
       2种方法,推荐使用Framework 注入
      
       以上2种方法只是为了加载自己写的代码,而更改程序执行的流程就用到了方法交换(method swizz)
      

    三. method swizzle

    • 定义:利用oc 的runtime 特性,动态的改变SEL(方法编号)和IMP(方法实现)的对应关系,达到方法执行流程改变的目的
    • 例如:VC 里边的viewDidLoad 方法
    • 除了exchange 方法还有以下的方法,可以使用

    【注】
    如果hook(exchange)系统的方法,可以创建一个系统类的分类。
    而如果hook自定义的类的方法,那么就会崩溃,详见下图:

    • 为什么呢?看下图:
    【注】:self 是当前方法的调用者,当前方法的调用者是person 而不是 hook ,所以就崩溃了。
    
    • 怎么解决这个问题呢?
      1. 给person add 一个分类(如果是重签名app,hook原来app的方法,给原来app 的类新建一个分类是行不通的)

      2. 使用addmethod 方法,给person 类动态的添加一个方法,然后exchange 这2个方法,如图:

    1. 使用replaceMethod 方法,直接替换person 的方法
    1. 使用get 和 set 方法

    相关文章

      网友评论

          本文标题:五:代码注入

          本文链接:https://www.haomeiwen.com/subject/wgdpeqtx.html