4eb46776ffb0b792e4f08428e277becc
安全攻与防篇:代码注入

1.前言

安全攻与防篇:重签名 中,我们实现了 App 的重签名,并在工程中直接运行,运行的是重签名 App 的可执行文件。这时大家可能会有一个问题:我们花了那么大工夫,只是做一下重签名?那么重签名之后,我们能做点什么吗?

在开始本篇的讲解之前,我们还是来看一下 安全攻与防篇:重签名 中的微信的可执行文件(关于 MachO 文件的讲解,可以参考 核心知识篇:Mach-O ):

可以看到,上篇在 App 文件中, Frameworks 目录下的动态库,在 MachO 文件中也 Load 进来了。那么我们是否能够新写一个 Framework,也加载到 MachO 文件中来呢?下面我们开始编写代码进行尝试。

2.Framework 注入

2.1 小示例

  • 第一步:新建示例工程【GofInject】(就是纯新建一个 Demo,配置一下证书);
  • 第二步:在工程同级目录下,新建【GofApp】文件夹,将越狱版微信的 ipa 文件拷贝到该目录下:
  • 第三步:配置重签名脚本。在【Build Phases】中新建【Run Script】,添加我们在 安全攻与防篇:重签名 中编写的自动化脚本:
/Users/GofLee/GofShell/GofResignatureApp.sh
  • 第四步:使用【Framework】模板新建一个 Target。

  • 第五步:在【Framework】中,新建一个类【GofFunction】,用于添加我们的 Hook 代码。

@implementation GofFunction

+ (void)load {
    NSLog(@"进入 Hook 的功能了");
}

@end
  • 第六步:在 【GofInject】的 Target 中,添加刚才的 Framework:
  • 第七步:运行工程。可以看到在 app 文件的 Frameworks 目录中,多了一个【GofHook.framework】。但我们添加的方法并没有执行,这是因为在 MachO 文件中,还没有我们添加的 framework。怎么办呢?

2.2 脚本注入

我们可以使用一个工具:yololib,将该工具拷贝到目录【/usr/local/bin】。然后在 app 目录下,使用脚本进行注入:

GofInject.app>  yololib WeChat Frameworks/GofHook.framework/GofHook
2020-04-04 21:20:14.218 yololib[19738:393329] dylib path @executable_path/Frameworks/GofHook.framework/GofHook
2020-04-04 21:20:14.219 yololib[19738:393329] dylib path @executable_path/Frameworks/GofHook.framework/GofHook
Reading binary: WeChat

2020-04-04 21:20:14.219 yololib[19738:393329] FAT binary!
2020-04-04 21:20:14.220 yololib[19738:393329] Injecting to arch 9
2020-04-04 21:20:14.220 yololib[19738:393329] Patching mach_header..
2020-04-04 21:20:14.220 yololib[19738:393329] Attaching dylib..

2020-04-04 21:20:14.220 yololib[19738:393329] Injecting to arch 0
2020-04-04 21:20:14.220 yololib[19738:393329] 64bit arch wow
2020-04-04 21:20:14.220 yololib[19738:393329] dylib size wow 80
2020-04-04 21:20:14.220 yololib[19738:393329] mach.ncmds 85
2020-04-04 21:20:14.220 yololib[19738:393329] mach.ncmds 86
2020-04-04 21:20:14.220 yololib[19738:393329] Patching mach_header..
2020-04-04 21:20:14.220 yololib[19738:393329] Attaching dylib..

2020-04-04 21:20:14.220 yololib[19738:393329] size 77
2020-04-04 21:20:14.220 yololib[19738:393329] complete!

这是再打开 MachO 文件,可以看到我们的 GofHook 已经在里面了。

重新运行,可以看到我们添加的方法还是没有执行,为什么呢?这是因为重新运行,MachO 文件被替换了。我们可以通过修改脚本,在脚本的后面加入这段注入的脚本:

echo "-------- 8.注入动态库 开始 -------- "

# 需要注入的动态库的路径,这里将路径写死了
GOF_FRAMEWORK_PATH="Frameworks/GofHook.framework/GofHook"
# 通过工具实现注入
yololib "$GOF_TARGET_APP_PATH/$GOF_APP_NAME" "$GOF_FRAMEWORK_PATH"

echo "-------- 8.注入动态库 结束 -------- "

再次运行工程,可以看到我们的方法已经执行,注入成功。

3.Dylib 注入

前面三步和 Framework 注入一样,这里我们还是写一下完整的操作。

  • 第一步:新建示例工程【GofInject】(就是纯新建一个 Demo,配置一下证书);
  • 第二步:在工程同级目录下,新建【GofApp】文件夹,将越狱版微信的 ipa 文件拷贝到该目录下:
  • 第三步:配置重签名脚本。在【Build Phases】中新建【Run Script】,添加我们在 安全攻与防篇:重签名 中编写的自动化脚本:
/Users/GofLee/GofShell/GofResignatureApp.sh
  • 第四步:使用 Library(macOS中) 模板新建一个 Target。
  • 第五步:在【Library】中,新建一个类【GofHook】,用于添加我们的 Hook 代码。
@implementation GofHook

+ (void)load {
    NSLog(@"进入 Hook 的功能了");
}

@end
  • 第六步:在【GofInject】的 Target 中,找到【Build Phases】,【Copy Files】中添加我们的 dylib。
  • 第七步:编译运行。这时会有一个报错:

这是因为路径不正确,【libGofHook.dylib】 的路径是【/Users/GofLee/Library/Developer/Xcode/DerivedData/GofInject-fbnieyofdffrmkgvgpgbqcbzujoe/Build/Products/Debug/libGofHook.dylib】,怎么办呢?可以将 dylib 文件拷贝到上面提示信息中的路径即可。

  • 第八步:再次运行工程,可以看到在 app 文件的 Frameworks 目录中,多了一个【libGofHook.dylib】。但这个 dylib 的架构不是 arm64:
GofInject.app/Frameworks > file libGofHook.dylib
libGofHook.dylib: Mach-O 64-bit dynamically linked shared library x86_64

同样我们添加注入脚本:
```
echo "-------- 8.注入动态库 开始 -------- "

需要注入的动态库的路径,这里将路径写死了

top Created with Sketch.