mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/smali-changes.
This commit is contained in:
parent
e2da0eef69
commit
8b7878fd84
@ -1,12 +1,12 @@
|
||||
# Malware Analizi
|
||||
# Malware Analysis
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Adli Bilimler Hızlı Referansları
|
||||
## Adli Bilişim CheatSheet'leri
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
## Çevrimiçi Hizmetler
|
||||
## Çevrimiçi Servisler
|
||||
|
||||
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||
@ -14,7 +14,7 @@
|
||||
- [Intezer](https://analyze.intezer.com)
|
||||
- [Any.Run](https://any.run/)
|
||||
|
||||
## Çevrimdışı Antivirüs ve Tespit Araçları
|
||||
## Çevrimdışı Antivirus ve Tespit Araçları
|
||||
|
||||
### Yara
|
||||
|
||||
@ -24,8 +24,8 @@ sudo apt-get install -y yara
|
||||
```
|
||||
#### Kuralları Hazırlayın
|
||||
|
||||
Use this script to download and merge all the yara malware rules from github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Create the _**rules**_ directory and execute it. This will create a file called _**malware_rules.yar**_ which contains all the yara rules for malware.
|
||||
Bu script'i kullanarak github'tan tüm yara malware kurallarını indirip birleştirin: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
_**rules**_ dizinini oluşturun ve script'i çalıştırın. Bu, tüm malware için yara kurallarını içeren _**malware_rules.yar**_ adlı bir dosya oluşturacaktır.
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
@ -36,9 +36,9 @@ python malware_yara_rules.py
|
||||
yara -w malware_rules.yar image #Scan 1 file
|
||||
yara -w malware_rules.yar folder #Scan the whole folder
|
||||
```
|
||||
#### YaraGen: Kötü amaçlı yazılımı kontrol et ve kurallar oluştur
|
||||
#### YaraGen: malware için kontrol etme ve kurallar oluşturma
|
||||
|
||||
Binary'den yara kuralları oluşturmak için [**YaraGen**](https://github.com/Neo23x0/yarGen) aracını kullanabilirsiniz. Bu eğitimlere göz atın: [**Bölüm 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Bölüm 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Bölüm 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
|
||||
Bir ikili dosyadan yara rules oluşturmak için [**YaraGen**](https://github.com/Neo23x0/yarGen) aracını kullanabilirsiniz. Bu öğreticilere göz atın: [**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/
|
||||
@ -57,26 +57,26 @@ clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa**, potansiyel olarak zararlı **yetenekleri** yürütülebilir dosyalarda tespit eder: PE, ELF, .NET. Bu nedenle, Att\&ck taktikleri veya aşağıdaki gibi şüpheli yetenekler gibi şeyleri bulacaktır:
|
||||
**Capa** yürütülebilirlerde (PE, ELF, .NET) potansiyel olarak kötü amaçlı **capabilities** tespit eder. Bu nedenle Att\&ck tactics gibi öğeleri veya aşağıdaki gibi şüpheli **capabilities**'leri bulur:
|
||||
|
||||
- OutputDebugString hatasını kontrol et
|
||||
- hizmet olarak çalış
|
||||
- işlem oluştur
|
||||
- check for OutputDebugString error
|
||||
- run as a service
|
||||
- create process
|
||||
|
||||
Bunu [**Github repo**](https://github.com/mandiant/capa) üzerinden edinebilirsiniz.
|
||||
Edinin: [**Github repo**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC, Kompromi Göstergesi anlamına gelir. Bir IOC, bazı potansiyel olarak istenmeyen yazılımları veya onaylanmış **kötü amaçlı yazılımları** tanımlayan bir **koşullar setidir**. Mavi Takımlar, bu tür tanımları **sistemlerinde** ve **ağlarında** bu tür kötü amaçlı dosyaları **arama** amacıyla kullanır.\
|
||||
Bu tanımları paylaşmak çok faydalıdır çünkü bir bilgisayarda kötü amaçlı yazılım tespit edildiğinde ve o kötü amaçlı yazılım için bir IOC oluşturulduğunda, diğer Mavi Takımlar bunu kötü amaçlı yazılımı daha hızlı tanımlamak için kullanabilir.
|
||||
IOC, Indicator Of Compromise anlamına gelir. Bir IOC, potansiyel olarak istenmeyen bazı yazılımları veya teyit edilmiş **malware**'i tanımlayan bir dizi **conditions that identify**'dir. Blue Teams bu tür tanımları kendi **systems** ve **networks**'lerinde bu tür kötü amaçlı dosyaları **search for this kind of malicious files** için kullanır.\
|
||||
Bu tanımları paylaşmak çok faydalıdır; çünkü bir bilgisayarda malware tespit edildiğinde ve o malware için bir IOC oluşturulduğunda, diğer Blue Teams bunu malware'i daha hızlı tanımlamak için kullanabilir.
|
||||
|
||||
IOC'leri oluşturmak veya değiştirmek için bir araç [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Tanımlı IOCs'leri bir cihazda **arama** yapmak için [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gibi araçları kullanabilirsiniz.
|
||||
Bir IOC oluşturmak veya değiştirmek için bir araç [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Tanımlanmış IOC'leri bir cihazda aramak için [**Redline**](https://www.fireeye.com/services/freeware/redline.html) gibi araçları kullanabilirsiniz.
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki), Basit Kompromi Göstergeleri için bir tarayıcıdır.\
|
||||
Tespit, dört tespit yöntemine dayanmaktadır:
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) Simple Indicators of Compromise için bir tarayıcıdır.\
|
||||
Tespit dört algılama yöntemine dayanır:
|
||||
```
|
||||
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/) , paylaşımlı barındırma ortamlarında karşılaşılan tehditler etrafında tasarlanmış, GNU GPLv2 lisansı altında yayımlanan bir Linux kötü amaçlı yazılım tarayıcısıdır. Saldırılarda aktif olarak kullanılan kötü amaçlı yazılımları çıkarmak ve tespit için imzalar oluşturmak amacıyla ağ kenarı saldırı tespit sistemlerinden tehdit verilerini kullanır. Ayrıca, tehdit verileri LMD ödeme özelliği ile kullanıcı gönderimlerinden ve kötü amaçlı yazılım topluluğu kaynaklarından da elde edilmektedir.
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) Linux için GNU GPLv2 lisansı altında yayımlanmış bir malware tarayıcısıdır; paylaşılan hosting ortamlarında karşılaşılan tehditler göz önünde bulundurularak tasarlanmıştır. Ağ kenarı saldırı tespit sistemlerinden gelen tehdit verilerini kullanarak saldırılarda aktif olarak kullanılan malware'i çıkartır ve tespit için imzalar oluşturur. Ayrıca tehdit verileri, LMD checkout feature aracılığıyla yapılan kullanıcı gönderimleri ve malware topluluk kaynaklarından da elde edilir.
|
||||
|
||||
### rkhunter
|
||||
|
||||
[**rkhunter**](http://rkhunter.sourceforge.net) gibi araçlar, dosya sistemini olası **rootkit** ve kötü amaçlı yazılımlar için kontrol etmek amacıyla kullanılabilir.
|
||||
[**rkhunter**](http://rkhunter.sourceforge.net) gibi araçlar, dosya sistemini olası **rootkits** ve malware için kontrol etmek amacıyla kullanılabilir.
|
||||
```bash
|
||||
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
|
||||
```
|
||||
### FLOSS
|
||||
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) bir dizi teknik kullanarak yürütülebilir dosyalar içinde obfuscate edilmiş dizeleri bulmaya çalışan bir araçtır.
|
||||
[**FLOSS**](https://github.com/mandiant/flare-floss) farklı teknikler kullanarak executables içindeki **obfuscated strings**'i bulmaya çalışan bir araçtır.
|
||||
|
||||
### PEpper
|
||||
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper) yürütülebilir dosya içinde bazı temel şeyleri (ikili veriler, entropi, URL'ler ve IP'ler, bazı yara kuralları) kontrol eder.
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper) executable içinde bazı temel kontrolleri yapar (binary data, entropy, URLs and IPs, some yara rules).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[PEstudio](https://www.winitor.com/download) Windows yürütülebilir dosyaları hakkında bilgi almayı sağlayan bir araçtır; örneğin, ithalatlar, ihracatlar, başlıklar gibi bilgileri alır, ayrıca virüs toplamını kontrol eder ve potansiyel Att\&ck tekniklerini bulur.
|
||||
[PEstudio](https://www.winitor.com/download) imports, exports, headers gibi Windows executables hakkında bilgi edinmenizi sağlayan bir araçtır; ayrıca virus total'u kontrol eder ve potansiyel Att\&ck techniques'leri tespit eder.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **şifreli** olup olmadığını tespit etmek ve ayrıca **paketleyicileri** bulmak için kullanılan bir araçtır.
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **encrypted** olup olmadığını tespit etmeye ve ayrıca **packers**'ı bulmaya yarayan bir araçtır.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) metin/script dosyaları içinde **obfuscate** edilmiş ve **şifreli** içeriği tespit etmek için çeşitli **istatistiksel yöntemler** kullanan bir Python betiğidir. NeoPI'nin amacı, **gizli web shell kodunun** tespitine yardımcı olmaktır.
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI) metin/script dosyaları içindeki **obfuscated** ve **encrypted** içeriği tespit etmek için çeşitli **statistical methods** kullanan bir Python scriptidir. NeoPI'nin amacı **detection of hidden web shell code** konusunda yardımcı olmaktır.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscate** edilmiş/**şüpheli kod** ile birlikte, genellikle **malware**/webshell'lerde kullanılan **PHP** fonksiyonlarını içeren dosyaları tespit etmek için elinden gelenin en iyisini yapar.
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscated**/**dodgy code**'u tespit etmeye ve sıklıkla **malwares**/webshells'de kullanılan **PHP** functions'larını içeren dosyaları bulmaya çalışır.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
Bazı **malware örneklerini** kontrol ederken, imzayı her zaman **kontrol etmelisiniz** çünkü imzayı atan **geliştirici** zaten **malware** ile **ilişkili** olabilir.
|
||||
Bazı **malware sample**'larını incelerken binary'nin **check the signature**'ını her zaman yapmalısınız; çünkü imzalayan **developer** zaten **related** olarak **malware** ile bağlantılı olabilir.
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -139,27 +139,39 @@ spctl --assess --verbose /Applications/Safari.app
|
||||
```
|
||||
## Tespit Teknikleri
|
||||
|
||||
### Dosya Yığma
|
||||
### File Stacking
|
||||
|
||||
Eğer bir web sunucusunun **dosyalarını** içeren bir klasörün **son güncellenme tarihini** biliyorsanız, **web sunucusundaki tüm dosyaların oluşturulma ve değiştirilme tarihlerini kontrol edin** ve eğer herhangi bir tarih **şüpheli** ise, o dosyayı kontrol edin.
|
||||
Eğer bir klasörün içinde web sunucusunun **dosyalarının** **en son belirli bir tarihte güncellendiğini** biliyorsanız, web sunucusundaki tüm **dosyaların** **oluşturulma ve değiştirilme tarihlerini** **kontrol edin**; herhangi bir tarih **şüpheli** ise o dosyayı inceleyin.
|
||||
|
||||
### Temel Değerler
|
||||
### Baselines
|
||||
|
||||
Eğer bir klasörün dosyaları **değiştirilmemiş olmalıysa**, klasörün **orijinal dosyalarının** **hash'ini** hesaplayabilir ve bunları **mevcut** olanlarla **karşılaştırabilirsiniz**. Değiştirilen herhangi bir şey **şüpheli** olacaktır.
|
||||
Bir klasörün dosyaları **değiştirilmemiş olması gerektiğinde**, klasörün **orijinal dosyalarının** **hash**'ini hesaplayıp bunları **mevcut** olanlarla **karşılaştırabilirsiniz**. Değişmiş olan her şey **şüpheli** olacaktır.
|
||||
|
||||
### İstatistiksel Analiz
|
||||
### Statistical Analysis
|
||||
|
||||
Bilgiler günlüklerde saklandığında, her bir web sunucusu dosyasının ne kadar sıklıkla erişildiğini kontrol edebilirsiniz; çünkü bir web shell en çok erişilenlerden biri olabilir.
|
||||
Bilgi loglara kaydedildiğinde, **bir web sunucusunun her bir dosyasına kaç kez erişildiği gibi istatistikleri kontrol edebilirsiniz; bir web shell en çok erişilenlerden biri olabilir**.
|
||||
|
||||
---
|
||||
|
||||
## Dinamik Kontrol Akışını Deşifre Etme (JMP/CALL RAX Dağıtıcıları)
|
||||
### Android uygulama içi native telemetri (root yok)
|
||||
|
||||
Modern kötü amaçlı yazılım aileleri Kontrol Akış Grafiği (CFG) obfuscation'ı yoğun bir şekilde kötüye kullanmaktadır: doğrudan bir atlama/çağrı yerine, hedefi çalışma zamanında hesaplar ve `jmp rax` veya `call rax` komutunu yürütür. Küçük bir *dağıtıcı* (genellikle dokuz talimat) CPU `ZF`/`CF` bayraklarına bağlı olarak son hedefi belirler ve statik CFG geri kazanımını tamamen bozar.
|
||||
Android'de, hedef uygulama sürecinin içinde native kodu, diğer JNI kütüphaneleri başlatılmadan önce küçük bir logger kütüphanesini preload ederek enstrümante edebilirsiniz. Bu, sistem çapında hook'lara veya root'a ihtiyaç duymadan native davranış hakkında erken görünürlük sağlar. Popüler bir yaklaşım SoTap'tır: uygun ABI için libsotap.so dosyasını APK'ya koyup System.loadLibrary("sotap") çağrısını erken (ör. static initializer veya Application.onCreate) enjekte edin, ardından logları internal/external yollarından veya Logcat yedekleme yönteminden toplayın.
|
||||
|
||||
SLOW#TEMPEST yükleyicisi tarafından sergilenen bu teknik, yalnızca IDAPython ve Unicorn CPU emülatörüne dayanan üç adımlı bir iş akışı ile yenilebilir.
|
||||
Kurulum ayrıntıları ve log yolları için Android native reversing sayfasına bakın:
|
||||
|
||||
### 1. Her dolaylı atlama / çağrıyı bulun
|
||||
{{#ref}}
|
||||
../../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
|
||||
## Dinamik Kontrol Akışını Deobfuskasyon (JMP/CALL RAX Dispatchers)
|
||||
|
||||
Modern kötü amaçlı yazılım aileleri Control-Flow Graph (CFG) obfuskasyonunu yoğun biçimde kötüye kullanır: doğrudan bir jump/call yerine hedefi çalışma zamanında hesaplarlar ve `jmp rax` veya `call rax` yürütürler. Küçük bir *dispatcher* (genellikle dokuz talimat) CPU `ZF`/`CF` flag'lerine bağlı olarak nihai hedefi ayarlar ve statik CFG kurtarmayı tamamen bozar.
|
||||
|
||||
Teknik — SLOW#TEMPEST loader tarafından sergilenen — yalnızca IDAPython ve Unicorn CPU emulator'e dayanan üç adımlı bir iş akışıyla alt edilebilir.
|
||||
|
||||
### 1. Her dolaylı jump / call'ı bulun
|
||||
```python
|
||||
import idautils, idc
|
||||
|
||||
@ -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. Dispatcher byte-code'u çıkarın
|
||||
### 2. Dispatcher byte-code'unu çıkarın
|
||||
```python
|
||||
import idc
|
||||
|
||||
@ -183,7 +195,7 @@ size = jmp_ea + idc.get_item_size(jmp_ea) - start
|
||||
code = idc.get_bytes(start, size)
|
||||
open(f"{start:X}.bin", "wb").write(code)
|
||||
```
|
||||
### 3. Unicorn ile iki kez taklit et
|
||||
### 3. Unicorn ile onu iki kez emüle et
|
||||
```python
|
||||
from unicorn import *
|
||||
from unicorn.x86_const import *
|
||||
@ -201,7 +213,7 @@ return mu.reg_read(UC_X86_REG_RAX)
|
||||
```
|
||||
`run(code,0,0)` ve `run(code,1,1)` komutlarını çalıştırarak *false* ve *true* dal hedeflerini elde edin.
|
||||
|
||||
### 4. Doğrudan bir atlama / çağrıyı geri düzeltin
|
||||
### 4. Doğrudan jump / call'ı geri yamala
|
||||
```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))
|
||||
```
|
||||
Yamanlamadan sonra, IDA'yı fonksiyonu yeniden analiz etmeye zorlayarak tam CFG ve Hex-Rays çıktısının geri yüklenmesini sağlayın:
|
||||
patching işleminden sonra, IDA'nın fonksiyonu yeniden analiz etmesini zorlayın, böylece tam CFG ve Hex-Rays çıktısı geri yüklenir:
|
||||
```python
|
||||
import ida_auto, idaapi
|
||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||
```
|
||||
### 5. Dolaylı API çağrılarını etiketle
|
||||
### 5. Dolaylı API çağrılarını etiketleyin
|
||||
|
||||
Her `call rax`'ın gerçek hedefi bilindiğinde, IDA'ya bunun ne olduğunu söyleyebilir ve böylece parametre türleri ve değişken adları otomatik olarak geri kazanılır:
|
||||
Her `call rax`'ın gerçek hedefi bilindiğinde, IDA'ya bunun ne olduğunu söyleyebilir ve böylece parametre tipleri & değişken adları otomatik olarak kurtarılır:
|
||||
```python
|
||||
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||
```
|
||||
### Pratik faydalar
|
||||
|
||||
* Gerçek CFG'yi geri yükler → dekompilasyon *10* satırdan binlerce satıra çıkar.
|
||||
* String çapraz referansı ve xrefs'i etkinleştirir, davranış yeniden yapılandırmasını basit hale getirir.
|
||||
* Scriptler yeniden kullanılabilir: bunları aynı hileyle korunan herhangi bir yükleyiciye bırakın.
|
||||
* Gerçek CFG'yi geri yükler → decompilation *10* satırdan binlere çıkar.
|
||||
* string-cross-reference & xrefs'i etkinleştirir, davranışın yeniden yapılandırılmasını kolaylaştırır.
|
||||
* Scripts yeniden kullanılabilir: bunları aynı hileyle korunan herhangi bir loader'a yerleştirin.
|
||||
|
||||
---
|
||||
|
||||
## Referanslar
|
||||
|
||||
- [Unit42 – Evolving Tactics of SLOW#TEMPEST: A Deep Dive Into Advanced Malware Techniques](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
|
||||
- SoTap: Hafif uygulama içi JNI (.so) behavior logger – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,47 +1,50 @@
|
||||
# Yerel Kütüphaneleri Tersine Mühendislik
|
||||
# Yerel Kütüphanelerin Tersine Mühendisliği
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Daha fazla bilgi için kontrol edin:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Android uygulamaları, performans açısından kritik görevler için genellikle C veya C++ ile yazılmış yerel kütüphaneler kullanabilir. Kötü amaçlı yazılım yaratıcıları da bu kütüphaneleri kötüye kullanır çünkü ELF paylaşılan nesneleri, DEX/OAT bayt kodundan daha zor decompile edilir. Bu sayfa, Android `.so` dosyalarını tersine mühendislik yapmayı kolaylaştıran *pratik* iş akışlarına ve *son* araç geliştirmelerine (2023-2025) odaklanmaktadır.
|
||||
**Daha fazla bilgi için bakınız:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Android uygulamaları performans açısından kritik görevler için genellikle C veya C++ ile yazılmış native kütüphaneler kullanır. Kötü amaçlı yazılım yazarları da bu kütüphaneleri suistimal eder; çünkü ELF shared object'lerin decompile edilmesi DEX/OAT byte-code'a göre hâlâ daha zordur.
|
||||
Bu sayfa, Android `.so` dosyalarının tersine mühendisliğini kolaylaştıran *pratik* iş akışlarına ve *son* (2023-2025) araç iyileştirmelerine odaklanır.
|
||||
|
||||
---
|
||||
|
||||
### Yeni çekilmiş `libfoo.so` için Hızlı Triage İş Akışı
|
||||
### Yeni çıkarılmış `libfoo.so` için hızlı triyaj iş akışı
|
||||
|
||||
1. **Kütüphaneyi çıkarın**
|
||||
1. **Kütüphaneyi çıkar**
|
||||
```bash
|
||||
# Yüklenmiş bir uygulamadan
|
||||
# From an installed application
|
||||
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
||||
# Ya da APK'dan (zip)
|
||||
# Or from the APK (zip)
|
||||
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
|
||||
```
|
||||
2. **Mimari ve korumaları tanımlayın**
|
||||
2. **Mimari ve korumaları belirle**
|
||||
```bash
|
||||
file libfoo.so # arm64 veya arm32 / x86
|
||||
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, vb.
|
||||
file libfoo.so # arm64 or arm32 / x86
|
||||
readelf -h libfoo.so # OS ABI, PIE, NX, RELRO, etc.
|
||||
checksec --file libfoo.so # (peda/pwntools)
|
||||
```
|
||||
3. **Dışa aktarılan sembolleri ve JNI bağlamalarını listeleyin**
|
||||
3. **Dışa aktarılan sembolleri ve JNI bağlarını listele**
|
||||
```bash
|
||||
readelf -s libfoo.so | grep ' Java_' # dinamik bağlantılı JNI
|
||||
strings libfoo.so | grep -i "RegisterNatives" -n # statik kayıtlı JNI
|
||||
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
|
||||
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
|
||||
```
|
||||
4. **Bir decompiler yükleyin** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper veya Cutter/Rizin) ve otomatik analiz çalıştırın. Daha yeni Ghidra sürümleri, Android 14 NDK ile oluşturulmuş kütüphanelerin analizini büyük ölçüde iyileştiren PAC/BTI stub'larını ve MTE etiketlerini tanıyan bir AArch64 decompiler tanıttı.
|
||||
5. **Statik ve dinamik tersine mühendislik arasında karar verin:** soyulmuş, obfuscate edilmiş kod genellikle *enstrümantasyon* (Frida, ptrace/gdbserver, LLDB) gerektirir.
|
||||
4. **Bir decompiler'da yükle** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) ve otomatik analiz çalıştır.
|
||||
Yeni Ghidra sürümleri, Android 14 NDK ile derlenen kütüphanelerin analizini büyük ölçüde iyileştiren PAC/BTI stub'larını ve MTE tag'lerini tanıyan bir AArch64 decompiler getirdi.
|
||||
5. **Statik vs dinamik tersine mühendislik kararını ver:** stripped, obfuscated kod genellikle *instrumentation* (Frida, ptrace/gdbserver, LLDB) gerektirir.
|
||||
|
||||
---
|
||||
|
||||
### Dinamik Enstrümantasyon (Frida ≥ 16)
|
||||
### Dinamik Instrumentasyon (Frida ≥ 16)
|
||||
|
||||
Frida’nın 16 serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android'e özgü iyileştirme getirdi:
|
||||
Frida’nın 16 serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android-özel iyileştirme getirdi:
|
||||
|
||||
* `thumb-relocator` artık LLD’nin agresif hizalaması (`--icf=all`) tarafından üretilen *küçük ARM/Thumb fonksiyonlarını* *hook* yapabilir.
|
||||
* *ELF import slotlarını* listeleme ve yeniden bağlama Android'de çalışır, inline hook'lar reddedildiğinde modül başına `dlopen()`/`dlsym()` yamanmasına olanak tanır.
|
||||
* Java hook'lama, Android 14'te `--enable-optimizations` ile derlenmiş uygulamalar için kullanılan yeni **ART hızlı giriş noktası** için düzeltildi.
|
||||
* `thumb-relocator` artık LLD’nin agresif hizalaması (`--icf=all`) ile üretilen küçük ARM/Thumb fonksiyonlarını *hook*layabilir.
|
||||
* Android üzerinde *ELF import slots*'ların enumerate edilmesi ve rebind edilmesi çalışır; inline hook'lar reddedildiğinde modül bazlı `dlopen()`/`dlsym()` patchleme yapılmasına olanak sağlar.
|
||||
* Android 14'te `--enable-optimizations` ile derlenen uygulamalarda kullanılan yeni **ART quick-entrypoint** için Java hooking düzeltildi.
|
||||
|
||||
Örnek: `RegisterNatives` aracılığıyla kaydedilen tüm fonksiyonları listelemek ve çalışma zamanında adreslerini dökmek:
|
||||
Örnek: `RegisterNatives` aracılığıyla kayıtlı tüm fonksiyonları listeleme ve çalışma zamanında adreslerini dökme:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var Runtime = Java.use('java.lang.Runtime');
|
||||
@ -58,38 +61,76 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
|
||||
});
|
||||
});
|
||||
```
|
||||
Frida, frida-server 16.2 veya daha yenisini kullandığınız sürece, PAC/BTI destekli cihazlarda (Pixel 8/Android 14+) kutudan çıktığı gibi çalışacaktır – daha önceki sürümler, satır içi kancalar için padding bulmakta başarısız oldu. citeturn5search2turn5search0
|
||||
Frida, PAC/BTI-etkin cihazlarda (Pixel 8/Android 14+) frida-server 16.2 veya daha yeni sürümlerle kutudan çıktığı gibi çalışır — daha eski sürümler inline hooks için padding'i bulamıyordu.
|
||||
|
||||
### Process-local JNI telemetry via preloaded .so (SoTap)
|
||||
|
||||
Tam özellikli enstrümantasyon gereksiz veya engellenmişse, hedef süreç içine küçük bir logger preload ederek native düzeyde görünürlük elde edebilirsiniz. SoTap, aynı uygulama süreci içindeki diğer JNI (.so) kütüphanelerin çalışma zamanı davranışını loglayan hafif bir Android native (.so) kütüphanesidir (root gerekmez).
|
||||
|
||||
Key properties:
|
||||
- Erken başlatılır ve yükleyen süreç içinde JNI/native etkileşimlerini gözlemler.
|
||||
- Kayıtları birden fazla yazılabilir yol kullanarak saklar ve depolama kısıtlıysa Logcat'e zarif bir şekilde geri döner.
|
||||
- Source-customizable: neyin loglanacağını genişletmek/ayarlamak için sotap.c'yi düzenleyin ve ABI başına yeniden derleyin.
|
||||
|
||||
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
|
||||
```
|
||||
Notlar ve sorun giderme:
|
||||
- ABI uyumu zorunludur. Uyuşmazlık UnsatisfiedLinkError oluşturur ve logger yüklenmez.
|
||||
- Modern Android'de depolama kısıtları yaygındır; dosya yazmaları başarısız olursa, SoTap yine Logcat üzerinden emit edecektir.
|
||||
- Davranış/verbosity özelleştirilmek üzere tasarlanmıştır; sotap.c düzenledikten sonra kaynaktan yeniden derleyin.
|
||||
|
||||
Bu yaklaşım, process başından itibaren native çağrı akışlarını gözlemlemenin kritik olduğu ama root/system-wide hooks bulunmadığı durumlarda malware triage ve JNI debugging için kullanışlıdır.
|
||||
|
||||
---
|
||||
|
||||
### APK'lerde avlanmaya değer son güvenlik açıkları
|
||||
### APK'larda avlanmaya değer güncel vuln'lar
|
||||
|
||||
| Yıl | CVE | Etkilenen kütüphane | Notlar |
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|WebP görüntülerini çözen yerel koddan erişilebilen yığın tampon taşması. Birçok Android uygulaması, savunmasız sürümleri paketler. Bir APK içinde `libwebp.so` gördüğünüzde, sürümünü kontrol edin ve istismar veya yamanma girişiminde bulunun.| citeturn2search0|
|
||||
|2024|Birden Fazla|OpenSSL 3.x serisi|Birçok bellek güvenliği ve padding-oracle sorunu. Birçok Flutter & ReactNative paketi kendi `libcrypto.so` dosyalarını taşır.|
|
||||
|-----|-----|---------------------|--------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|WebP görüntülerini decode eden native koddan ulaşılabilen heap buffer overflow. Birçok Android uygulaması vulnerable sürümlerle bundle ediyor. Bir APK içinde `libwebp.so` gördüğünüzde versiyonunu kontrol edin ve exploit ya da patch denemesi yapın.| |
|
||||
|2024|Multiple|OpenSSL 3.x series|Birkaç memory-safety ve padding-oracle sorunu. Birçok Flutter & ReactNative bundle kendi `libcrypto.so`'larını beraberinde taşıyor.|
|
||||
|
||||
Bir APK içinde *üçüncü taraf* `.so` dosyaları gördüğünüzde, her zaman hash'lerini yukarı akış tavsiyeleriyle karşılaştırın. SCA (Yazılım Bileşimi Analizi) mobilde yaygın değildir, bu nedenle eski savunmasız yapılar yaygındır.
|
||||
Bir APK içinde üçüncü taraf `.so` dosyaları gördüğünüzde, hash'lerini upstream advisories ile mutlaka karşılaştırın. Mobilde SCA (Software Composition Analysis) nadirdir, bu yüzden güncel olmayan vulnerable build'ler yaygındır.
|
||||
|
||||
---
|
||||
|
||||
### Anti-Tersten Çevirme & Sertleştirme trendleri (Android 13-15)
|
||||
### Anti-Reversing & Hardening trendleri (Android 13-15)
|
||||
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14, desteklenen ARMv8.3+ silikon üzerinde sistem kütüphanelerinde PAC/BTI'yi etkinleştirir. Decompile araçları artık PAC ile ilgili sahte talimatları gösterir; dinamik analiz için Frida, PAC'ı kaldırdıktan *sonra* trampolin enjekte eder, ancak özel trampolinleriniz gerektiğinde `pacda`/`autibsp` çağırmalıdır.
|
||||
* **MTE & Scudo sertleştirilmiş ayırıcı:** bellek etiketleme isteğe bağlıdır ancak birçok Play-Integrity farkındalığına sahip uygulama `-fsanitize=memtag` ile derlenir; etiket hatalarını yakalamak için `setprop arm64.memtag.dump 1` ve `adb shell am start ...` kullanın.
|
||||
* **LLVM Obfuscator (opak predikatlar, kontrol akışı düzleştirme):** ticari paketleyiciler (örneğin, Bangcle, SecNeo) giderek *yerel* kodu korumakta, yalnızca Java değil; `.rodata` içinde sahte kontrol akışı ve şifreli dize blokları bekleyin.
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14, desteklenen ARMv8.3+ silikonlarda system libraries içinde PAC/BTI'yi etkinleştiriyor. Decompiler'lar artık PAC ile ilişkili pseudo-instruction'ları gösteriyor; dynamic analysis için Frida PAC'ı kaldırdıktan *sonra* trampolines inject ediyor, fakat custom trampolines gerektiğinde `pacda`/`autibsp` çağırmalı.
|
||||
* **MTE & Scudo hardened allocator:** memory-tagging opt-in ama birçok Play-Integrity farkında uygulama `-fsanitize=memtag` ile build ediliyor; tag fault'ları yakalamak için `setprop arm64.memtag.dump 1` ve ardından `adb shell am start ...` kullanın.
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** ticari packer'lar (ör. Bangcle, SecNeo) giderek yalnızca Java değil *native* kodu da koruyor; `.rodata` içinde sahte kontrol-akışı ve şifrelenmiş string blob'ları bekleyin.
|
||||
|
||||
---
|
||||
|
||||
### Kaynaklar
|
||||
|
||||
- **ARM Assembly Öğrenme:** [Azeria Labs – ARM Assembly Temelleri](https://azeria-labs.com/writing-arm-assembly-part-1/)
|
||||
- **JNI & NDK Dokümantasyonu:** [Oracle JNI Spesifikasyonu](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) · [Android JNI İpuçları](https://developer.android.com/training/articles/perf-jni) · [NDK Kılavuzları](https://developer.android.com/ndk/guides/)
|
||||
- **Yerel Kütüphaneleri Hata Ayıklama:** [JEB Decompiler Kullanarak Android Yerel Kütüphanelerini Hata Ayıklama](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)
|
||||
|
||||
### Referanslar
|
||||
|
||||
- Frida 16.x değişiklik günlüğü (Android hooking, tiny-function relocation) – [frida.re/news](https://frida.re/news/) citeturn5search0
|
||||
- `libwebp` taşma CVE-2023-4863 için NVD tavsiyesi – [nvd.nist.gov](https://nvd.nist.gov/vuln/detail/CVE-2023-4863) citeturn2search0
|
||||
- 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}}
|
||||
|
@ -1,73 +1,74 @@
|
||||
# Smali - Decompile/\[Modifying]/Compile
|
||||
# Smali - Decompile Etme/[Değiştirme]/Derleme
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Bazen, gizli bilgilere erişmek için uygulama kodunu değiştirmek ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). Bu durumda, apk'yı decompile etmek, kodu değiştirmek ve yeniden compile etmek ilginç olabilir.
|
||||
|
||||
**Opcode referansı:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
Bazen uygulama kodunu, sizin için gizli bilgilere erişmek amacıyla değiştirmek ilginç olabilir (ör. iyi obfuskalanmış parolalar veya flags). Bu nedenle, apk'yi decompile etmek, kodu değiştirmek ve tekrar derlemek ilginç olabilir.
|
||||
|
||||
**Opcodes referansı:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
|
||||
## Hızlı Yol
|
||||
|
||||
**Visual Studio Code** ve [APKLab](https://github.com/APKLab/APKLab) uzantısını kullanarak, herhangi bir komut çalıştırmadan uygulamayı **otomatik olarak decompile**, değiştirebilir, **recompile**, imzalayabilir ve kurabilirsiniz.
|
||||
**Visual Studio Code** ve [APKLab](https://github.com/APKLab/APKLab) eklentisini kullanarak, herhangi bir komut çalıştırmadan uygulamayı **otomatik olarak decompile** edebilir, değiştirebilir, **tekrar derleyebilir**, imzalayıp yükleyebilirsiniz.
|
||||
|
||||
Bu görevi oldukça kolaylaştıran başka bir **script** [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
Bu görevi çok kolaylaştıran bir diğer **script** ise [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
|
||||
## APK'yı Decompile Et
|
||||
## APK'yi Decompile Etme
|
||||
|
||||
APKTool kullanarak **smali koduna ve kaynaklarına** erişebilirsiniz:
|
||||
APKTool kullanarak **smali koduna ve kaynaklara** erişebilirsiniz:
|
||||
```bash
|
||||
apktool d APP.apk
|
||||
```
|
||||
Eğer **apktool** herhangi bir hata verirse, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin.
|
||||
Eğer **apktool** size herhangi bir hata veriyorsa, deneyin[ **en son sürümü yüklemeyi**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
**Bakmanız gereken bazı ilginç dosyalar**:
|
||||
Bazı **incelemeniz gereken ilginç dosyalar**:
|
||||
|
||||
- _res/values/strings.xml_ (ve res/values/* içindeki tüm xml'ler)
|
||||
- _AndroidManifest.xml_
|
||||
- _.sqlite_ veya _.db_ uzantısına sahip herhangi bir dosya
|
||||
- _.sqlite_ veya _.db_ uzantılı herhangi bir dosya
|
||||
|
||||
Eğer `apktool` uygulamayı **çözümlerken sorun yaşıyorsa**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) adresine bakın veya **`-r`** (Kaynakları çözümleme) argümanını kullanmayı deneyin. O zaman, sorun bir kaynakta değil de kaynak kodunda ise, bu sorunu yaşamayacaksınız (kaynakları da decompile etmeyeceksiniz).
|
||||
Eğer `apktool` uygulamayı decode etmede **sorun yaşıyorsa** [https://ibotpeaches.github.io/Apktool/documentation/#framework-files] adresine bakın veya **`-r`** argümanını kullanmayı deneyin (Do not decode resources). Böylece sorun bir kaynaktaysa ve kaynak kodda değilse, bu problemi yaşamazsınız (ayrıca kaynakları decompile etmeyeceksiniz).
|
||||
|
||||
## Smali kodunu değiştir
|
||||
## Smali kodunu değiştirin
|
||||
|
||||
**Talimatları** **değiştirebilir**, bazı değişkenlerin **değerlerini** değiştirebilir veya **yeni talimatlar** ekleyebilirsiniz. Smali kodunu [**VS Code**](https://code.visualstudio.com) kullanarak değiştiriyorum, ardından **smalise uzantısını** yükleyin ve editör size herhangi bir **talimatın yanlış olup olmadığını** söyleyecektir.\
|
||||
Talimatları **değiştirebilir**, bazı değişkenlerin **değerini** değiştirebilir veya yeni talimatlar **ekleyebilirsiniz**. Ben Smali kodunu [**VS Code**](https://code.visualstudio.com) ile değiştiriyorum, ardından **smalise extension**'ı kuruyorsunuz ve editör herhangi bir **talimatın yanlış** olup olmadığını söyleyecektir.\
|
||||
Bazı **örnekler** burada bulunabilir:
|
||||
|
||||
- [Smali değişiklik örnekleri](smali-changes.md)
|
||||
- [Google CTF 2018 - Oyun Oynayalım mı?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
- [Smali changes examples](smali-changes.md)
|
||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
Ya da [**aşağıda bazı Smali değişikliklerinin açıklandığını kontrol edebilirsiniz**](smali-changes.md#modifying-smali).
|
||||
Veya [**aşağıdaki bazı Smali değişikliklerini açıklamalı olarak inceleyebilirsiniz**](smali-changes.md#modifying-smali).
|
||||
|
||||
## APK'yı yeniden derle
|
||||
## APK'ı yeniden derleyin
|
||||
|
||||
Kodu değiştirdikten sonra kodu **yeniden derleyebilirsiniz**:
|
||||
Kodu değiştirdikten sonra kodu **yeniden derleyebilirsiniz** kullanarak:
|
||||
```bash
|
||||
apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
Yeni APK'yı _**dist**_ klasörünün **içinde** **derleyecektir**.
|
||||
Yeni APK'yi **derleyecektir** **_dist_** klasörünün **içinde**.
|
||||
|
||||
Eğer **apktool** bir **hata** verirse, [**en son sürümü**](https://ibotpeaches.github.io/Apktool/install/) yüklemeyi deneyin.
|
||||
Eğer **apktool** bir **hata** verirse, deneyin [ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
### **Yeni APK'yı İmzala**
|
||||
### **Yeni APK'yi İmzala**
|
||||
|
||||
Sonra, bir **anahtar** **oluşturmanız** gerekiyor (bir şifre ve rastgele doldurabileceğiniz bazı bilgiler istenecektir):
|
||||
Sonra, **bir anahtar oluşturmanız** gerekecek (parola ve rastgele doldurabileceğiniz bazı bilgiler sorulacak):
|
||||
```bash
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||
```
|
||||
Sonunda, yeni APK'yı **imzala**:
|
||||
Son olarak, yeni APK'yı **imzala**:
|
||||
```bash
|
||||
jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
||||
```
|
||||
### Yeni uygulamayı optimize et
|
||||
|
||||
**zipalign**, Android uygulama (APK) dosyalarına önemli optimizasyonlar sağlayan bir arşiv hizalama aracıdır. [More information here](https://developer.android.com/studio/command-line/zipalign).
|
||||
**zipalign** Android uygulama (APK) dosyalarına önemli optimizasyon sağlayan bir arşiv hizalama aracıdır. [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
|
||||
```
|
||||
### **Yeni APK'yı imzalayın (yine mi?)**
|
||||
### **Yeni APK'yı imzala (yeniden?)**
|
||||
|
||||
Eğer **apksigner** kullanmayı **tercih ediyorsanız** [**apksigner**](https://developer.android.com/studio/command-line/) yerine jarsigner, **apk'yı imzalamalısınız** zipalign ile **optimizasyonu uyguladıktan sonra**. ANCAK DİKKAT EDİN, Sadece **UYGULAMAYI BİR KEZ İMZALAMALISINIZ** jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipalign'dan sonra).
|
||||
Eğer jarsigner yerine [**apksigner**](https://developer.android.com/studio/command-line/) kullanmayı **tercih ediyorsanız**, zipaling ile yapılan **optimizasyondan sonra apk'yı imzalamalısınız**. ANCAK ŞUNU UNUTMAYIN: jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipaling'den sonra) **UYGULAMAYI SADECE BİR KEZ İMZALAMALISINIZ**.
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
@ -79,7 +80,7 @@ public static void printHelloWorld() {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
```
|
||||
Smali kodu şöyle olacaktır:
|
||||
Smali kodu şöyle olur:
|
||||
```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
|
||||
```
|
||||
Smali talimat seti [burada](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions) mevcuttur.
|
||||
Smali komut seti şu adreste mevcuttur [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
|
||||
### Hafif Değişiklikler
|
||||
|
||||
### Bir fonksiyon içindeki bir değişkenin başlangıç değerlerini değiştirin
|
||||
### Bir fonksiyon içindeki değişkenin başlangıç değerlerini değiştirin
|
||||
|
||||
Bazı değişkenler, _const_ opcode'u kullanılarak fonksiyonun başında tanımlanır, değerlerini değiştirebilir veya yenilerini tanımlayabilirsiniz:
|
||||
Bazı değişkenler fonksiyonun başında opcode _const_ kullanılarak tanımlanır; değerlerini değiştirebilir veya yeni değişkenler tanımlayabilirsiniz:
|
||||
```bash
|
||||
#Number
|
||||
const v9, 0xf4240
|
||||
@ -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>"
|
||||
```
|
||||
Öneriler:
|
||||
Recommendations:
|
||||
|
||||
- Eğer fonksiyon içinde tanımlı değişkenleri kullanacaksanız (tanımlı v0,v1,v2...) bu satırları _.local \<number>_ ile değişkenlerin tanımları (_const v0, 0x1_) arasında koyun.
|
||||
- Eğer bir fonksiyonun kodunun ortasına logging kodunu eklemek istiyorsanız:
|
||||
- Tanımlı değişkenlerin sayısına 2 ekleyin: Örnek: _.locals 10_'dan _.locals 12_'ye.
|
||||
- Yeni değişkenler, zaten tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalıdır, v0'dan başladığını unutmayın).
|
||||
- Logging fonksiyonunun kodunu değiştirin ve _v5_ ve _v1_ yerine _v10_ ve _v11_ kullanın.
|
||||
- Eğer fonksiyon içinde tanımlanmış değişkenleri kullanacaksanız (tanımlı v0,v1,v2...) bu satırları _.local <number>_ ile değişkenlerin tanımlarının (_const v0, 0x1_) arasına koyun
|
||||
- Eğer loglama kodunu bir fonksiyonun kodunun ortasına eklemek istiyorsanız:
|
||||
- Deklarasyonda belirtilen değişken sayısına 2 ekleyin: Ex: _.locals 10_ dan _.locals 12_ ye
|
||||
- Yeni değişkenler, önceden tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalı, bunun v0'dan başladığını unutmayın).
|
||||
- Loglama fonksiyonunun kodunu değiştirin ve _v5_ ve _v1_ yerine _v10_ ve _v11_ kullanın.
|
||||
|
||||
### Toasting
|
||||
### Toast Gösterme
|
||||
|
||||
Fonksiyonun başında _.locals_ sayısına 3 eklemeyi unutmayın.
|
||||
Fonksiyonun başındaki _.locals_ sayısına 3 eklemeyi unutmayın.
|
||||
|
||||
Bu kod, **bir fonksiyonun ortasına** eklenmek üzere hazırlanmıştır (**değişkenlerin** **sayısını** gerektiği gibi **değiştirin**). **this.o**'nun **değerini** alacak, **String**'e **dönüştürecek** ve ardından **değerini** kullanarak bir **toast** yapacaktır.
|
||||
Bu kod, bir fonksiyonun **orta kısmına** eklenmek üzere hazırlanmıştır (**gerekirse** **değişken** sayısını değiştirin). Bu, **this.o değerini** alacak, onu **String**'e **dönüştürecek** ve ardından değeriyle bir **toast** oluşturacaktır.
|
||||
```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
|
||||
```
|
||||
### Başlangıçta Bir Native Library Yükleme (System.loadLibrary)
|
||||
|
||||
Bazen bir native kütüphaneyi önceden yüklemeniz gerekir, böylece diğer JNI kütüphanelerinden önce başlatılır (ör. process-local telemetry/logging'i etkinleştirmek için). System.loadLibrary() çağrısını bir statik initializer içine veya Application.onCreate()'de erken bir aşamada enjekte edebilirsiniz. Statik sınıf başlatıcısı (<clinit>) için örnek 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
|
||||
```
|
||||
Alternatif olarak, kütüphanenin mümkün olduğunca erken yüklenmesini sağlamak için aynı iki talimatı uygulamanızın Application.onCreate() metodunun başına yerleştirin:
|
||||
```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
|
||||
```
|
||||
Notlar:
|
||||
- Kütüphanenin doğru ABI varyantının lib/<abi>/ altında (örn. arm64-v8a/armeabi-v7a) bulunduğundan emin olun, aksi halde UnsatisfiedLinkError oluşabilir.
|
||||
- Çok erken yükleme (class static initializer), native logger'ın sonraki JNI etkinliklerini gözlemleyebilmesini garanti eder.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- SoTap: Hafif uygulama içi JNI (.so) davranış kaydedicisi – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user