iOS程序猿程序员iOS Developer

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

2019-02-25  本文已影响542人  Qinz
Qinz

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

一、shell脚本实现重签名

1. 我们以最常见的应用微信为例,其他应用原理一样!首先我们去PP助手下载越狱版本的微信应用,如下图:
01
2.我们先来看一下重签微信app的效果,演示如下:
03
#获取手动创建的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
# 拿到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"
2. 截获微信注册方法
+(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(@"----截获到微信注册按钮点击------");
}

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

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

上一篇下一篇

猜你喜欢

热点阅读