サードパーティのアプリケーションを取り消す場合は、最初にアプリケーションを携帯電話にインストールしてから、フック分析を実行し、対応するメソッド呼び出しを見つけ、コードインジェクションを実行し、通常のプロセスをクラックして逆の目的を達成する必要があります。次に、このプロセスの具体的な実装について詳しく説明し、分析します。
1つは、再署名を実現するためのシェルスクリプトです。
1.最も一般的なアプリケーションWeChatを例として取り上げましょう。他のアプリケーションの原則は同じです!まず、PP Assistantに移動して、以下に示すように、ジェイルブレイクされたバージョンのWeChatアプリケーションをダウンロードします。
01
-
1.1ジェイルブレイクされたバージョンのアプリケーションは暗号化されていません。公式バージョンのアプリケーションは暗号化されています。MachOViewを使用してアプリケーションの実行可能ファイル情報を表示します。デモは次のとおりです。
02
- 1.2上の図から、LC_ENCRYPTION_INFO_64暗号化情報の列の暗号化IDは0であり、暗号化がないことを意味し、WeChatの公式バージョンは1であり、特定の暗号化方法が使用されていることがわかります。非常に暗号化されています。コードインジェクションの実行が難しい。
2.最初にWeChatアプリを辞任した場合の影響を見てみましょう。デモは次のとおりです。
03
-
2.1次に、辞任のプロセスについて詳しく説明します。ここでの辞任は、手動またはスクリプトを使用して行うことができます。手動は面倒なので、ここでは説明しません。次に、シェルスクリプトに基づいてコードを再署名します。コマンドの合計は20個までです。シェルスクリプトについて説明する前に、シェルスクリプトに慣れていない場合は、入門チュートリアルをお読みください。
-
04
-
2.3プロジェクトのスクリプトファイルを作成し、証明書管理を追加して実行します。再署名の問題は3つのステップで解決されます。デモは次のとおりです。
05
-
2.4重要なのは、シェルスクリプトの実装プロセスです。これがシェル署名スクリプトです。スクリプトの各行に詳細なコメントが付けられ、スクリプトアドレスが完成します。
#获取手动创建的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
2、フレームワークコードインジェクション
1.まず、コード署名プロジェクトに基づいて、フレームワークライブラリを作成し、ロードメソッドを追加して、挿入する必要のあるコードを記述します。デモは次のとおりです。
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メソッドに追加される理由については、他の記事「DyldLoadingアプリケーションの起動原理の詳細な説明」を参照してください。コード挿入のタイミングの分析があります。
-
1.4次に、yololibスクリプトが何をするかを分析しましょう。まず、作成したフレームワーク実行可能ファイルとwechat実行可能ファイルを取り出し、yololibコマンドを実行して次の図を示します。
08
-
1.5 yololibダウンロードアドレス。以下に示すように、yololibを使用して独自のフレームワークをWeChat実行可能ファイルに挿入します。
09
-
1.6次に、machOViewを使用して、以下に示すように、WeChat実行可能ファイルにライブラリの問題があるかどうかを確認します。
10
2.WeChat登録を傍受する方法
-
2.1以下に示すように、デバッグツールを使用して登録ボタンの呼び出し方法を表示します。
11
-
2.2呼び出されたターゲットが「WCAccountLoginControlLogic」であり、登録ボタンをクリックして実行されるメソッドが「onFirstViewRegester」であることがわかります。これで、次のステップは単純に交換することです。
-
2.3フレームワークにメソッド交換メソッドを次のように記述します。
+(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
この時点で、シェルスクリプトの自動署名とフレームワークコードインジェクションが完了します。macOSライブラリを使用して行われるdylibインジェクションもあります。比較的簡単です。必要に応じて、dylib関連の記事を更新します。主にフレームワークの注入に精通しています。ダウンロードするスクリプトを添付して、スターを付けてください。
作成者:Qinz
リンク:https://www.jianshu.com/p/7d5daf6436b2