Smali - Decompiling/[Modifying]/Compiling
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Deepen your expertise in Mobile Security with 8kSec Academy. Master iOS and Android security through our self-paced courses and get certified:
時には、隠された情報(おそらくよく難読化されたパスワードやフラグ)にアクセスするためにアプリケーションコードを変更することが興味深い場合があります。そのため、apkを逆コンパイルし、コードを変更して再コンパイルすることが興味深いかもしれません。
Opcodes reference: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Visual Studio CodeとAPKLab拡張機能を使用すると、コマンドを実行することなく、アプリケーションを自動的に逆コンパイル、変更、再コンパイル、署名&インストールできます。
この作業を大いに簡素化するスクリプトはhttps://github.com/ax/apk.shです。
APKToolを使用すると、smaliコードとリソースにアクセスできます:
If apktoolがエラーを出した場合は、最新バージョンをインストールしてみてください
見るべき興味深いファイルは次の通りです:
res/values/strings.xml(およびres/values/*内のすべてのxml)
AndroidManifest.xml
拡張子が_.sqlite_または_.db_のファイル
apktool
がアプリケーションのデコードに問題がある場合は、https://ibotpeaches.github.io/Apktool/documentation/#framework-filesを確認するか、-r
(リソースをデコードしない)という引数を使用してみてください。そうすれば、問題がリソースにあり、ソースコードにない場合は、問題が発生しません(リソースもデコンパイルされません)。
命令を変更したり、いくつかの変数の値を変更したり、新しい命令を追加することができます。私はVS Codeを使用してSmaliコードを変更します。その後、smalise拡張機能をインストールすると、エディタが命令が不正であるかどうかを教えてくれます。 いくつかの例はここにあります:
または、以下のSmali変更の説明を確認することができます。
コードを修正した後、次のコマンドを使用して再コンパイルできます:
新しいAPKは_dist_フォルダーの内部でコンパイルされます。
もしapktoolがエラーを投げたら、最新バージョンをインストールしてみてください。
次に、キーを生成する必要があります(パスワードとランダムに入力できるいくつかの情報を求められます):
最後に、新しいAPKを署名します:
zipalign は、Android アプリケーション (APK) ファイルに重要な最適化を提供するアーカイブ整列ツールです。こちらに詳細情報があります。
もしあなたがjarsignerの代わりにapksignerを使用することを好むなら、zipalignで最適化を適用した後にapkに署名する必要があります。しかし、jarsignerでアプリケーションに署名するのは一度だけであることに注意してください(zipalignの前)またはaspsignerで署名することができます(zipalignの後)。
次のHello World Javaコードの場合:
Smaliコードは次のようになります:
The Smali instruction set is available here.
いくつかの変数は、オペコード const を使用して関数の最初に定義されており、その値を変更することができます。または、新しい変数を定義することもできます:
Recommendations:
関数内で宣言された変数(v0,v1,v2...)を使用する場合は、これらの行を .local <number> と変数の宣言 (const v0, 0x1) の間に置いてください。
関数のコードの中間にログ記録コードを挿入したい場合:
宣言された変数の数に2を加えます:例:.locals 10 から .locals 12 へ。
新しい変数は、すでに宣言された変数の次の番号である必要があります(この例では v10 と v11 で、v0から始まることを忘れないでください)。
ログ記録関数のコードを変更し、v5 と v1 の代わりに v10 と v11 を使用します。
関数の最初に .locals の数に3を加えることを忘れないでください。
このコードは 関数の中間に挿入する ために準備されています(必要に応じて 変数 の 番号 を変更してください)。これは this.o の 値 を取得し、String に 変換 し、その 値 で トースト を 作成 します。
モバイルセキュリティの専門知識を深めるために、8kSecアカデミーをご利用ください。自己ペースのコースを通じてiOSとAndroidのセキュリティをマスターし、認定を取得しましょう:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)