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

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.个人证书没法签名Extention
rm -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. 重签名第三方 FrameWorks
tagetAppFramworkPath="$targetAppPath/Frameworks"
if [ -d "$tagetAppFramworkPath" ];
then
for frameWork in "$tagetAppFramworkPath/"*
do

#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$frameWork"
done
fi

二、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的注入即可。附上脚本下载,帮助到你请给一个Star

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 在我们通过将代码重新签名(如果对第三方app重签名不太熟悉的,请参考iOS逆向安全之代码重签名)能够让我们在本地通...
    SharaYuki阅读 1,651评论 0 8
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,750评论 0 5
  • 我们知道,程序在启动的时候会把引用到的库都放在Load commands段当中,所以,通过给这个段增加记录,就可以...
    妖精的菩萨阅读 2,391评论 0 0
  • 一、认识库 库是一种共享程序代码的方式,在计算机科学中,库(英语:library)是用于开发软件的子程序集合。库和...
    KinKen阅读 3,380评论 0 8
  • 雪飘飘摇摇落下 穿着一身风衣 像疯了一样的奔跑 喜欢银装素裹的山丘 喜欢一望无际的雪海 喜欢...
    枺一文字阅读 387评论 0 3