この記事では主に、いくつかの作業のアプリケーションの習熟度を紹介し、スタックをトレースして他の操作などを実行するかどうかを確認します。
パケット キャプチャ:
署名は暗号化された値です。
まずトレースを上ってスタックを下って暗号化します
Base64 が魔法のように変更されたかどうかを判断するために、結果が一貫しているかどうかを確認するために結果を Base64 化してみましょう。
Base64 が標準であることを確認します。
今のスタックによると、次のようになります
0x101115468 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!+[RSA encryptData:withKeyRef:isSign:]
0x101115ae0 /var/containers/Bundle/Application/9580891A- 98B0- 4F3F-9938-D794221B5B4D/yidian.app/yidian!+[RSA encryptData:publicKey:]
0x101115a28 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!+[RSA暗号化文字列:publicKey:]
0x10108a8ac /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDRequest getSignatureWithReqId:]
0x10108a6b0 /var/containers/Bundle/Application/958 0891A-98B0- 4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDRequest updateParametersForGet:reqid:]
0x10108aaf4 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDRequest initWithURLString:parameters:method:]
0x10108e300 /var/containers/Bundle/Application/95808 91A-98B0- 4F3F-9938-D794221B5B4D/yidian.app/yidian!-[HpEngineRequest initWithURLString:parameters:method:]
0x101047544 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yid ian.app/yidian!-[ HpEnginefreshNewsListOfKeyword:sinceIndex:]
0x101a17858 /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[HpNewsListDataProvider userRefreshlatestData:]
0x1017be2ac /var /コンテナ/バンドル/アプリケーション/9580891A- 98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDNewsListView userRefreshData:]
0x101a235bc /var/containers/Bundle/Application/9580891A-98B0-4F3F-9938-D794221B5B4D/yidian.app/yidian!-[YDNLViewModel DidFinishLoadingLocalData:]
0x101a166f0 yidian!0x16ae6f0 (0x1016ae6f) 0)
0x232360a38 libdispatch.dylib!_dispatch_call_block_and_release
0x2323617d4 libdispatch.dylib! _dispatch_client_callout
0x23230f008 libdispatch.dylib!_dispatch_main_queue_callback_4CFバリアント バリアントV A R I A NT mp
0x2328b4b20 CoreFoundation! CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE
もう一度フックしてみましょう: encryptData:withKeyRef:isSign:
frida -UF -look.js をアプリに直接アタッチします
var initWithMethod = ObjC.classes.RSA['+ encryptData:withKeyRef:isSign:'];
Interceptor.attach(initWithMethod.implementation, {
onEnter: function (args) {
// console.log('initWithMethod called from:\n' +
// Thread.backtrace(this.context, Backtracer.ACCURATE)
// .map(DebugSymbol.fromAddress).join('\n') + '\n');
console.log("args[2]: ", ObjC.Object(args[2]));
console.log("args[3]: ", hexdump(args[3]));
console.log("args[4]: ", args[4]);
}, onLeave: function (retval) {
console.log('Base64Encode() this.args1 onLeave:', hexdump(retval));
}
});
bool a5 は 0、つまり false、直接進みます
この時点で、この場所が上記の冒頭でスタックと暗号化を追跡した場所であることがわかりました。
スタックに従って調べてみましょう。
ここで見ると、rsa、次にbase64も実行されており、他の操作はありません
それを接続しましょう:
var initWithMethod = ObjC.classes.RSA['+ encryptString:publicKey:'];
Interceptor.attach(initWithMethod.implementation, {
onEnter: function (args) {
// console.log('initWithMethod called from:\n' +
// Thread.backtrace(this.context, Backtracer.ACCURATE)
// .map(DebugSymbol.fromAddress).join('\n') + '\n');
console.log("args[2]: ", ObjC.Object(args[2]));
console.log("args[3]: ", ObjC.Object(args[3]));
console.log("args[4]: ",hexdump(args[4]));
}, onLeave: function (retval) {
console.log('Base64Encode() this.args1 onLeave:', ObjC.Object(retval));
}
});
行きます、すぐに出てきませんか?
暗号化する必要がある値: "pro6.4.0.00njbh2wlr_1685327378963_38033100"
入力パラメータのステッチング appid、cv、プラットフォーム、reqid、version
秘密鍵と公開鍵も公開されています。
問題ありません。もう終わりにしましょう。