Translated ['src/mobile-pentesting/android-app-pentesting/smali-changes.

This commit is contained in:
Translator 2025-09-04 02:40:43 +00:00
parent b39f5c6a7b
commit 4975d0491c
3 changed files with 212 additions and 123 deletions

View File

@ -1,4 +1,4 @@
# マルウェア
# マルウェア
{{#include ../../banners/hacktricks-training.md}}
@ -14,7 +14,7 @@
- [Intezer](https://analyze.intezer.com)
- [Any.Run](https://any.run/)
## オフラインアンチウイルスおよび検出ツール
## オフラインアンチウイルスおよび検出ツール
### Yara
@ -24,21 +24,21 @@ sudo apt-get install -y yara
```
#### ルールの準備
このスクリプトを使用して、githubからすべてのyaraマルウェアルールをダウンロードしてマージします: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
_**rules**_ ディレクトリを作成し、実行します。これにより、すべてのマルウェア用のyaraルールを含む _**malware_rules.yar**_ というファイルが作成されます。
このスクリプトを使って github からすべての yara malware rules をダウンロードしてマージしてください: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
_**rules**_ ディレクトリを作成し、スクリプトを実行してください。これにより、すべての yara malware rules が含まれる _**malware_rules.yar**_ というファイルが作成されます。
```bash
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules
python malware_yara_rules.py
```
#### スキャン
#### Scan
```bash
yara -w malware_rules.yar image #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder
```
#### YaraGen: マルウェアのチェックとルールの作成
#### YaraGen: malwareの検出とルール作成
バイナリから yara ルールを生成するために、ツール [**YaraGen**](https://github.com/Neo23x0/yarGen) を使用できます。これらのチュートリアルをチェックしてください: [**Part 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Part 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Part 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
ツール [**YaraGen**](https://github.com/Neo23x0/yarGen) を使って、バイナリから yara rules を生成できます。以下のチュートリアルを参照してください: [**Part 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Part 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Part 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
```bash
python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m ../../mals/
@ -49,7 +49,7 @@ python3.exe yarGen.py --excludegood -m ../../mals/
```
sudo apt-get install -y clamav
```
#### スキャン
#### Scan
```bash
sudo freshclam #Update rules
clamscan filepath #Scan 1 file
@ -57,26 +57,26 @@ clamscan folderpath #Scan the whole folder
```
### [Capa](https://github.com/mandiant/capa)
**Capa** は実行可能ファイルPE、ELF、.NET内の潜在的に悪意のある **機能** を検出します。これにより、Att\&ck 戦術や、次のような疑わしい機能を見つけることができます:
**Capa** は実行ファイルPE、ELF、.NET内の潜在的に悪意のある **capabilities** を検出します。したがって、Att\&ck tactics のようなものや、次のような疑わしい **capabilities** を見つけます:
- OutputDebugString エラーのチェック
- サービスとして実行
- プロセスの作成
- OutputDebugString のエラーをチェックする
- サービスとして実行する
- プロセスを作成する
[**Github リポジトリ**](https://github.com/mandiant/capa) から入手できます
入手先は [**Github repo**](https://github.com/mandiant/capa)
### IOCs
IOC は、妥協の指標Indicator Of Compromiseを意味します。IOC は、潜在的に望ましくないソフトウェアや確認された **マルウェア** を特定するための **条件のセット** です。ブルーチームは、この種の定義を使用して、**システム** や **ネットワーク** 内のこの種の悪意のあるファイルを **検索** します。\
これらの定義を共有することは非常に有用で、コンピュータ内でマルウェアが特定され、そのマルウェアの IOC が作成されると、他のブルーチームはそれを使用してマルウェアをより迅速に特定できます。
IOC は Indicator Of Compromise侵害の指標を意味します。IOC は、潜在的に望ましくないソフトウェアや確認された **malware** を特定するための **conditions that identify** の集合です。Blue Teams はこの種の定義を使って、自分たちの **systems****networks** 内でこの種の悪意あるファイルを **search for this kind of malicious files** します。\
これらの定義を共有することは非常に有益です。コンピュータで malware が特定され、その malware 用の IOC が作成されると、他の Blue Teams はそれを使って malware をより速く特定できます。
IOC を作成または修正するためのツール [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
[**Redline**](https://www.fireeye.com/services/freeware/redline.html) のようなツールを使用して、**デバイス内の定義された IOC を検索** できます。
IOC を作成または修正するためのツールとして [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
[**Redline**](https://www.fireeye.com/services/freeware/redline.html) のようなツールを使用して、デバイス上で **search for defined IOCs in a device** を行うことができます。
### Loki
[**Loki**](https://github.com/Neo23x0/Loki) は、シンプルな妥協の指標のスキャナーです。\
検出は、4つの検出方法に基づいています
[**Loki**](https://github.com/Neo23x0/Loki) は Simple Indicators of Compromise のスキャナーです。\
検出は4つの検出方法に基づいています:
```
1. File Name IOC
Regex match on full file path/name
@ -92,41 +92,41 @@ Compares process connection endpoints with C2 IOCs (new since version v.10)
```
### Linux Malware Detect
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) は、GNU GPLv2 ライセンスの下でリリースされた Linux 用のマルウェアスキャナーで、共有ホスティング環境で直面する脅威に基づいて設計されています。ネットワークエッジ侵入検知システムからの脅威データを使用して、攻撃に積極的に使用されているマルウェアを抽出し、検出のためのシグネチャを生成します。さらに、脅威データは、LMD チェックアウト機能を使用したユーザーの提出やマルウェアコミュニティリソースからも得られます。
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) は GNU GPLv2 ライセンスで配布される Linux 向けの malware scanner で、共有ホスティング環境で直面する脅威を念頭に設計されています。network edge intrusion detection systems からの脅威データを使用して、攻撃で実際に使用されている malware を抽出し、検出用の signatures を生成します。さらに、脅威データは LMD の checkout feature を使った user submissions や malware community resources からも得られます。
### rkhunter
[**rkhunter**](http://rkhunter.sourceforge.net) のようなツールを使用して、ファイルシステムに対して可能な **rootkits** やマルウェアをチェックすることができます。
Tools like [**rkhunter**](http://rkhunter.sourceforge.net) can be used to check the filesystem for possible **rootkits** and malware.
```bash
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
```
### FLOSS
[**FLOSS**](https://github.com/mandiant/flare-floss)は、異なる技術を使用して実行可能ファイル内の難読化された文字列を見つけようとするツールです。
[**FLOSS**](https://github.com/mandiant/flare-floss) は、様々な手法を用いて executables 内の obfuscated strings を検出しようとするツールです。
### PEpper
[PEpper](https://github.com/Th3Hurrican3/PEpper)は、実行可能ファイル内の基本的な情報バイナリデータ、エントロピー、URLおよびIP、いくつかのyaraルール)をチェックします。
[PEpper ](https://github.com/Th3Hurrican3/PEpper) は executable 内の基本的な情報binary data、entropy、URLs and IPs、some yara rules)をチェックします。
### PEstudio
[PEstudio](https://www.winitor.com/download)は、インポート、エクスポート、ヘッダーなどのWindows実行可能ファイルの情報を取得するツールですが、ウイルス総合チェックも行い、潜在的なAtt\&ck技術を見つけます。
[PEstudio](https://www.winitor.com/download) は、Windows executables の imports、exports、headers といった情報を取得できるツールで、virus total のチェックや潜在的な Att\&ck techniques の検出も行います。
### Detect It Easy(DiE)
[**DiE**](https://github.com/horsicq/Detect-It-Easy/)は、ファイルが**暗号化**されているかどうかを検出し、**パッカー**を見つけるツールです。
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) は、ファイルが **encrypted** かどうかを検出し、**packers** を見つけるツールです。
### NeoPI
[**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI)は、テキスト/スクリプトファイル内の**難読化**された**暗号化**されたコンテンツを検出するためにさまざまな**統計的手法**を使用するPythonスクリプトです。NeoPIの目的は、**隠れたウェブシェルコードの検出**を支援することです。
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) は、様々な **statistical methods** を用いて text/script files 内の **obfuscated****encrypted** コンテンツを検出する Python スクリプトです。NeoPI の目的は、**detection of hidden web shell code** を支援することです。
### **php-malware-finder**
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder)は、**難読化された**/**不正なコード**や、**マルウェア**/ウェブシェルでよく使用される**PHP**関数を使用しているファイルを検出するために最善を尽くします。
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) は、**obfuscated**/**dodgy code** の検出や、**PHP** 関数を使った **malwares**/webshells によく使われるファイルの検出に最善を尽くします。
### Apple Binary Signatures
いくつかの**マルウェアサンプル**をチェックする際には、**バイナリの署名**を常に**確認**するべきです。署名した**開発者**がすでに**マルウェア**に関連している可能性があります。
いくつかの **malware sample** を調査する際は、署名されたバイナリの **signature** を常に確認してください。署名した **developer** が既に **malware** と関連している可能性があるためです。
```bash
#Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -141,23 +141,35 @@ spctl --assess --verbose /Applications/Safari.app
### File Stacking
もしウェブサーバーの**ファイル**を含むフォルダーが**最終更新日**を知っている場合、**ウェブサーバーのすべてのファイルが作成および変更された**日付を**確認**し、いずれかの日付が**疑わしい**場合は、そのファイルを確認してください。
もしあるフォルダに含まれる **files****last updated on some date** と分かっている場合は、web server の全ての **files** が作成・変更された **date** を確認し、いずれかの **date****suspicious** ならそのファイルを調べてください。
### Baselines
フォルダーのファイルが**変更されるべきではなかった**場合、フォルダーの**元のファイル**の**ハッシュ**を計算し、**現在の**ものと**比較**できます。変更されたものは**疑わしい**です。
フォルダ内の files が **shouldn't have been modified** はずであれば、そのフォルダの **original files****hash** を計算して **current** なものと **compare** できます。変更されたものは **suspicious** です。
### Statistical Analysis
情報がログに保存されている場合、各ウェブサーバーのファイルがどれだけアクセスされたかなどの**統計**を**確認**できます。ウェブシェルがその中の一つかもしれません。
情報が logs に保存されている場合、web server の各ファイルが何回アクセスされたかのような統計を **check** できます。web shell が最も多くアクセスされたものの一つかもしれません。
---
### Android in-app native telemetry (no root)
On Android, you can instrument native code inside the target app process by preloading a tiny logger library before other JNI libs initialize. This gives early visibility into native behavior without system-wide hooks or root. A popular approach is SoTap: drop libsotap.so for the right ABI into the APK and inject a System.loadLibrary("sotap") call early (e.g., static initializer or Application.onCreate), then collect logs from internal/external paths or Logcat fallback.
See the Android native reversing page for setup details and log paths:
{{#ref}}
../../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
{{#endref}}
---
## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)
現代のマルウェアファミリーは、制御フローグラフCFG難読化を大いに悪用しています直接のジャンプ/コールの代わりに、実行時に宛先を計算し、`jmp rax`または`call rax`を実行します。小さな*ディスパッチャ*通常は9命令がCPUの`ZF`/`CF`フラグに応じて最終ターゲットを設定し、静的CFGの回復を完全に破壊します。
Modern malware families heavily abuse Control-Flow Graph (CFG) obfuscation: instead of a direct jump/call they compute the destination at run-time and execute a `jmp rax` or `call rax`. A small *dispatcher* (typically nine instructions) sets the final target depending on the CPU `ZF`/`CF` flags, completely breaking static CFG recovery.
この技術は、SLOW#TEMPESTローダーによって示されており、IDAPythonとUnicorn CPUエミュレーターにのみ依存する3ステップのワークフローで打破できます。
The technique showcased by the SLOW#TEMPEST loader can be defeated with a three-step workflow that only relies on IDAPython and the Unicorn CPU emulator.
### 1. Locate every indirect jump / call
```python
@ -168,7 +180,7 @@ mnem = idc.print_insn_mnem(ea)
if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax":
print(f"[+] Dispatcher found @ {ea:X}")
```
### 2. ディスパッチャーバイトコードを抽出する
### 2. ディスパッチャーバイトコードを抽出する
```python
import idc
@ -199,9 +211,9 @@ mu.reg_write(UC_X86_REG_RAX, 0)
mu.emu_start(BASE, BASE+len(code))
return mu.reg_read(UC_X86_REG_RAX)
```
`run(code,0,0)``run(code,1,1)` を実行して *false* および *true* ブランチターゲットを取得します
Run `run(code,0,0)``run(code,1,1)` を実行して、*false* および *true* のブランチターゲットを取得する
### 4. 直接ジャンプ / コールをパッチバックする
### 4. パッチで直接 jump / call を元に戻す
```python
import struct, ida_bytes
@ -210,27 +222,28 @@ op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32
disp = target - (ea + 5) & 0xFFFFFFFF
ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('<I', disp))
```
パッチを適用した後、IDAに関数を再分析させて、完全なCFGとHex-Raysの出力を復元させます:
パッチ適用後、IDA に関数の再解析を強制して、完全な CFG と Hex-Rays の出力が復元されるように:
```python
import ida_auto, idaapi
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
```
### 5. 間接API呼び出しにラベルを付ける
### 5. 間接APIコールにラベルを付ける
`call rax` の実際の宛先がわかると、IDAにそれを伝えることができるため、パラメータの型と変数名が自動的に回復されます:
`call rax` の実際の宛先が判明したら、IDAにそれが何かを教えることで、パラメータ型や変数名が自動的に復元されます:
```python
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
```
### 実用的な利点
* 実際のCFGを復元 → デコンパイルが*10*行から数千行に増加します
* 文字列の交差参照とxrefsを可能にし、動作の再構築を簡単にします
* スクリプトは再利用可能:同じトリックで保護された任意のローダーにドロップできます
* 実際の CFG を復元 → decompilation が *10* 行から数千行に増える
* string-cross-reference & xrefs を有効にし、behaviour reconstruction を容易にする
* Scripts は再利用可能: 同じトリックで保護された任意の loader にドロップできる
---
## 参考文献
- [Unit42 Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
- SoTap: Lightweight in-app JNI (.so) behavior logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,47 +1,50 @@
# ネイティブライブラリのリバースエンジニアリング
# ネイティブライブラリのリバース
{{#include ../../banners/hacktricks-training.md}}
**詳細情報は次を確認してください:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Androidアプリは、パフォーマンスが重要なタスクのために通常CまたはC++で書かれたネイティブライブラリを使用できます。マルウェア作成者もこれらのライブラリを悪用します。なぜなら、ELF共有オブジェクトはDEX/OATバイトコードよりもデコンパイルが難しいからです。このページは、Androidの`.so`ファイルのリバースエンジニアリングを容易にする*実用的*なワークフローと*最近の*ツール改善2023-2025に焦点を当てています。
**For further information check:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
Androidアプリはパフォーマンスが重要な処理で、通常CまたはC++で書かれたネイティブライブラリを使用できます。マルウェア作成者もこれらのライブラリを悪用します。ELF shared objectsはDEX/OATバイトコードより逆コンパイルが難しいためです。
このページは、Android `.so` ファイルの逆解析を容易にする*実践的*なワークフローと*最近*のツール改善20232025に焦点を当てています。
---
### 新しく取得した`libfoo.so`のための迅速なトリアージワークフロー
### 新たに取得した `libfoo.so` の簡易トリアージワークフロー
1. **ライブラリを抽出する**
1. **ライブラリを抽出**
```bash
# インストールされたアプリケーションから
# From an installed application
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
# またはAPKzipから
# Or from the APK (zip)
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
```
2. **アーキテクチャと保護を特定する**
2. **アーキテクチャと保護を特定**
```bash
file libfoo.so # arm64またはarm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELROなど
file libfoo.so # arm64 or arm32 / x86
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
checksec --file libfoo.so # (peda/pwntools)
```
3. **エクスポートされたシンボルとJNIバインディングをリストする**
3. **エクスポートされたシンボルとJNIバインディングを列挙**
```bash
readelf -s libfoo.so | grep ' Java_' # 動的リンクされたJNI
strings libfoo.so | grep -i "RegisterNatives" -n # 静的登録されたJNI
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
```
4. **デコンパイラに読み込む** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, HopperまたはCutter/Rizin) し、自動分析を実行します。新しいGhidraバージョンは、PAC/BTIスタブとMTEタグを認識するAArch64デコンパイラを導入し、Android 14 NDKで構築されたライブラリの分析を大幅に改善しました。
5. **静的リバースエンジニアリングと動的リバースエンジニアリングを決定する:** ストリップされた、難読化されたコードはしばしば*インスツルメンテーション*Frida、ptrace/gdbserver、LLDBが必要です。
4. **デコンパイラで読み込んで自動解析を実行** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin)。
新しい Ghidra バージョンは AArch64 decompiler を導入し、PAC/BTI スタブや MTE タグを認識するようになったため、Android 14 NDK でビルドされたライブラリの解析が大幅に改善しています。
5. **静的解析 vs 動的解析 を決定:** ストリップ済みや難読化されたコードは通常*計測・操作*Frida, ptrace/gdbserver, LLDBを必要とします。
---
### 動的インスツルメンテーション (Frida ≥ 16)
### Dynamic Instrumentation (Frida ≥ 16)
Fridaの16シリーズは、ターゲットが最新のClang/LLD最適化を使用している場合に役立ついくつかのAndroid特有の改善をもたらしました
Frida の 16 系では、ターゲットが最新の Clang/LLD 最適化を使用している場合に役立つ、Android 固有の改善がいくつか導入されました:
* `thumb-relocator`は、LLDの攻撃的なアライメント`--icf=all`)によって生成された*小さなARM/Thumb関数*を*フック*できるようになりました
* *ELFインポートスロット*の列挙と再バインディングはAndroidで機能し、インラインフックが拒否された場合にモジュールごとの`dlopen()`/`dlsym()`パッチを可能にします
* Javaフックは、Android 14で`--enable-optimizations`を使用してアプリがコンパイルされるときに使用される新しい**ARTクイックエントリポイント**のために修正されました。
* `thumb-relocator` は、LLD の攻撃的なアライメント(`--icf=all`)によって生成される小さな ARM/Thumb 関数を*フックできるようになりました*
* 列挙と再バインドによる*ELF import slots*の操作が Android で動作するようになり、inline hooks が拒否された場合にモジュール単位での `dlopen()`/`dlsym()` パッチが可能になりました
* Java フッキングは、Android 14 でアプリが `--enable-optimizations` でコンパイルされた際に使用される新しい **ART quick-entrypoint** に対応するよう修正されました。
例:`RegisterNatives`を通じて登録されたすべての関数を列挙し、実行時にそのアドレスをダンプする
Example: `RegisterNatives` を通じて登録されたすべての関数を列挙し、実行時にそのアドレスをダンプする:
```javascript
Java.perform(function () {
var Runtime = Java.use('java.lang.Runtime');
@ -58,38 +61,76 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
});
});
```
Fridaは、PAC/BTI対応デバイスPixel 8/Android 14+で、frida-server 16.2以降を使用すれば、すぐに動作します。以前のバージョンはインラインフックのためのパディングを見つけることができませんでした。 citeturn5search2turn5search0
Fridaは、PAC/BTI-enabled devices (Pixel 8/Android 14+) 上でも frida-server 16.2 以降を使用すればそのまま動作します — それ以前のバージョンは inline hooks 用のパディングを検出できませんでした。
### 事前読み込みされた .so によるプロセスローカル JNI テレメトリ (SoTap)
full-featured instrumentation が過剰またはブロックされている場合でも、ターゲットプロセス内に小さなロガーを事前読み込みすることでネイティブレベルの可視性を得られます。SoTap は同一アプリプロセス内の他の JNI (.so) ライブラリの実行時挙動をログする軽量の Android ネイティブ (.so) ライブラリですroot 不要)。
Key properties:
- Initializes early and observes JNI/native interactions inside the process that loads it.
- Persists logs using multiple writable paths with graceful fallback to Logcat when storage is restricted.
- Source-customizable: edit sotap.c to extend/adjust what gets logged and rebuild per ABI.
Setup (repack the APK):
1) Drop the proper ABI build into the APK so the loader can resolve libsotap.so:
- lib/arm64-v8a/libsotap.so (for arm64)
- lib/armeabi-v7a/libsotap.so (for arm32)
2) Ensure SoTap loads before other JNI libs. Inject a call early (e.g., Application subclass static initializer or onCreate) so the logger is initialized first. Smali snippet example:
```smali
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
```
3) Rebuild/sign/install, run the app, then collect logs.
Log paths (checked in order):
```
/data/user/0/%s/files/sotap.log
/data/data/%s/files/sotap.log
/sdcard/Android/data/%s/files/sotap.log
/sdcard/Download/sotap-%s.log
# If all fail: fallback to Logcat only
```
Notes and troubleshooting:
- ABIの整合は必須です。ミスマッチがあると UnsatisfiedLinkError が発生し、ロガーはロードされません。
- 現代の Android ではストレージ制約が一般的です。ファイル書き込みに失敗した場合でも、SoTap は Logcat 経由で出力します。
- 動作冗長性はカスタマイズすることを想定しています。sotap.c を編集したらソースから再ビルドしてください。
このアプローチは、プロセス開始時からのネイティブ呼び出しフローを観察することが重要で、root やシステム全体のフックが利用できない場合の malware triage と JNI デバッグに有用です。
---
### APKで狙うべき最近の脆弱性
### APK 内で探す価値のある最近の脆弱性
| 年 | CVE | 影響を受けるライブラリ | ノート |
| 年 | CVE | 影響ライブラリ | 備考 |
|------|-----|------------------|-------|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|WebP画像をデコードするネイティブコードから到達可能なヒープバッファオーバーフロー。いくつかのAndroidアプリが脆弱なバージョンをバンドルしています。APK内に`libwebp.so`が見つかった場合、そのバージョンを確認し、エクスプロイトまたはパッチを試みてください。| citeturn2search0|
|2024|複数|OpenSSL 3.xシリーズ|いくつかのメモリ安全性およびパディングオラクルの問題。多くのFlutterおよびReactNativeバンドルは独自の`libcrypto.so`を出荷しています。|
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|WebP 画像をデコードするネイティブコードから到達可能なヒープバッファオーバーフロー。複数の Android アプリが脆弱なバージョンをバンドルしています。APK 内に `libwebp.so` がある場合は、そのバージョンを確認し、エクスプロイトまたはパッチ適用を試みてください.| |
|2024|Multiple|OpenSSL 3.x series|複数のメモリ安全性の問題やパディングオラクル問題。多くの Flutter & ReactNative バンドルは独自の `libcrypto.so` を同梱します。|
APK内に*サードパーティ*の`.so`ファイルを見つけた場合は、常にそのハッシュを上流のアドバイザリーと照合してください。モバイルではSCAソフトウェア構成分析が一般的ではないため、古い脆弱なビルドが蔓延しています。
APK 内で *third-party*`.so` ファイルを見つけたら、必ず上流のアドバイザリとハッシュを照合してください。SCA (Software Composition Analysis) はモバイルではあまり行われないため、古い脆弱なビルドが蔓延しています。
---
### 逆アセンブル防止およびハードニングのトレンドAndroid 13-15
### 逆解析対策とハードニングの傾向 (Android 13-15)
* **ポインタ認証PACおよびブランチターゲット識別BTI** Android 14は、サポートされているARMv8.3+シリコンのシステムライブラリでPAC/BTIを有効にします。デコンパイラはPAC関連の擬似命令を表示します。動的分析のためにFridaはPACを除去した後にトランポリンを注入しますが、カスタムトランポリンは必要に応じて`pacda`/`autibsp`を呼び出すべきです。
* **MTEおよびScudoハードニングアロケータ** メモリタグ付けはオプトインですが、多くのPlay-Integrity対応アプリは`-fsanitize=memtag`でビルドされています。タグフォルトをキャプチャするには、`setprop arm64.memtag.dump 1``adb shell am start ...`を使用してください。
* **LLVMオブフスケータ不透明な述語、制御フローのフラット化** 商業パッカーBangcle、SecNeoは、Javaだけでなく*ネイティブ*コードを保護する傾向が高まっています。`.rodata`内に偽の制御フローや暗号化された文字列ブロブを期待してください。
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14 は、サポートされる ARMv8.3+ シリコン上のシステムライブラリで PAC/BTI を有効にします。Decompilers は現在 PAC 関連の疑似命令を表示します。動的解析では Frida が PAC を剥がした後にトランポリンを注入しますが、カスタムトランポリンは必要に応じて `pacda`/`autibsp` を呼び出すべきです。
* **MTE & Scudo hardened allocator:** memory-tagging はオプトインですが、多くの Play-Integrity 対応アプリは `-fsanitize=memtag` でビルドしています。タグフォルトを捕捉するには `setprop arm64.memtag.dump 1``adb shell am start ...` を使用してください。
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** 商用のパッカー(例: Bangcle, SecNeoはネイティブコードも保護することが増え、Java のみならず `.rodata` に偽のコントロールフローや暗号化された文字列ブロブが存在することを想定してください。
---
### リソース
- **ARMアセンブリの学習:** [Azeria Labs ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **JNIおよびNDKドキュメント:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/)
- **ネイティブライブラリのデバッグ:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
- **Learning ARM Assembly:** [Azeria Labs ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)
- **JNI & NDK Documentation:** [Oracle JNI Spec](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI Tips](https://developer.android.com/training/articles/perf-jni) · [NDK Guides](https://developer.android.com/ndk/guides/)
- **Debugging Native Libraries:** [Debug Android Native Libraries Using JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
### 参考文献
### 参考
- Frida 16.xの変更ログAndroidフッキング、tiny-functionの再配置 [frida.re/news](https://frida.re/news/) citeturn5search0
- `libwebp`オーバーフローCVE-2023-4863に関するNVDアドバイザリー [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
- Frida 16.x change-log (Android hooking, tiny-function relocation) [frida.re/news](https://frida.re/news/)
- NVD advisory for `libwebp` overflow CVE-2023-4863 [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863)
- SoTap: Lightweight in-app JNI (.so) behavior logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
- SoTap Releases [github.com/RezaArbabBot/SoTap/releases](https://github.com/RezaArbabBot/SoTap/releases)
- How to work with SoTap? [t.me/ForYouTillEnd/13](https://t.me/ForYouTillEnd/13)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,85 +1,86 @@
# Smali - コンパイル/[修正]/コンパイル
# Smali - コンパイル/[修正]/コンパイル
{{#include ../../banners/hacktricks-training.md}}
時には、隠された情報おそらくよく難読化されたパスワードやフラグにアクセスするためにアプリケーションコードを修正することが興味深い場合があります。そのため、apkをデコンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。
**オペコードリファレンス:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
アプリケーションのコードを変更して隠された情報例えば難読化されたパスワードやフラグにアクセスすることが有用な場合があります。その場合、apkを逆コンパイルしてコードを修正し、再コンパイルすることが有効です。
**Opcodes リファレンス:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
## 簡単な方法
**Visual Studio Code**と[APKLab](https://github.com/APKLab/APKLab)拡張機能を使用すると、コマンドを実行することなく、アプリケーションを**自動的にデコンパイル**、修正、**再コンパイル**、署名&インストールできます。
Using **Visual Studio Code** and the [APKLab](https://github.com/APKLab/APKLab) extension, you can **automatically decompile**, modify, **recompile**, sign & install the application without executing any command.
この作業を大いに簡素化する**スクリプト**は[**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)です。
Another **script** that facilitates this task a lot is [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
## APKをデコンパイルする
## Decompile the APK
APKToolを使用すると、**smaliコードとリソース**にアクセスできます:
APKTool を使用すると **smali code and resources** にアクセスできます:
```bash
apktool d APP.apk
```
もし**apktool**がエラーを出した場合は、[**最新バージョン**](https://ibotpeaches.github.io/Apktool/install/)をインストールしてみてください。
もし**apktool**がエラーを出す場合は、[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/) をインストールしてみてください。
あなたが見るべき**興味深いファイルは**次の通りです:
Some **interesting files you should look are**:
- _res/values/strings.xml_およびres/values/\*内のすべてのxml
- _res/values/strings.xml_ (and all xmls inside res/values/*)
- _AndroidManifest.xml_
- 拡張子が_.sqlite_または_.db_のファイル
- Any file with extension _.sqlite_ or _.db_
もし`apktool`**アプリケーションのデコードに問題がある**場合は、[https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files)を確認するか、**`-r`**(リソースをデコードしない)という引数を使用してみてください。その後、問題がリソースにあり、ソースコードにない場合は、問題が発生しません(リソースもデコンパイルされません)。
もし `apktool` がアプリケーションのデコードに**問題がある場合**、[https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) を確認するか、引数 **`-r`**(リソースをデコードしない)を使ってみてください。もし問題がリソース側にありソースコード側にない場合、この方法で問題を回避できます(リソースはデコンパイルされません)。
## Smaliコードの変更
## Change smali code
あなたは**命令を変更**したり、いくつかの変数の**値を変更**したり、新しい命令を**追加**することができます。私は[**VS Code**](https://code.visualstudio.com)を使用してSmaliコードを変更します。その後、**smalise拡張機能**をインストールすると、エディタが**命令が不正確である**かどうかを教えてくれます。\
いくつかの**例**はここにあります:
命令を**変更**したり、いくつかの変数の**値**を変更したり、新しい命令を**追加**することができます。私はSmaliコードを[**VS Code**](https://code.visualstudio.com)で編集します。**smalise extension**をインストールすると、エディタが命令に誤りがあるかどうかを教えてくれます。\
いくつかの**例**は以下にあります:
- [Smali変更の例](smali-changes.md)
- [Smali changes examples](smali-changes.md)
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
または、[**以下のSmali変更の説明を確認することができます**](smali-changes.md#modifying-smali)
または、[**check below some Smali changes explained**](smali-changes.md#modifying-smali) を確認してください
## APKの再コンパイル
## Recompile the APK
コードを修正した後、次のコマンドを使用して**再コンパイル**できます:
コードを変更した後、次のコマンドでコードを**再コンパイル**できます:
```bash
apktool b . #In the folder generated when you decompiled the application
```
新しいAPKは_**dist**_フォルダーの**部****コンパイル**されます。
新しい APK _**dist**_ フォルダ内でコンパイルされます。
もし**apktool**が**エラー**を投げた場合は、[**最新バージョン**をインストール](https://ibotpeaches.github.io/Apktool/install/)してみてください。
もし **apktool** がエラーを出す場合は、[最新バージョンをインストールしてみてください](https://ibotpeaches.github.io/Apktool/install/)
### **新しいAPKに署名する**
### **新しい APK に署名する**
次に、**キーを生成**する必要があります(パスワードといくつかの情報をランダムに入力するよう求められます):
次に、**キーを生成する**必要があります(パスワードや、ランダムに入力して構わないいくつかの情報を尋ねられます):
```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
```
最後に、新しいAPKに**署名**します:
最後に、新しい APK に **署名**してください:
```bash
jarsigner -keystore key.jks path/to/dist/* <your-alias>
```
### 新しいアプリケーション最適化
### 新しいアプリケーション最適化
**zipalign** は、Android アプリケーション (APK) ファイルに重要な最適化を提供するアーカイブ整列ツールです。[More information here](https://developer.android.com/studio/command-line/zipalign).
**zipalign** は、Android application (APK) files に重要な最適化を提供するアーカイブ整列ツールです。 [More information here](https://developer.android.com/studio/command-line/zipalign).
```bash
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk
```
### **新しいAPKに署名する再度**
### **新しい APK に署名(また**
もしあなたが**apksigner**を使用することを**好む**場合、**最適化を適用した後にapkに署名する必要があります**。ただし、**アプリケーションには一度だけ署名する必要があることに注意してください**。jarsignerzipalignの前またはaspsignerzipalignの後で署名してください。
もし **好む** なら [**apksigner**](https://developer.android.com/studio/command-line/) を jarsigner の代わりに使う場合は、**zipaling による最適化** を適用した後で apk に **署名してください**。ただし、jarsignerzipalign の前)で、または aspsignerzipaling の後)で **アプリケーションを一度だけ署名すればよい** という点に注意してください。
```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk
```
## Smaliの変更
次のHello World Javaコードについて:
以下の Hello World Java コードの場合:
```java
public static void printHelloWorld() {
System.out.println("Hello World")
}
```
Smaliコードは次のようになります:
Smali コードは次のようになります:
```java
.method public static printHelloWorld()V
.registers 2
@ -89,13 +90,13 @@ invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
```
The Smali instruction set is available [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
Smali命令セットは[here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions)で参照できます。
### Light Changes
### 軽微な変更
### 関数内変数の初期値を変更する
### 関数内変数の初期値を変更する
いくつかの変数は、オペコード _const_ を使用して関数の最初に定義されており、その値を変更することができます。または、新しい値を定義することもできます:
いくつかの変数は関数の先頭で opcode _const_ を使って定義されており、その値を変更したり、新しい変数を定義したりできます:
```bash
#Number
const v9, 0xf4240
@ -126,7 +127,7 @@ iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
goto :goto_6 #Always go to: :goto_6
```
### より大きな変更
### 大きな変更
### ロギング
```bash
@ -137,19 +138,19 @@ move-result-object v1 #Move to v1
const-string v5, "wins" #Save "win" inside v5
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
```
推奨事項
推奨事項:
- 関数内で宣言された変数v0、v1、v2...)を使用する場合は、これらの行を _.local \<number>_ と変数の宣言 (_const v0, 0x1_) の間に置いてください。
- 関数のコードの中間にログ記録コードを挿入したい場合:
- 宣言された変数の数に2を加えます_.locals 10_ から _.locals 12_
- 新しい変数は、すでに宣言された変数の次の番号である必要があります(この例では _v10__v11_ で、v0から始まることを忘れないでください)。
- ログ記録関数のコードを変更し、_v5_ と _v1_ の代わりに _v10__v11_ を使用します
- 関数内で宣言済みの変数(宣言された v0,v1,v2...)を使用する場合、これらの行を _.local <number>_ と変数の宣言_const v0, 0x1_の間に置いてください。
- 関数のコードの途中にログ用コードを挿入したい場合:
- 宣言済み変数の数に2を足します例: _.locals 10_ から _.locals 12_
- 新しい変数は既に宣言されている変数の次の番号にします(この例では _v10__v11_ になります。先頭は v0 から始まることを忘れないでください)。
- ログ関数のコードを変更し、_v10_ と _v11__v5__v1_ の代わりに使用してください
### トースティング
### トースト表示
関数の最初に _.locals_ の数に3を加えることを忘れないでください。
関数の先頭で _.locals_ の数に3を追加することを忘れないでください。
このコードは **関数の中間に挿入する** ために準備されています(**必要に応じて** **変数****番号** を変更してください)。これは **this.o****値** を取得し、**String** に **変換** し、その値で **トースト****作成** します。
このコードは **関数の途中** に挿入するために準備されています(必要に応じて **変数** の数を変更してください)。これは **this.o** の値を取得して **String** に変換し、その値で **toast** を表示します。
```bash
const/4 v10, 0x1
const/4 v11, 0x1
@ -161,4 +162,38 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
move-result-object v12
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
```
### 起動時にネイティブライブラリを読み込む (System.loadLibrary)
場合によっては、他の JNI libs より先に初期化されるようにネイティブライブラリを事前ロードする必要があります(例: プロセスローカルのテレメトリ/ロギングを有効にするため)。静的イニシャライザまたは Application.onCreate() の早い段階に System.loadLibrary() の呼び出しを注入できます。静的クラスイニシャライザ (<clinit>) の smali 例:
```smali
.class public Lcom/example/App;
.super Landroid/app/Application;
.method static constructor <clinit>()V
.registers 1
const-string v0, "sotap" # library name without lib...so prefix
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
return-void
.end method
```
あるいは、同じ2つの命令を Application.onCreate() の先頭に配置して、ライブラリができるだけ早くロードされるようにしてください:
```smali
.method public onCreate()V
.locals 1
const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
invoke-super {p0}, Landroid/app/Application;->onCreate()V
return-void
.end method
```
注意:
- UnsatisfiedLinkErrorを避けるため、ライブラリの正しいABIバリアントが lib/<abi>/(例: arm64-v8a/armeabi-v7aに存在することを確認してください。
- 非常に早いタイミングclass static initializerでロードすると、native loggerがその後のJNI活動を観測できることが保証されます。
## 参考
- SoTap: アプリ内での JNI (.so) 挙動を記録する軽量 logger [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
{{#include ../../banners/hacktricks-training.md}}