著者:郭蘭旺
さまざまな魔法のドキュメントと何日にもわたるデバッグを通じて、この最小限の逆コンパイル APK ドキュメントをコンパイルしました(ほんの数語、そうです)。APK を逆分析してデバッグするのは簡単です (シェルなし)。実際、主な目的は 4 つのコマンドです。
準備する
- apktoolをダウンロード:
https://ibotpeaches.github.io/Apktool/install/
- Android SDK Build-Tools をダウンロードします。位置合わせと署名に必要なコマンドは、このディレクトリ内の対応するバージョンのディレクトリにあります。たとえば、私のコマンドは D:\sdk\build-tools\30.0.3 ディレクトリにあります。このディレクトリを環境変数に追加すると、後で署名と位置合わせに必要なコマンドを直接使用できるようになります。
- オプションで、 jadx-gui をダウンロードすると
https://github.com/skylot/jadx
、apk ファイルを表示し、AS で開くための gralde プロジェクトとしてエクスポートできます。
プロセス
-
Decompress apk:
apktool d C:\Users\CSP\Desktop\TEMP\decompile\test.apk -o C:\Users\CSP\Desktop\TEMP\decompile\test
、最初のパラメータは解凍する apk、2 番目のパラメータ (-o の後) は解凍されたディレクトリです -
修正: レジスタの使用を混同しないように注意してください。さらに多くのレジスタを使用する必要がある場合は、メソッドの先頭で .locals x または .registers x に x+1 を設定する必要があります。特に注意してください。
- コードの挿入: アイデアの java2smali プラグインを使用して、最初に smali コードを生成します。.smali ファイル全体をパッケージにコピーすることも、smali コードを直接コピーすることもできます。挿入後にパッケージ名を変更するように注意してください。
- コードを変更します。smali 構文に精通している必要があります。Baidu は自分で使用できます。
- so コードを変更するには IDA が必要です。変更後、so ファイルを再保存し、元の so ファイルを置き換えます。so のアーキテクチャが複数ある場合は、変更して置き換える必要があることに注意してください。
- コードの削除: 推奨されません。削除する前にロジックを明確にすることが最善ですが、コードの半分は絶対に削除しないでください。
- リソース: AndroidManifest.xml を変更し、application タグの下に android:debuggable="true" を追加し、デバッグ前にコードを再パッケージ化します。
-
再パッケージ化:
apktool b C:\Users\CSP\Desktop\TEMP\decompile\test -o C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk
最初のパラメータはパッケージ化するディレクトリ ファイル、2 番目のパラメータ (-o の後) は再パッケージ化後の apk パスです。再パッケージ化が成功した場合は、任意のキーを押して続行します... -
Alignment :
zipalign -v 4 C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
最初のパラメータは調整する必要がある APK パス、2 番目のパラメータは調整された APK パスです。調整が成功すると、「検証成功」と表示されます。 -
Signature :
apksigner sign -verbose --ks C:\Users\CSP\Desktop\软件开发\反编译\mykeys.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key0 --ks-pass pass:mykeys --key-pass pass:mykeys --out C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
最初のパラメータ (-ks の後) はキー パス、続いて V1 および V2 署名を有効にするかどうか、その後に署名パスワード、最後の 2 つのパラメータ (-out の後) は署名された APK パスと必要性です。 sign.apk (位置合わせする必要があることに注意してください) パス。署名が成功すると、「署名済み」と表示されます。 -
インストール:
adb install C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk
-
デバッグ: jdax を使用して apk を Gradle プロジェクトとしてエクスポートし、AS で開くと、アタッチ デバッガーを介して新しく再パッケージ化されたプロジェクトをデバッグできます。デバッグ中は、行番号が一致しないため、添付ファイルを追加することしかできないことに注意してください。ブレークポイント (ダイヤモンドのアイコン、欠点、実行速度が非常に遅い)
-
注意事項:
- 上記のコマンドでは、ディレクトリとプロジェクト「test」を独自のディレクトリとプロジェクト名に変更するだけです。
- apktool、zipalign、apksigner、および adb コマンドは環境変数を追加する必要があります。追加しない場合は、それぞれのディレクトリの ./xxx にあるコマンドを実行します。
- zipalign と apksigner に必要な実行ファイルは、X:XX\sdk\build-tools\30.0.3 ディレクトリにあります。
- apksigner を使用して署名する場合は、署名前に位置合わせ操作を実行する必要があります (この署名方法が推奨されます)。
- 新しいバージョンの Android Studio によって生成された署名キーは、JDK バージョン 1.8 では使用できません。私は JDK バージョン 20 をインストールしました (AS に付属の 17 も機能します)
偽りの怠惰
最後まで怠惰を実行するために、bat スクリプトを作成しました (テスト ファイル ディレクトリにある必要があります)。
::关闭回显
@echo off
::防止中文乱码
chcp 65001
title 一键打包
start /wait apktool b C:\Users\CSP\Desktop\TEMP\decompile\test -o C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk
start /b /wait zipalign -v 4 C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
start /b /wait apksigner sign -verbose --ks C:\Users\CSP\Desktop\软件开发\反编译\mykeys.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key0 --ks-pass pass:mykeys --key-pass pass:mykeys --out C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
このスクリプトをバット ファイルにコピーし、ワンクリックで出力できます。
ただし、現時点では次のような欠陥があります: 1. 再パッケージ化には新しいウィンドウを開く必要があり、完了後に手動で閉じる必要があります; 2. 閉じた後、後続の位置合わせと署名の操作を実行するには「N」を入力する必要があります。最適化を手伝ってくれるバットマスター/( ㄒoㄒ)/~~!
-------更新
すごくだるい
「偽の怠惰」のパッケージング スクリプトには 2 つの欠陥があり、最後まで怠惰が実行されないため、解決策を探した結果、次の「真の怠惰」の解決策が見つかり、1 つのスクリプトでパッケージング全体を実行できるようになりました。クリック:
::关闭回显
@echo off
::防止中文乱码
chcp 65001
title 一键打包
call apktool b C:\Users\CSP\Desktop\TEMP\decompile\test -o C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk
call zipalign -v 4 C:\Users\CSP\Desktop\TEMP\decompile\test_b.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
del test_b.apk
call apksigner sign -verbose --ks C:\Users\CSP\Desktop\软件开发\反编译\mykeys.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key0 --ks-pass pass:mykeys --key-pass pass:mykeys --out C:\Users\CSP\Desktop\TEMP\decompile\test_b_sign.apk C:\Users\CSP\Desktop\TEMP\decompile\test_b_zipalign.apk
del test_b_zipalign.apk
echo 打包结束
echo 输出文件是-----test_b_sign.apk
pause
ご覧のとおり、start は call に置き換えられ、再パッケージ化され調整されたファイルは削除され、最後の署名付きファイルだけが残されました。
これで十分ですか?apktool b
最初のコマンドを実行すると、再パッケージ化の完了後に一時停止され、続行するにはボタンを押すように求められるため、十分ではありません。
もちろん、これは機能しません。ワンクリックではありません。次に、apktool のストレージ パスを見つけて、apktool.bat を開いて、最後の行を見つけます。
ここではプログラムが一時停止しているため、この行を削除します。もちろん、コメントするのが最善です。rem
先頭のコマンドをコメントできます。処理後、「ワンクリックパッケージング.bat」スクリプトを再実行します。途中で再パッケージ化しても「Press any key to continue...」が表示されなくなり、ワンクリックでパッケージング・アライメント・署名処理が実現できます( •̀ ω •́ )y。
もちろん、スクリプトをどこでも実行させたい場合は、スクリプトに変数を追加し、実行前に環境変数の形式でパッケージ化するディレクトリ パスを追加することもできます。
学習ノートもありますが、上記の知識ポイントをもとに、誰でも勉強しやすく、みんなで一緒に勉強できるように整理しました。参考方法:https://qr18.cn/CQ5TcL