shell脚本实现iOS包重签名及代码注入

作者 : 开心源码 本文共3122个字,预计阅读时间需要8分钟 发布时间: 2022-05-12 共179人阅读

Qinz

当我们要逆向第三方应用时,首先就是要将应用安装在我们的手机上,而后进行hook分析,找到对应的方法调用,进行代码注入,破解其正常流程,从而达到逆向目的。接下来将详细讲解分析该过程具体实现。

一、shell脚本实现重签名

1. 我们以最常见的应用微信为例,其余应用原理一样!首先我们去PP助手下载越狱版本的微信应用,如下图:

01

  • 1.1 越狱版本的应用是没有加密的,正式版本的应用是加过密的,我们用MachOView来查看应用的可执行文件信息,演示如下:

    02

  • 1.2 从上图中我们可以看到LC_ENCRYPTION_INFO_64加密信息这一栏中的Crypt ID为0,代表没有加密,而微信的正式版本此处为1,代表用到了某一种加密方式,加密的我们是很难去进行代码注入的。
2.我们先来看一下重签微信app的效果,演示如下:

03

  • 2.1 接下来我们将详细讲解重签过程,这里的重签可以手动也可以使用脚本,手动比较繁琐,这里就不演示了。下面我们基于shell脚原本完成代码的重新签名,总计不超过20条命令,在进行shell脚本讲解之前,假如你不熟习shell脚本,请先花点时间看下入门教程。

  • 2.2 我们新建立一个WeChat的同名工程,方便后续文件的替换,其余应用相似。而后在工程目录下新建一个APP文件,这里用于放置我们刚下载的ipa包,演示如下:04

  • 2.3 我们为工程创立一个脚本文件,而后增加证书管理,接下来运行就可,三步就处理了重签名问题,演示如下:

    05

  • 2.4 关键就在于shell脚本的实现过程,这里给出shell签名脚本,脚本中每一行都做了详细注释,完整脚本地址。

#获取手动创立的APP文件夹,用来放置越狱版本的Ipa包,${SRCROOT} 代表工程文件所在的目录crackPath="${SRCROOT}/APP"#获取越狱版本Ipa路径oldIpaPath="${crackPath}/*.ipa"# 创立一个临时文件夹,用来放置解压的Ipa文件tempPath="${SRCROOT}/Temp"#首先先清空Temp文件夹rm -rf "$tempPath"#创立临时文件夹目录mkdir -p "$tempPath"# 1. 解压IPA到temp下unzip -oqq "$oldIpaPath" -d "$tempPath"# 拿到解压的临时的APP的路径oldIPaPath=$(set -- "$tempPath/Payload/"*.app;echo "$1")# 2. 将解压出来的.app拷贝进入工程下# BUILT_PRODUCTS_DIR 工程生成的APP包的路径(系统创立的)# TARGET_NAME target名称(系统创立的)targetAppPath="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"# 打印app编译后的路径echo "app路径:$targetAppPath"#先删除app所在路径文件rm -rf "$targetAppPath"#重新创立该文件路径mkdir -p "$targetAppPath"#将解压的app文件拷贝到Xcode编译的app文件目录,让Xcode认为这是它编译出来的,Xcode就会帮我们完成签名工作cp -rf "$oldIPaPath/" "$targetAppPath"# 3. 删除extension和WatchAPP.个人证书没法签名Extentionrm -rf "$targetAppPath/PlugIns"rm -rf "$targetAppPath/Watch"# 4. 升级info.plist文件 CFBundleIdentifier,PlistBuddy是更改plist文件的可执行文件#  设置:"Set : KEY Value" "目标文件路径"/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$targetAppPath/Info.plist"# 5. 重签名第三方 FrameWorkstagetAppFramworkPath="$targetAppPath/Frameworks"if [ -d "$tagetAppFramworkPath" ];thenfor frameWork in "$tagetAppFramworkPath/"*do#签名/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$frameWork"donefi

二、framework代码注入

1. 首先我们在代码签名的工程的基础上,创立一个framework库,并增加一个load方法,里面写入我们需要注入的代码,演示如下:

06

  • 1.1 而后我们在脚本后面添加注入代码
# 拿到MachO文件的路径APP_BINARY=`plutil -convert xml1 -o - $targetAppPath/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`#注入yololib "$targetAppPath/$APP_BINARY" "Frameworks/Inject.framework/Inject"
  • 1.2 运行工程,可以看到我们注入的代码成功了,演示如下:

    07

  • 1.3 上面工程有306个报错,这个是我电脑权限的问题,可以忽略,你的电脑运行应该不会有问题。我们可以看到代码已经注入成功,至于为什么是在load方法中增加,详细理解请查看我的另一篇文章《dyld加载应用启动原理详解》,里面有分析代码的注入时机!

  • 1.4 接下来我们来分析yololib这句脚本究竟干了什么?首先我们将自己创立的framework可执行文件和wechat的可执行文件拿出来,而后执行yololib命令演示如下图:

    08

  • 1.5 yololib下载地址。使用yololib将自己的framework注入到WeChat可执行文件中,演示如下图:

    09

  • 1.6 接着用machOView来查看WeChat可执行文件中能否存在自己创立的库问题,如下图:

    10

2. 截获微信注册方法
  • 2.1 我们使用调试工具查看注册按钮的调用方法,演示如下图:

    11

  • 2.2 我们可以看到调用的Target是”WCAccountLoginControlLogic”,点击注册按钮执行的方法为”onFirstViewRegester”,有了这个,接下来就是简单的方法交换了。

  • 2.3 我们在自己的framwork中写入方法交换方法,如下:

+(void)load    {        Method oldMethod = class_getInstanceMethod(objc_getClass("WCAccountLoginControlLogic"), @selector(onFirstViewRegester));                Method newMethod = class_getInstanceMethod(self, @selector(test));                method_exchangeImplementations(oldMethod, newMethod);    }    -(void)test{    NSLog(@"----截获到微信注册按钮点击------");}
  • 2.4 接下来我们运行程序,点击按钮,演示如下:

    12

到此,shell脚本的自动签名和framework代码注入到此完成,还有一种dylib的注入,是用macOS的库来完成的,相对来说这个比较简单,假如有需要我会升级dylib的相关文章,主要熟习掌握framwork的注入就可。

我是Qinz,希望我的文章对你有帮助。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » shell脚本实现iOS包重签名及代码注入

发表回复