mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/basic-forensic-meth
This commit is contained in:
parent
83d83b0ddf
commit
0a94e00f8d
@ -1,4 +1,4 @@
|
||||
# Malware Analysis
|
||||
# Malware Analizi
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
- [Intezer](https://analyze.intezer.com)
|
||||
- [Any.Run](https://any.run/)
|
||||
|
||||
## Çevrimdışı Antivirus ve Tespit Araçları
|
||||
## Çevrimdışı Antivirüs ve Tespit Araçları
|
||||
|
||||
### Yara
|
||||
|
||||
@ -22,10 +22,10 @@
|
||||
```bash
|
||||
sudo apt-get install -y yara
|
||||
```
|
||||
#### Kuralları Hazırlayın
|
||||
#### Kuralları hazırla
|
||||
|
||||
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.
|
||||
Bu scripti, github'dan tüm yara malware kurallarını indirmek ve birleştirmek için kullanın: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
_**rules**_ dizinini oluşturun ve scripti çalıştırın. Bu, tüm yara malware 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: malware için kontrol etme ve kurallar oluşturma
|
||||
#### YaraGen: malware kontrolü ve kural oluşturma
|
||||
|
||||
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/)
|
||||
Bir binary'den 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** 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:
|
||||
**Capa**, yürütülebilir dosyalarda: PE, ELF, .NET, potansiyel olarak kötü amaçlı **capabilities** tespit eder. Böylece Att\&ck tactics gibi şeyleri veya şu tür şüpheli capabilities'leri bulur:
|
||||
|
||||
- check for OutputDebugString error
|
||||
- run as a service
|
||||
- create process
|
||||
- OutputDebugString hatası için kontrol etme
|
||||
- servis olarak çalıştırma
|
||||
- süreç oluşturma
|
||||
|
||||
Edinin: [**Github repo**](https://github.com/mandiant/capa).
|
||||
|
||||
### IOCs
|
||||
|
||||
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, Indicator Of Compromise anlamına gelir. Bir IOC, potansiyel olarak istenmeyen yazılımları veya teyit edilmiş **malware**'i tanımlayan bir dizi **koşuldur**. Blue Teams bu tür tanımları **bu tür kötü amaçlı dosyaları aramak** için kendi **sistemlerinde** ve **ağlarında** 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 kullanarak malware'i daha hızlı tespit edebilir.
|
||||
|
||||
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.
|
||||
IOC oluşturmak veya değiştirmek için bir araç [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
Tanımlı 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) Simple Indicators of Compromise için bir tarayıcıdır.\
|
||||
Tespit dört algılama yöntemine dayanır:
|
||||
Tespit dört farklı yönteme 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/) 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.
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) GNU GPLv2 lisansı altında yayımlanan ve paylaşılan hosting ortamlarında karşılaşılan tehditlere göre tasarlanmış bir Linux malware tarayıcısıdır. Saldırılarda aktif olarak kullanılan malware'leri çıkarmak ve tespit için imzalar üretmek amacıyla ağ kenarı saldırı tespit sistemlerinden gelen tehdit verilerini kullanır. Ayrıca tehdit verileri, LMD checkout özelliğiyle 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ı **rootkits** ve malware için kontrol etmek amacıyla kullanılabilir.
|
||||
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) farklı teknikler kullanarak executables içindeki **obfuscated strings**'i 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) executable içinde bazı temel kontrolleri yapar (binary data, entropy, URLs and IPs, some yara rules).
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper)executable içinde bazı temel şeyleri kontrol eder (binary data, entropy, URLs and IPs, some yara rules).
|
||||
|
||||
### PEstudio
|
||||
|
||||
[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.
|
||||
[PEstudio](https://www.winitor.com/download) Windows executables hakkında imports, exports, headers gibi bilgiler almayı sağlar; ayrıca virus total'u kontrol eder ve potansiyel Att\&ck tekniklerini bulur.
|
||||
|
||||
### Detect It Easy(DiE)
|
||||
|
||||
[**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.
|
||||
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) bir dosyanın **encrypted** olup olmadığını tespit etmek ve **packers**'ı bulmak için bir araçtır.
|
||||
|
||||
### NeoPI
|
||||
|
||||
[**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.
|
||||
[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)is bir Python scriptidir ve text/script dosyalar içindeki **obfuscated** ve **encrypted** content'i tespit etmek için çeşitli **statistical methods** kullanır. NeoPI'nin amaçlarından biri **detection of hidden web shell code**'a yardımcı olmaktır.
|
||||
|
||||
### **php-malware-finder**
|
||||
|
||||
[**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.
|
||||
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) **obfuscated**/**dodgy code**'ları ve sıklıkla **malwares**/webshells içinde kullanılan **PHP** fonksiyonlarını kullanan dosyaları tespit etmek için elinden geleni yapar.
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
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.
|
||||
Bazı **malware sample**'larını incelerken, binary'nin **check the signature**'ını her zaman kontrol etmelisiniz çünkü imzalayan **developer** zaten **related** with **malware** olabilir.
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -137,27 +137,27 @@ codesign --verify --verbose /Applications/Safari.app
|
||||
#Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
```
|
||||
## Tespit Teknikleri
|
||||
## Detection Techniques
|
||||
|
||||
### File Stacking
|
||||
|
||||
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.
|
||||
Eğer bir klasörün, bir web sunucusunun **files**ını içerdiğini ve **last updated on some date** olduğunu biliyorsanız. Web sunucusundaki tüm **files**ın oluşturulma ve değiştirilme **date**lerini **Check** edin; eğer herhangi bir tarih **suspicious** ise o dosyayı inceleyin.
|
||||
|
||||
### Baselines
|
||||
|
||||
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.
|
||||
Eğer bir klasörün **files**ı **shouldn't have been modified** ise, klasörün **original files**ının **hash**ini hesaplayıp bunları **current** olanlarla **compare** edebilirsiniz. Değişmiş olan herhangi bir şey **suspicious** olacaktır.
|
||||
|
||||
### Statistical Analysis
|
||||
|
||||
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**.
|
||||
Bilgiler loglarda saklandığında, bir web shell en çok erişilenlerden biri olabileceği için her bir web sunucusu dosyasının kaç kez erişildiği gibi istatistikleri **check** edebilirsiniz.
|
||||
|
||||
---
|
||||
|
||||
### Android uygulama içi native telemetri (root yok)
|
||||
### Android in-app native telemetry (no root)
|
||||
|
||||
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.
|
||||
Android'de, hedef uygulama sürecinin içindeki native kodu diğer JNI kütüphaneleri initialize olmadan önce küçük bir logger kütüphanesini preload ederek instrument edebilirsiniz. Bu, sistem çapında hook'lara veya root'a ihtiyaç duymadan native davranışa erken görünürlük sağlar. Popüler bir yaklaşım SoTap'tır: doğru ABI için libsotap.so'yu APK'ye koyun ve erken bir noktada System.loadLibrary("sotap") çağrısı enjekte edin (örn. static initializer veya Application.onCreate), ardından logları internal/external yollarından veya Logcat fallback'ten toplayın.
|
||||
|
||||
Kurulum ayrıntıları ve log yolları için Android native reversing sayfasına bakın:
|
||||
See the Android native reversing page for setup details and log paths:
|
||||
|
||||
{{#ref}}
|
||||
../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
|
||||
@ -165,13 +165,13 @@ Kurulum ayrıntıları ve log yolları için Android native reversing sayfasına
|
||||
|
||||
---
|
||||
|
||||
## Dinamik Kontrol Akışını Deobfuskasyon (JMP/CALL RAX Dispatchers)
|
||||
## Deobfuscating Dynamic Control-Flow (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.
|
||||
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.
|
||||
|
||||
Teknik — SLOW#TEMPEST loader tarafından sergilenen — yalnızca IDAPython ve Unicorn CPU emulator'e dayanan üç adımlı bir iş akışıyla alt edilebilir.
|
||||
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. Her dolaylı jump / call'ı bulun
|
||||
### 1. Locate every indirect jump / call
|
||||
```python
|
||||
import idautils, idc
|
||||
|
||||
@ -180,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'unu çıkarın
|
||||
### 2. dispatcher byte-code'u çıkarın
|
||||
```python
|
||||
import idc
|
||||
|
||||
@ -195,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 onu iki kez emüle et
|
||||
### 3. Unicorn ile bunu iki kez emüle et
|
||||
```python
|
||||
from unicorn import *
|
||||
from unicorn.x86_const import *
|
||||
@ -211,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)` ve `run(code,1,1)` komutlarını çalıştırarak *false* ve *true* dal hedeflerini elde edin.
|
||||
`run(code,0,0)` ve `run(code,1,1)` komutlarını çalıştırarak *false* ve *true* branch hedeflerini elde edin.
|
||||
|
||||
### 4. Doğrudan jump / call'ı geri yamala
|
||||
### 4. Doğrudan jump / call'ı geri patch'layın
|
||||
```python
|
||||
import struct, ida_bytes
|
||||
|
||||
@ -222,28 +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))
|
||||
```
|
||||
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:
|
||||
Patching yaptıktan sonra, IDA'yı fonksiyonu yeniden analiz etmeye 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ı etiketleyin
|
||||
|
||||
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:
|
||||
Her `call rax`'in gerçek hedefi belirlendiğinde IDA'ya bunun ne olduğunu söyleyebilirsiniz, böylece parametre tipleri & değişken adları otomatik olarak geri kazanılır:
|
||||
```python
|
||||
idc.set_callee_name(call_ea, resolved_addr, 0) # IDA 8.3+
|
||||
```
|
||||
### Pratik faydalar
|
||||
|
||||
* Gerçek CFG'yi geri yükler → decompilation *10* satırdan binlere çıkar.
|
||||
* Gerçek CFG'yi geri yükler → dekompilasyon *10* satırdan binlerce satıra çı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.
|
||||
* Scripts yeniden kullanılabilir: aynı yöntemi kullanan herhangi bir loader'a yerleştirilebilir.
|
||||
|
||||
---
|
||||
|
||||
## Referanslar
|
||||
## Kaynaklar
|
||||
|
||||
- [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)
|
||||
- SoTap: Hafif uygulama içi JNI (.so) davranış kaydedicisi – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -5,46 +5,46 @@
|
||||
|
||||
**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.
|
||||
Android uygulamaları performans-kritik görevler için genellikle C veya C++ ile yazılmış native kütüphaneler kullanabilir. Kötü amaçlı yazılım yazarları da bu kütüphaneleri kötüye kullanır çünkü ELF paylaşılan nesneleri hâlâ DEX/OAT byte-code'dan daha zor decompile edilir.
|
||||
Bu sayfa, Android `.so` dosyalarını tersine mühendislik yapmayı kolaylaştıran *pratik* iş akışlarına ve *son* tooling geliştirmelerine (2023-2025) odaklanır.
|
||||
|
||||
---
|
||||
|
||||
### Yeni çıkarılmış `libfoo.so` için hızlı triyaj iş akışı
|
||||
### Yeni çekilmiş `libfoo.so` için hızlı triyaj iş akışı
|
||||
|
||||
1. **Kütüphaneyi çıkar**
|
||||
1. **Kütüphaneyi çıkarın**
|
||||
```bash
|
||||
# From an installed application
|
||||
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
||||
# Or from the APK (zip)
|
||||
unzip -j target.apk "lib/*/libfoo.so" -d extracted_libs/
|
||||
```
|
||||
2. **Mimari ve korumaları belirle**
|
||||
2. **Mimari ve korumaları belirleyin**
|
||||
```bash
|
||||
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ğlarını listele**
|
||||
3. **Dışa aktarılan sembolleri ve JNI bağlarını listeleyin**
|
||||
```bash
|
||||
readelf -s libfoo.so | grep ' Java_' # dynamic-linked JNI
|
||||
strings libfoo.so | grep -i "RegisterNatives" -n # static-registered JNI
|
||||
```
|
||||
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.
|
||||
4. **Bir decompiler'a yükleyin** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) ve otomatik analizi çalıştırın.
|
||||
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 etiketlerini tanıyan bir AArch64 decompiler getirdi.
|
||||
5. **Statik vs dinamik reversing'e karar verin:** stripped, obfuscated kod genellikle *instrumentation* gerektirir (Frida, ptrace/gdbserver, LLDB).
|
||||
|
||||
---
|
||||
|
||||
### Dinamik Instrumentasyon (Frida ≥ 16)
|
||||
### Dynamic Instrumentation (Frida ≥ 16)
|
||||
|
||||
Frida’nın 16 serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android-özel iyileştirme getirdi:
|
||||
Frida’nın 16-serisi, hedef modern Clang/LLD optimizasyonları kullandığında yardımcı olan birkaç Android-özel geliştirme getirdi:
|
||||
|
||||
* `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.
|
||||
* `thumb-relocator` artık LLD’nin agresif hizalaması (`--icf=all`) tarafından üretilen küçük ARM/Thumb fonksiyonlarına *hook* atabilir.
|
||||
* Android'de *ELF import slots*'u listelemek ve yeniden bağlamak çalışıyor; inline hook'lar reddedildiğinde modül başına `dlopen()`/`dlsym()` patchlemeye izin veriyor.
|
||||
* Java hooking, uygulamalar Android 14'te `--enable-optimizations` ile derlendiğinde kullanılan yeni **ART quick-entrypoint** için düzeltildi.
|
||||
|
||||
Örnek: `RegisterNatives` aracılığıyla kayıtlı tüm fonksiyonları listeleme ve çalışma zamanında adreslerini dökme:
|
||||
Örnek: `RegisterNatives` aracılığıyla kaydedilen tüm fonksiyonların listelenmesi ve çalışma zamanında adreslerini dump etme:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var Runtime = Java.use('java.lang.Runtime');
|
||||
@ -61,16 +61,16 @@ console.log('[+] RegisterNatives on ' + clazz.getName() + ' -> ' + count + ' met
|
||||
});
|
||||
});
|
||||
```
|
||||
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.
|
||||
Frida will work out of the box on PAC/BTI-enabled devices (Pixel 8/Android 14+) as long as you use frida-server 16.2 or later – earlier versions failed to locate padding for inline hooks.
|
||||
|
||||
### 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).
|
||||
Tam özellikli instrumentation aşırı veya engellenmiş olduğunda, hedef süreç içinde küçük bir logger önceden yükleyerek hala 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ındaki davranışını loglayan hafif bir Android native (.so) kütüphanesidir (root gerektirmez).
|
||||
|
||||
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.
|
||||
- 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:
|
||||
@ -92,30 +92,30 @@ Log paths (checked in order):
|
||||
# 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.
|
||||
- ABI hizalaması zorunludur. Uyuşmazlık UnsatisfiedLinkError tetikler ve logger yüklenmez.
|
||||
- Depolama kısıtlamaları modern Android'te yaygındır; dosya yazmaları başarısız olursa, SoTap yine de Logcat üzerinden çıktı verir.
|
||||
- Davranış/ayrıntı seviyesi özelleştirilebilir amaçlıdı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.
|
||||
Bu yaklaşım, işlem başlangıcından itibaren native çağrı akışlarını gözlemlemenin kritik olduğu fakat root/sistem-geneli hook'larının mevcut olmadığı durumlarda malware triage ve JNI hata ayıklama için kullanışlıdır.
|
||||
|
||||
---
|
||||
|
||||
### APK'larda avlanmaya değer güncel vuln'lar
|
||||
### APK'larda aranması gereken güncel zafiyetler
|
||||
|
||||
| Yıl | CVE | Etkilenen kütüphane | Notlar |
|
||||
|-----|-----|---------------------|--------|
|
||||
|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.|
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|WebP görüntülerini decode eden native koddan erişilebilen heap buffer overflow. Birçok Android uygulaması zayıf sürümleri paketler. Bir APK içinde `libwebp.so` görürseniz, sürümünü kontrol edin ve exploit veya patch denemesi yapın.| |
|
||||
|2024|Multiple|OpenSSL 3.x series|Birçok bellek-güvenliği ve padding-oracle sorunu. Birçok Flutter & ReactNative paket kendi `libcrypto.so`'sunu içeriyor.|
|
||||
|
||||
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.
|
||||
APK içinde *third-party* `.so` dosyaları gördüğünüzde, hash'lerini kaynak (upstream) güvenlik duyurularıyla her zaman karşılaştırın. SCA (Software Composition Analysis) mobilde nadirdir, bu yüzden eski zayıf build'ler yaygındır.
|
||||
|
||||
---
|
||||
|
||||
### Anti-Reversing & Hardening trendleri (Android 13-15)
|
||||
### Anti-Reversing & Hardening eğilimleri (Android 13-15)
|
||||
|
||||
* **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.
|
||||
* **Pointer Authentication (PAC) & Branch Target Identification (BTI):** Android 14, desteklenen ARMv8.3+ silikonlarda sistem kütüphanelerinde PAC/BTI'yi etkinleştirir. Decompiler'lar şimdi PAC‐ile ilişkili sahte-talimatları gösterir; dinamik analiz için Frida PAC'i kaldırdıktan *sonra* trampolinler enjekte eder, ancak özel trampolinleriniz gerektiğinde `pacda`/`autibsp` çağırmalıdır.
|
||||
* **MTE & Scudo hardened allocator:** memory-tagging isteğe bağlıdır fakat birçok Play-Integrity farkında uygulama `-fsanitize=memtag` ile derlenir; tag hatalarını yakalamak için `setprop arm64.memtag.dump 1` ve `adb shell am start ...` kullanın.
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** ticari packer'lar (örn., Bangcle, SecNeo) giderek *native* kodu da koruyor, sadece Java'yı değil; `.rodata` içinde sahte control-flow ve şifrelenmiş string blob'ları bekleyin.
|
||||
|
||||
---
|
||||
|
||||
|
@ -3,55 +3,55 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
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.
|
||||
Bazen uygulama kodunu, sizin için gizli bilgilere erişmek amacıyla (örneğin iyi obfuskelenmiş parolalar veya flag'ler) değiştirmek ilginç olabilir. Bu durumda apk'yı decompile etmek, kodu değiştirmek ve yeniden derlemek faydalı olabilir.
|
||||
|
||||
**Opcodes referansı:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
**Opcodes reference:** [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) eklentisini kullanarak, herhangi bir komut çalıştırmadan uygulamayı **otomatik olarak decompile** edebilir, değiştirebilir, **tekrar derleyebilir**, imzalayıp yükleyebilirsiniz.
|
||||
**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, **yeniden derleyebilir**, imzalayıp yükleyebilirsiniz.
|
||||
|
||||
Bu görevi çok kolaylaştıran bir diğer **script** ise [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
Bu işi çok kolaylaştıran başka bir **script** ise [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
|
||||
## APK'yi Decompile Etme
|
||||
## APK'yı decompile etme
|
||||
|
||||
APKTool kullanarak **smali koduna ve kaynaklara** erişebilirsiniz:
|
||||
```bash
|
||||
apktool d APP.apk
|
||||
```
|
||||
Eğer **apktool** size herhangi bir hata veriyorsa, deneyin[ **en son sürümü yüklemeyi**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
If **apktool** gives you any error, deneyin[ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
Bazı **incelemeniz gereken ilginç dosyalar**:
|
||||
Some **interesting files you should look are**:
|
||||
|
||||
- _res/values/strings.xml_ (ve res/values/* içindeki tüm xml'ler)
|
||||
- _res/values/strings.xml_ (ve res/values/* içindeki tüm xml dosyaları)
|
||||
- _AndroidManifest.xml_
|
||||
- _.sqlite_ veya _.db_ uzantılı herhangi bir dosya
|
||||
- Any file with extension _.sqlite_ or _.db_
|
||||
|
||||
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).
|
||||
If `apktool` has **problems decoding the application** take a look to [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) or try using the argument **`-r`** (Kaynakları çözümleme). Then, if the problem was in a resource and not in the source code, you won't have the problem (you won't also decompile the resources).
|
||||
|
||||
## Smali kodunu değiştirin
|
||||
## Change smali code
|
||||
|
||||
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:
|
||||
Bazı komutları **değiştirebilir**, bazı değişkenlerin **değerini** değiştirebilir veya yeni komutlar **ekleyebilirsiniz**. Smali kodunu [**VS Code**](https://code.visualstudio.com) ile değiştiriyorum; ardından **smalise extension**'ı kurduğunuzda editör herhangi bir **talimatın yanlış** olup olmadığını söyleyecektir.\
|
||||
Some **examples** can be found here:
|
||||
|
||||
- [Smali changes examples](smali-changes.md)
|
||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
Veya [**aşağıdaki bazı Smali değişikliklerini açıklamalı olarak inceleyebilirsiniz**](smali-changes.md#modifying-smali).
|
||||
Or you can [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||
|
||||
## APK'ı yeniden derleyin
|
||||
## Recompile the APK
|
||||
|
||||
Kodu değiştirdikten sonra kodu **yeniden derleyebilirsiniz** kullanarak:
|
||||
Kodu değiştirdikten sonra şu komutla kodu **yeniden derleyebilirsiniz**:
|
||||
```bash
|
||||
apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
Yeni APK'yi **derleyecektir** **_dist_** klasörünün **içinde**.
|
||||
Yeni APK, _**dist**_ klasörünün **içinde** **derlenecektir**.
|
||||
|
||||
Eğer **apktool** bir **hata** verirse, deneyin [ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
Eğer **apktool** bir **hata** verirse, [**en son sürümü** yüklemeyi deneyin](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
### **Yeni APK'yi İmzala**
|
||||
|
||||
Sonra, **bir anahtar oluşturmanız** gerekecek (parola ve rastgele doldurabileceğiniz bazı bilgiler sorulacak):
|
||||
Sonra, bir **anahtar oluşturmanız** gerekiyor (parola ve rastgele doldurabileceğiniz bazı bilgiler istenecek):
|
||||
```bash
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||
```
|
||||
@ -61,14 +61,14 @@ jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
||||
```
|
||||
### Yeni uygulamayı optimize et
|
||||
|
||||
**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).
|
||||
**zipalign**, Android uygulama (APK) dosyalarına önemli optimizasyon sağlayan bir arşiv hizalama aracıdır. [Daha fazla bilgi burada](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ı imzala (yeniden?)**
|
||||
### **Yeni APK'yı imzala (tekrar mi?)**
|
||||
|
||||
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**.
|
||||
Eğer jarsigner yerine [**apksigner**](https://developer.android.com/studio/command-line/) kullanmayı **tercih ediyorsanız**, zipaling ile **yapılan optimizasyonu** uyguladıktan sonra **APK'yı imzalamalısınız**. ANCAK UNUTMAYIN Kİ **UYGULAMAYI SADECE BİR KEZ İMZALAMANIZ** YETERLİDİR jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipaling'den sonra).
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
@ -80,7 +80,7 @@ public static void printHelloWorld() {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
```
|
||||
Smali kodu şöyle olur:
|
||||
Smali kodu şöyle olacaktır:
|
||||
```java
|
||||
.method public static printHelloWorld()V
|
||||
.registers 2
|
||||
@ -90,11 +90,11 @@ invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
|
||||
return-void
|
||||
.end method
|
||||
```
|
||||
Smali komut seti şu adreste mevcuttur [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
The Smali instruction set şu adreste mevcuttur [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
|
||||
### Hafif Değişiklikler
|
||||
|
||||
### Bir fonksiyon içindeki değişkenin başlangıç değerlerini değiştirin
|
||||
### Bir fonksiyon içindeki bir değişkenin başlangıç değerlerini değiştirin
|
||||
|
||||
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
|
||||
@ -140,17 +140,17 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin
|
||||
```
|
||||
Recommendations:
|
||||
|
||||
- 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.
|
||||
- Eğer fonksiyon içinde bildirilen değişkenleri kullanacaksanız (bildirilen v0,v1,v2...) bu satırları _.local <number>_ ile değişkenlerin bildirimleri (_const v0, 0x1_) arasına koyun.
|
||||
- Eğer logging kodunu bir fonksiyonun gövdesinin ortasına koymak istiyorsanız:
|
||||
- Bildirilen değişken sayısına 2 ekleyin: Örn: _.locals 10_ to _.locals 12_
|
||||
- Yeni değişkenler, zaten bildirilen değişkenlerin sonraki numaraları olmalıdır (bu örnekte _v10_ ve _v11_ olmalıdır, bunun v0'dan başladığını unutmayın).
|
||||
- Logging fonksiyonunun kodunu değiştirin ve _v10_ ve _v11_ kullanın, _v5_ ve _v1_ yerine.
|
||||
|
||||
### Toast Gösterme
|
||||
### Toast gösterimi
|
||||
|
||||
Fonksiyonun başındaki _.locals_ sayısına 3 eklemeyi unutmayın.
|
||||
Fonksiyonun başında _.locals_ sayısına 3 eklemeyi unutmayın.
|
||||
|
||||
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.
|
||||
Bu kod, bir fonksiyonun **ortasına** yerleştirilecek şekilde hazırlanmıştır (**gerektiğinde** **değişken** sayısını **değiştirin**). Bu kod **this.o** değerini alacak, onu **String**'e dönüştürecek ve ardından değeriyle bir **toast** gösterecektir.
|
||||
```bash
|
||||
const/4 v10, 0x1
|
||||
const/4 v11, 0x1
|
||||
@ -162,9 +162,9 @@ 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)
|
||||
### Başlangıçta Yerel Bir Kütüphaneyi 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:
|
||||
Bazen, diğer JNI kütüphanelerinden önce başlatılması için bir yerel kütüphaneyi önceden yüklemeniz gerekir (ör. process-local telemetri/kayıt etkinleştirmek için). System.loadLibrary() çağrısını bir static initializer içinde veya Application.onCreate() içinde 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;
|
||||
@ -176,7 +176,7 @@ 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:
|
||||
Alternatif olarak, kütüphanenin mümkün olduğunca erken yüklenmesini sağlamak için aynı iki talimatı Application.onCreate()'in başına yerleştirin:
|
||||
```smali
|
||||
.method public onCreate()V
|
||||
.locals 1
|
||||
@ -189,11 +189,11 @@ 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.
|
||||
- Kütüphanenin doğru ABI varyantının lib/<abi>/ altında (örn. arm64-v8a/armeabi-v7a) bulunduğundan emin olun; UnsatisfiedLinkError hatasını önlemek için.
|
||||
- Çok erken yükleme (class static initializer), native logger'ın sonraki JNI aktivitelerini gözlemleyebilmesini garanti eder.
|
||||
|
||||
## Referanslar
|
||||
|
||||
- SoTap: Hafif uygulama içi JNI (.so) davranış kaydedicisi – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
- SoTap: Hafif uygulama içi JNI (.so) davranış günlükleyicisi – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user