iOS逆向 11:代码注入(上)

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战ios

iOS 底层原理 + 逆向 文章汇总微信

本文主要讲解代码注入的两种方式:FrameWork注入、dylib注入markdown

代码注入

通常修改原始的程序,是利用代码注入的方式,注入代码就会选择利用FrameWork或者Dylib等三方库的方式注入。app

查看Mach-O文件ide

在了解注入前,咱们首先须要了解ipa包中的静态库是如何注入的,有如下两种方式查看Mach-O可执行文件函数

  • 一、终端命令:otool -l WeChat
  • 二、MachOView 二进制文件分析工具(注:分析时可能出现没法分析的状况,能够经过 CMD + o 打开)

Mach-O文件中主要看load Commands(即加载命令集),从这里能够看出动态库的加载等。其中大部分格式为:LC_LOAD_DYLIB(xxx),是在指定路径下加载xxx,以下所示 动态库注入方式工具

因此,综上所述,若是须要注入代码,是以动态库的形式注入oop

方式1:Framework手动注入

第一步:动态库进入App包,即Framework注入post

  • 一、建立一个Framework,命名为 CJLHook(建立位置:target -> + -> ios -> Framework)

手动注入-01

  • 二、在CJLHook中建立inject文件,在生命周期方法load函数中写注入代码
+(void)load{
    NSLog(@"CJLHook ------ 注入成功");
}
复制代码
  • 三、编译工程(注:这里的工程依然须要重签名),而后查看工程的可执行文件Wechat,查找其中的Frameworks,从这里能够看到CJLHook,可是此时并不会执行其中的load函数

手动注入-03 load不会执行的缘由:查看此时的Mach-O文件中的Load Commands,并无发现CJLHook,因此此时是不会执行其中的load函数的ui

第二步:yololib手动注入,修改Mach-O字段

  • 四、经过yololib工具修改Mach-O字段:./yololib WeChat Frameworks/CJLHook.framework/CJLHook(注:须要将WeChat可执行文件拷贝过来)

手动注入-04 - 第一个参数:目标可执行文件

- 第二个参数:CJLHook的路径
复制代码
  • 五、查看Mach-O可执行文件,能够看到已经加进来了

手动注入-05

  • 六、从新打包,过程以下:

    • 解压微信-7.0.8.ipa

    • 替换Payload中的可执行文件为上一步的Mach-O文件

    • 从新打包:zip -ry WeChat.ipa Payload/

    • 而后替换ipa包

  • 七、运行程序,能够看到成功执行了 CJLHook中的load

手动注入-07

方式2:dylib注入

准备工做:建立一个空工程,并进行WeChat的重签名,能够参考这篇文章iOS逆向 10:应用重签名(下)

dylib注入

  • 一、选择target -> + -> mac os -> Library,命名为CJLHook

dylib注入-01

  • 二、在Build Setting中配置CJLHook
    • 1)Base SDK 改成 ios

    • 2)Code Signing identify 改成 iOS Developer

  • 三、当前工程中拷贝lib

dylib注入-03 - 1)、Build Phase -> + -> New Copy File... - 2)、而后选择拷贝到的目标文件:Frameworks - 3)、添加dylib

  • 四、在CJLHook.m文件中重写load函数
#import "CJLHook.h"

@implementation CJLHook
+(void)load{
    NSLog(@"CJLHook ---- 注入成功");
}
@end
复制代码
  • 五、脚本注入dylib,将yololib拷贝至根目录,在appSign.sh末尾添加如下命令
#注入
./yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libCJLHook.dylib"
复制代码
  • 六、编译工程,查看Mach-O文件中的Frameworks文件,已经包含了CJLHook的dylib

dylib注入-06

  • 七、运行程序,从日志能够看出执行了CJLHook中的load

dylib注入-07

总结

  • 代码注入:通常会选择利用FrameWork或者Dylib等三方库的方式注入

  • Framwork手动注入流程:

    • 一、经过Xcode新建Framwork,将库安装进入APP包

    • 二、经过yololib注入Framwork库路径。命令:$yololib(空格)MachO文件路径(空格)库路径

    • 三、全部的Framwork加载都是由DYLD加载进入内存被执行的

    • 四、注入成功的库路径会写入到MachO文件的LC_LOAD_DYLIB字段中

  • Dylib注入流程:

    • 一、经过Xcode新建Dylib库(注意:Dylib属于MacOS因此须要修改相关属性配置)

    • 二、添加Target依赖,让Xcode将自定义Dylib文件打包进入APP包。

    • 三、利用yololib进行注入。

相关文章
相关标签/搜索