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
073c8b6b85
commit
e8960bee46
@ -1,4 +1,4 @@
|
||||
# Malware Analysis
|
||||
# Malware विश्लेषण
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
|
||||
|
||||
## Online Services
|
||||
## ऑनलाइन सेवाएँ
|
||||
|
||||
- [VirusTotal](https://www.virustotal.com/gui/home/upload)
|
||||
- [HybridAnalysis](https://www.hybrid-analysis.com)
|
||||
@ -14,18 +14,18 @@
|
||||
- [Intezer](https://analyze.intezer.com)
|
||||
- [Any.Run](https://any.run/)
|
||||
|
||||
## Offline Antivirus and Detection Tools
|
||||
## ऑफ़लाइन एंटीवायरस और डिटेक्शन टूल्स
|
||||
|
||||
### Yara
|
||||
|
||||
#### Install
|
||||
#### इंस्टॉल
|
||||
```bash
|
||||
sudo apt-get install -y yara
|
||||
```
|
||||
#### Prepare rules
|
||||
#### नियम तैयार करें
|
||||
|
||||
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._
|
||||
इस स्क्रिप्ट का उपयोग github से सभी yara malware rules को डाउनलोड और मर्ज करने के लिए करें: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
|
||||
Create the _**rules**_ directory and execute it. यह _**malware_rules.yar**_ नाम की एक फ़ाइल बनाएगा जिसमें malware के लिए सभी yara rules शामिल होंगे।
|
||||
```bash
|
||||
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
|
||||
mkdir rules
|
||||
@ -36,16 +36,16 @@ 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: मैलवेयर की जांच करें और नियम बनाएं
|
||||
#### YaraGen: malware के लिए जांच करें और नियम बनाएं
|
||||
|
||||
आप बाइनरी से यारा नियम उत्पन्न करने के लिए टूल [**YaraGen**](https://github.com/Neo23x0/yarGen) का उपयोग कर सकते हैं। इन ट्यूटोरियल्स को देखें: [**भाग 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**भाग 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**भाग 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) टूल का उपयोग करके किसी binary से 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/
|
||||
```
|
||||
### ClamAV
|
||||
|
||||
#### स्थापित करें
|
||||
#### इंस्टॉल
|
||||
```
|
||||
sudo apt-get install -y clamav
|
||||
```
|
||||
@ -57,26 +57,26 @@ clamscan folderpath #Scan the whole folder
|
||||
```
|
||||
### [Capa](https://github.com/mandiant/capa)
|
||||
|
||||
**Capa** संभावित हानिकारक **क्षमताओं** का पता लगाता है जो executables में होती हैं: PE, ELF, .NET। इसलिए यह ऐसे चीजें खोजेगा जैसे Att\&ck tactics, या संदिग्ध क्षमताएँ जैसे:
|
||||
**Capa** executables में संभावित malicious **capabilities** का पता लगाती है: PE, ELF, .NET. इसलिए यह Att\&ck tactics जैसी चीज़ें, या निम्नलिखित suspicious capabilities जैसी चीज़ें खोजेगी:
|
||||
|
||||
- OutputDebugString त्रुटि की जांच करें
|
||||
- सेवा के रूप में चलाएँ
|
||||
- प्रक्रिया बनाएँ
|
||||
- check for OutputDebugString error
|
||||
- run as a service
|
||||
- create process
|
||||
|
||||
इसे [**Github repo**](https://github.com/mandiant/capa) में प्राप्त करें।
|
||||
|
||||
### IOCs
|
||||
|
||||
IOC का अर्थ है Indicator Of Compromise। एक IOC कुछ संभावित अवांछित सॉफ़्टवेयर या पुष्टि किए गए **malware** की पहचान करने वाले **शर्तों का एक सेट** है। Blue Teams इस प्रकार की परिभाषा का उपयोग अपने **सिस्टम** और **नेटवर्क** में इस प्रकार की हानिकारक फ़ाइलों की **खोज** के लिए करते हैं।\
|
||||
इन परिभाषाओं को साझा करना बहुत उपयोगी है क्योंकि जब किसी कंप्यूटर में malware की पहचान की जाती है और उस malware के लिए एक IOC बनाया जाता है, तो अन्य Blue Teams इसका उपयोग malware की पहचान तेजी से करने के लिए कर सकते हैं।
|
||||
IOC का मतलब Indicator Of Compromise है। एक IOC उन शर्तों का सेट है जो किसी संभावित unwanted software या confirmed **malware** को पहचानती हैं। Blue Teams इस तरह की परिभाषा का उपयोग अपने **systems** और **networks** में इस तरह की malicious files को खोजने के लिए करते हैं।\
|
||||
इन परिभाषाओं को share करना बहुत उपयोगी है क्योंकि जब किसी कंप्यूटर में malware पहचाना जाता है और उस malware के लिए एक IOC बनाया जाता है, तो अन्य Blue Teams उसे तेजी से पहचानने के लिए इसका उपयोग कर सकती हैं।
|
||||
|
||||
IOCs बनाने या संशोधित करने के लिए एक उपकरण है [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
आप [**Redline**](https://www.fireeye.com/services/freeware/redline.html) जैसे उपकरणों का उपयोग करके **एक डिवाइस में परिभाषित IOCs की खोज** कर सकते हैं।
|
||||
IOC बनाने या संशोधित करने के लिए एक tool है [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\
|
||||
आप ऐसे tools उपयोग कर सकते हैं जैसे [**Redline**](https://www.fireeye.com/services/freeware/redline.html) जो किसी device में defined IOCs को खोजने के लिए हैं।
|
||||
|
||||
### Loki
|
||||
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) Simple Indicators of Compromise के लिए एक स्कैनर है।\
|
||||
पता लगाने की प्रक्रिया चार पहचान विधियों पर आधारित है:
|
||||
[**Loki**](https://github.com/Neo23x0/Loki) Simple Indicators of Compromise के लिए एक scanner है।\
|
||||
Detection निम्न चार detection methods पर आधारित है:
|
||||
```
|
||||
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 के लिए GNU GPLv2 लाइसेंस के तहत जारी किया गया है, जिसे साझा होस्टेड वातावरण में सामना की जाने वाली खतरों के चारों ओर डिज़ाइन किया गया है। यह नेटवर्क एज इंट्रूज़न डिटेक्शन सिस्टम से खतरे के डेटा का उपयोग करता है ताकि उन मैलवेयर को निकाला जा सके जो हमलों में सक्रिय रूप से उपयोग किए जा रहे हैं और पहचान के लिए सिग्नेचर उत्पन्न करता है। इसके अतिरिक्त, खतरे का डेटा LMD चेकआउट फीचर और मैलवेयर समुदाय संसाधनों के साथ उपयोगकर्ता सबमिशन से भी प्राप्त किया जाता है।
|
||||
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) एक Linux के लिए malware स्कैनर है जो GNU GPLv2 license के अंतर्गत जारी किया गया है, और इसे shared hosted environments में आने वाले threats के मद्देनज़र डिज़ाइन किया गया है। यह network edge intrusion detection systems से threat data का उपयोग करके उन malware को पहचानता और निकालता है जो सक्रिय रूप से हमलों में उपयोग हो रहे हैं और detection के लिए signatures बनाता है। इसके अलावा, threat data LMD checkout feature के जरिए user submissions और malware community resources से भी लिया जाता है।
|
||||
|
||||
### rkhunter
|
||||
|
||||
जैसे उपकरण [**rkhunter**](http://rkhunter.sourceforge.net) का उपयोग फ़ाइल सिस्टम की जांच करने के लिए किया जा सकता है कि क्या संभव **रूटकिट** और मैलवेयर हैं।
|
||||
Tools like [**rkhunter**](http://rkhunter.sourceforge.net) का उपयोग फ़ाइल सिस्टम की जाँच करने के लिए किया जा सकता है ताकि संभावित **rootkits** और 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) निष्पादन योग्य फ़ाइल के अंदर कुछ बुनियादी चीजों की जांच करता है (बाइनरी डेटा, एंट्रॉपी, URLs और IPs, कुछ यारा नियम)।
|
||||
[PEpper ](https://github.com/Th3Hurrican3/PEpper) executable के अंदर कुछ बुनियादी चीज़ें चेक करता है (binary data, entropy, URLs and IPs, कुछ 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) एक Python स्क्रिप्ट है जो text/script files के भीतर छिपे हुए **obfuscated** और **encrypted** कंटेंट का पता लगाने के लिए विभिन्न **statistical methods** का उपयोग करती है। NeoPI का उद्देश्य छिपे हुए web shell code के **detection** में मदद करना है।
|
||||
|
||||
### **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** functions का उपयोग करती हैं जो अक्सर **malwares**/webshells में इस्तेमाल होते हैं।
|
||||
|
||||
### Apple Binary Signatures
|
||||
|
||||
जब आप कुछ **मैलवेयर नमूना** की जांच कर रहे हों, तो आपको हमेशा बाइनरी के **हस्ताक्षर** की जांच करनी चाहिए क्योंकि **डेवलपर** जिसने इसे हस्ताक्षरित किया है, वह पहले से ही **मैलवेयर** से **संबंधित** हो सकता है।
|
||||
जब आप किसी **malware sample** की जांच कर रहे हों तो हमेशा binary के **signature** की जांच करनी चाहिए क्योंकि जिस **developer** ने उसे sign किया है वह पहले से ही **related** हो सकता है **malware** से।
|
||||
```bash
|
||||
#Get signer
|
||||
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
|
||||
@ -137,27 +137,39 @@ codesign --verify --verbose /Applications/Safari.app
|
||||
#Check if the signature is valid
|
||||
spctl --assess --verbose /Applications/Safari.app
|
||||
```
|
||||
## Detection Techniques
|
||||
## डिटेक्शन तकनीकें
|
||||
|
||||
### File Stacking
|
||||
|
||||
यदि आप जानते हैं कि किसी फ़ोल्डर में **फाइलें** एक वेब सर्वर की **अंतिम बार कुछ तारीख** को **अपडेट** की गई थीं। **जांचें** कि **वेब सर्वर में सभी फाइलों** की **तारीख** कब **बनाई और संशोधित** की गई थी और यदि कोई तारीख **संदिग्ध** है, तो उस फ़ाइल की जांच करें।
|
||||
यदि आप जानते हैं कि किसी फ़ोल्डर जिसमें **files** वाले web server को किसी विशेष तिथि पर **last updated on some date** किया गया था, तो उस स्थिति में आप वे सभी **files** की **date** जाँचें कि वे कब **created** और **modified** हुए थे; अगर कोई **date** **suspicious** दिखे तो उस file की जाँच करें।
|
||||
|
||||
### Baselines
|
||||
|
||||
यदि किसी फ़ोल्डर की फाइलें **संशोधित नहीं होनी चाहिए थीं**, तो आप फ़ोल्डर की **मूल फाइलों** का **हैश** निकाल सकते हैं और उन्हें **वर्तमान** फाइलों के साथ **तुलना** कर सकते हैं। जो भी संशोधित होगा वह **संदिग्ध** होगा।
|
||||
यदि किसी फ़ोल्डर के **files** को **shouldn't have been modified** होना चाहिए था, तो आप उस फ़ोल्डर के **original files** का **hash** निकालकर उन्हें **current** वाले से **compare** कर सकते हैं। जो भी संशोधित होगा वह **suspicious** होगा।
|
||||
|
||||
### Statistical Analysis
|
||||
|
||||
जब जानकारी लॉग में सहेजी जाती है, तो आप **सांख्यिकी की जांच कर सकते हैं जैसे कि एक वेब सर्वर की प्रत्येक फ़ाइल को कितनी बार एक्सेस किया गया, क्योंकि एक वेब शेल सबसे अधिक हो सकता है**।
|
||||
जब जानकारी logs में सेव होती है, आप ऐसे **statistics** चेक कर सकते हैं जैसे कि web server के प्रत्येक file को कितनी बार एक्सेस किया गया — क्योंकि web shell संभवतः सबसे अधिक एक्सेस किए गए में से एक हो सकता है।
|
||||
|
||||
---
|
||||
|
||||
## Deobfuscating Dynamic Control-Flow (JMP/CALL RAX Dispatchers)
|
||||
### Android in-app native telemetry (no root)
|
||||
|
||||
आधुनिक मैलवेयर परिवार नियंत्रण-प्रवाह ग्राफ (CFG) की छिपाने का भारी दुरुपयोग करते हैं: सीधे कूदने/कॉल करने के बजाय, वे रन-टाइम पर गंतव्य की गणना करते हैं और `jmp rax` या `call rax` का निष्पादन करते हैं। एक छोटा *डिस्पैचर* (आमतौर पर नौ निर्देश) CPU के `ZF`/`CF` फ्लैग के आधार पर अंतिम लक्ष्य निर्धारित करता है, जो स्थिर CFG पुनर्प्राप्ति को पूरी तरह से तोड़ देता है।
|
||||
On Android, आप target app process के अंदर native code में instrumentation कर सकते हैं एक छोटे logger library को प्रीलोड करके, इससे पहले कि अन्य JNI libs initialize हों। इससे system-wide hooks या root के बिना ही native व्यवहार की शुरुआती visibility मिलती है। एक लोकप्रिय तरीका SoTap है: सही ABI के लिए libsotap.so को APK में डालें और शुरुआती चरण में System.loadLibrary("sotap") कॉल inject करें (उदाहरण के लिए, static initializer या Application.onCreate), फिर logs को internal/external paths या Logcat fallback से इकट्ठा करें।
|
||||
|
||||
यह तकनीक - SLOW#TEMPEST लोडर द्वारा प्रदर्शित - एक तीन-चरणीय कार्यप्रवाह के साथ पराजित की जा सकती है जो केवल IDAPython और यूनिकॉर्न CPU इम्यूलेटर पर निर्भर करती है।
|
||||
See the Android native reversing page for setup details and log paths:
|
||||
|
||||
{{#ref}}
|
||||
../../../mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
|
||||
## डायनामिक Control-Flow का Deobfuscation (JMP/CALL RAX Dispatchers)
|
||||
|
||||
आधुनिक malware परिवार Control-Flow Graph (CFG) obfuscation का भारी दुरुपयोग करते हैं: सीधे jump/call की जगह वे destination को run-time पर compute करते हैं और `jmp rax` या `call rax` execute करते हैं। एक छोटा *dispatcher* (आम तौर पर नौ निर्देश) CPU के `ZF`/`CF` flags के आधार पर final target सेट करता है, जिससे static CFG recovery पूरी तरह टूट जाती है।
|
||||
|
||||
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
|
||||
@ -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. इसे यूनिकॉर्न के साथ दो बार अनुकरण करें
|
||||
### 3. Unicorn के साथ इसे दो बार Emulate करें
|
||||
```python
|
||||
from unicorn import *
|
||||
from unicorn.x86_const import *
|
||||
@ -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(code,0,0)` और `run(code,1,1)` चलाएँ ताकि *false* और *true* branch targets प्राप्त किए जा सकें।
|
||||
|
||||
### 4. एक प्रत्यक्ष कूद / कॉल को पैच करें
|
||||
### 4. direct jump / call को वापस patch करें
|
||||
```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 आउटपुट पुनर्स्थापित हो सके:
|
||||
पैच करने के बाद, पूरी CFG और Hex-Rays आउटपुट को बहाल करने के लिए IDA को function का पुनः विश्लेषण करने के लिए मजबूर करें:
|
||||
```python
|
||||
import ida_auto, idaapi
|
||||
idaapi.reanalyze_function(idc.get_func_attr(ea, idc.FUNCATTR_START))
|
||||
```
|
||||
### 5. अप्रत्यक्ष API कॉल को लेबल करें
|
||||
### 5. अप्रत्यक्ष API calls को लेबल करें
|
||||
|
||||
एक बार जब हर `call rax` का असली गंतव्य ज्ञात हो जाता है, तो आप IDA को बता सकते हैं कि यह क्या है ताकि पैरामीटर प्रकार और चर नाम स्वचालित रूप से पुनर्प्राप्त हो सकें:
|
||||
एक बार जब हर `call rax` का असली गंतव्य पता चल जाए, आप IDA को बता सकते हैं कि वह क्या है, ताकि parameter types & variable names अपने आप पुनर्प्राप्त हो जाएँ:
|
||||
```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 में डालें जो उसी trick से सुरक्षित हो।
|
||||
|
||||
---
|
||||
|
||||
## संदर्भ
|
||||
|
||||
- [Unit42 – SLOW#TEMPEST की विकसित होती रणनीतियाँ: उन्नत मैलवेयर तकनीकों में गहराई से गोताखोरी](https://unit42.paloaltonetworks.com/slow-tempest-malware-obfuscation/)
|
||||
- [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}}
|
||||
|
@ -1,47 +1,50 @@
|
||||
# Reversing Native Libraries
|
||||
# रिवर्सिंग नेटीव लाइब्रेरीज़
|
||||
|
||||
{{#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 बाइट-कोड की तुलना में डिकंपाइल करना अभी भी कठिन हैं। यह पृष्ठ *व्यावहारिक* कार्यप्रवाहों और *हाल के* उपकरण सुधारों (2023-2025) पर केंद्रित है जो Android `.so` फ़ाइलों को उलटने को आसान बनाते हैं।
|
||||
Android ऐप्स performance-critical कार्यों के लिए आम तौर पर C या C++ में लिखी गई native libraries का उपयोग कर सकते हैं। मैलवेयर रचयिता भी इन लाइब्रेरीज़ का दुरुपयोग करते हैं क्योंकि ELF shared objects अभी भी DEX/OAT byte-code की तुलना में decompile करने में कठिन होते हैं।
|
||||
यह पेज *प्रैक्टिकल* वर्कफ़्लोज़ और *हालिया* tooling सुधारों (2023-2025) पर केंद्रित है जो Android `.so` फ़ाइलों को रिवर्स करना आसान बनाते हैं।
|
||||
|
||||
---
|
||||
|
||||
### ताजा खींची गई `libfoo.so` के लिए त्वरित ट्रायज-कार्यप्रवाह
|
||||
### ताजा निकाली गई `libfoo.so` के लिए त्वरित ट्रायेज-वर्कफ़्लो
|
||||
|
||||
1. **लाइब्रेरी निकालें**
|
||||
```bash
|
||||
# एक स्थापित एप्लिकेशन से
|
||||
# From an installed application
|
||||
adb shell "run-as <pkg> cat lib/arm64-v8a/libfoo.so" > libfoo.so
|
||||
# या APK (ज़िप) से
|
||||
# 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. **exported symbols और JNI bindings सूचीबद्ध करें**
|
||||
```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 संस्करणों ने एक AArch64 डिकंपाइलर पेश किया है जो PAC/BTI स्टब और MTE टैग को पहचानता है, जो Android 14 NDK के साथ निर्मित लाइब्रेरी के विश्लेषण में काफी सुधार करता है।
|
||||
5. **स्थैतिक बनाम डायनामिक रिवर्सिंग पर निर्णय लें:** स्ट्रिप्ड, ऑबफस्केटेड कोड अक्सर *इंस्ट्रुमेंटेशन* (Frida, ptrace/gdbserver, LLDB) की आवश्यकता होती है।
|
||||
4. **Decompiler में लोड करें** (Ghidra ≥ 11.0, IDA Pro, Binary Ninja, Hopper or Cutter/Rizin) और auto-analysis चलाएँ।
|
||||
नयी Ghidra versions ने एक AArch64 decompiler पेश किया है जो PAC/BTI stubs और MTE tags को पहचानता है, जिससे Android 14 NDK से बनी libraries का analysis काफी बेहतर हुआ है।
|
||||
5. **static vs dynamic reversing पर निर्णय लें:** stripped, obfuscated code अक्सर *instrumentation* (Frida, ptrace/gdbserver, LLDB) की मांग करता है।
|
||||
|
||||
---
|
||||
|
||||
### डायनामिक इंस्ट्रुमेंटेशन (Frida ≥ 16)
|
||||
### डायनामिक इंस्ट्रूमेंटेशन (Frida ≥ 16)
|
||||
|
||||
Frida की 16-श्रृंखला ने कई Android-विशिष्ट सुधार लाए हैं जो तब मदद करते हैं जब लक्ष्य आधुनिक Clang/LLD ऑप्टिमाइजेशन का उपयोग करता है:
|
||||
Frida की 16-सीरीज़ ने कई Android-specific सुधार लाए हैं जो तब मदद करते हैं जब टार्गेट आधुनिक Clang/LLD optimisations का उपयोग करता है:
|
||||
|
||||
* `thumb-relocator` अब LLD के आक्रामक संरेखण (`--icf=all`) द्वारा उत्पन्न *छोटे ARM/Thumb फ़ंक्शंस* को *हुक* कर सकता है।
|
||||
* *ELF आयात स्लॉट* को सूचीबद्ध करना और फिर से बाइंड करना Android पर काम करता है, जब इनलाइन हुक अस्वीकृत होते हैं तो प्रति-मॉड्यूल `dlopen()`/`dlsym()` पैचिंग सक्षम करता है।
|
||||
* नए **ART त्वरित-एंट्रीपॉइंट** के लिए जावा हुकिंग को ठीक किया गया था जिसका उपयोग तब किया जाता है जब ऐप्स को Android 14 पर `--enable-optimizations` के साथ संकलित किया जाता है।
|
||||
* `thumb-relocator` अब LLD की aggressive alignment (`--icf=all`) द्वारा जनरेट की गई छोटे ARM/Thumb functions को *hook* कर सकता है।
|
||||
* Android पर *ELF import slots* को enumerate और rebind करना काम करता है, जिससे inline hooks reject होने पर per-module `dlopen()`/`dlsym()` patching सक्षम होता है।
|
||||
* जब ऐप्स Android 14 पर `--enable-optimizations` के साथ compiled होते हैं तब उपयोग किए जाने वाले नए **ART quick-entrypoint** के लिए Java hooking ठीक किया गया है।
|
||||
|
||||
उदाहरण: `RegisterNatives` के माध्यम से पंजीकृत सभी फ़ंक्शंस को सूचीबद्ध करना और रनटाइम पर उनके पते को डंप करना:
|
||||
उदाहरण: `RegisterNatives` के माध्यम से रजिस्टर किए गए सभी functions को सूचीबद्ध करना और runtime पर उनके addresses dump करना:
|
||||
```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 या बाद के संस्करण का उपयोग करते हैं - पहले के संस्करण इनलाइन हुक के लिए पैडिंग का पता लगाने में विफल रहे। citeturn5search2turn5search0
|
||||
Frida बिना अतिरिक्त कॉन्फ़िगरेशन के PAC/BTI-enabled devices (Pixel 8/Android 14+) पर तब तक काम करेगा जब तक आप frida-server 16.2 या बाद का उपयोग कर रहे हैं – पुराने संस्करण inline hooks के लिए padding locate करने में विफल थे।
|
||||
|
||||
### Process-local JNI telemetry via preloaded .so (SoTap)
|
||||
|
||||
जब full-featured instrumentation ओवरकिल हो या ब्लॉक हो, तब भी आप target process के भीतर एक छोटा logger प्री-लोड करके native-स्तरीय visibility हासिल कर सकते हैं। SoTap एक lightweight Android native (.so) library है जो उसी app process के भीतर अन्य JNI (.so) libraries के runtime व्यवहार को लॉग करता है (no root required)।
|
||||
|
||||
मुख्य विशेषताएँ:
|
||||
- प्रारंभ में इनिशियलाइज़ होता है और उस process के अंदर JNI/native interactions को observe करता है जो इसे लोड करता है।
|
||||
- कई writable paths का उपयोग करके लॉग्स को स्थायी रूप से सहेजता है और जब storage restricted हो तो सुव्यवस्थित तरीके से Logcat पर fallback कर जाता है।
|
||||
- Source-customizable: sotap.c को एडिट करके लॉग किए जाने वाले तत्वों को बढ़ाएँ/समायोजित करें और प्रत्येक ABI के लिए रीबिल्ड करें।
|
||||
|
||||
सेटअप (repack the APK):
|
||||
1) सही ABI build को APK में डालें ताकि loader libsotap.so को resolve कर सके:
|
||||
- lib/arm64-v8a/libsotap.so (arm64 के लिए)
|
||||
- lib/armeabi-v7a/libsotap.so (arm32 के लिए)
|
||||
2) सुनिश्चित करें कि SoTap अन्य JNI लाइब्स से पहले लोड हो। शुरुआती चरण में एक call inject करें (उदा., Application subclass के static initializer या onCreate) ताकि logger पहले initialize हो। Smali snippet उदाहरण:
|
||||
```smali
|
||||
const-string v0, "sotap"
|
||||
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
|
||||
```
|
||||
3) Rebuild/sign/install करें, ऐप चलाएँ, और फिर लॉग्स एकत्रित करें।
|
||||
|
||||
लॉग पाथ (क्रम में जाँचे जाते हैं):
|
||||
```
|
||||
/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
|
||||
```
|
||||
नोट्स और समस्या निवारण:
|
||||
- ABI alignment अनिवार्य है। mismatch होने पर UnsatisfiedLinkError उठेगा और logger लोड नहीं होगा।
|
||||
- Storage constraints आधुनिक Android पर सामान्य हैं; अगर फाइल लिखने में विफलता हो तो SoTap फिर भी Logcat के जरिए emit करेगा।
|
||||
- व्यवहार/verbosity को अनुकूलित करने के लिए उद्देश्यपूर्ण रखा गया है; sotap.c संपादित करने के बाद स्रोत से फिर से build करें।
|
||||
|
||||
यह तरीका malware triage और JNI debugging के लिए उपयोगी है जहाँ process start से native call flows का अवलोकन κρίतिक होता है लेकिन root/system-wide hooks उपलब्ध नहीं होते।
|
||||
|
||||
---
|
||||
|
||||
### APKs में शिकार करने के लिए हाल की कमजोरियाँ
|
||||
### Recent vulnerabilities worth hunting for in APKs
|
||||
|
||||
| वर्ष | CVE | प्रभावित पुस्तकालय | नोट्स |
|
||||
| Year | CVE | Affected library | Notes |
|
||||
|------|-----|------------------|-------|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|हीप बफर ओवरफ्लो जो उस नेटीव कोड से पहुंच योग्य है जो WebP छवियों को डिकोड करता है। कई Android ऐप्स कमजोर संस्करणों के साथ आते हैं। जब आप एक APK के अंदर `libwebp.so` देखते हैं, तो इसके संस्करण की जांच करें और शोषण या पैचिंग का प्रयास करें।| citeturn2search0|
|
||||
|2024|कई|OpenSSL 3.x श्रृंखला|कई मेमोरी-सुरक्षा और पैडिंग-ओरैकल मुद्दे। कई Flutter & ReactNative बंडल अपने स्वयं के `libcrypto.so` के साथ आते हैं।|
|
||||
|2023|CVE-2023-4863|`libwebp` ≤ 1.3.1|नेटिव कोड जो WebP इमेजेस को डिकोड करता है उसमें पहुँच योग्य heap buffer overflow। कई Android apps कमजोर संस्करण bundle करते हैं। जब आप किसी APK में `libwebp.so` देखें, तो उसकी version चेक करें और exploit या patch करने का प्रयास करें.| |
|
||||
|2024|Multiple|OpenSSL 3.x series|कई memory-safety और padding-oracle समस्याएँ। कई Flutter & ReactNative bundles अपना खुद का `libcrypto.so` ship करते हैं।|
|
||||
|
||||
जब आप एक APK के अंदर *तीसरे पक्ष* के `.so` फ़ाइलें देखते हैं, तो हमेशा उनके हैश को अपस्ट्रीम सलाहों के खिलाफ क्रॉस-चेक करें। SCA (सॉफ़्टवेयर कंपोज़िशन एनालिसिस) मोबाइल पर असामान्य है, इसलिए पुरानी कमजोर बिल्डें प्रचुर मात्रा में हैं।
|
||||
जब आप किसी APK के अंदर third-party `.so` फाइलें देखें, तो हमेशा उनका hash upstream advisories के साथ cross-check करें। SCA (Software Composition Analysis) mobile पर आम नहीं है, इसलिए outdated vulnerable builds प्रचुर मात्रा में मिलते हैं।
|
||||
|
||||
---
|
||||
|
||||
### एंटी-रिवर्सिंग और हार्डनिंग प्रवृत्तियाँ (Android 13-15)
|
||||
### Anti-Reversing & Hardening trends (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 system libraries में PAC/BTI सक्षम करता है जब ARMv8.3+ silicon समर्थित हो। Decompilers अब PAC‑संबंधित pseudo-instructions दिखाते हैं; dynamic analysis के लिए Frida PAC strip करने के बाद trampolines inject करता है, लेकिन आपके custom trampolines को जहाँ आवश्यक हो वहां `pacda`/`autibsp` कॉल करना चाहिए।
|
||||
* **MTE & Scudo hardened allocator:** memory-tagging opt-in है लेकिन कई Play-Integrity aware apps `-fsanitize=memtag` के साथ build होते हैं; tag faults कैप्चर करने के लिए `setprop arm64.memtag.dump 1` और फिर `adb shell am start ...` का उपयोग करें।
|
||||
* **LLVM Obfuscator (opaque predicates, control-flow flattening):** commercial packers (e.g., Bangcle, SecNeo) बढ़ती मात्रा में सिर्फ Java ही नहीं बल्कि *native* कोड की भी रक्षा करते हैं; `.rodata` में bogus control-flow और encrypted string blobs की उम्मीद रखें।
|
||||
|
||||
---
|
||||
|
||||
### संसाधन
|
||||
### Resources
|
||||
|
||||
- **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/)
|
||||
- **नेटीव पुस्तकालयों का डिबगिंग:** [JEB डिकंपाइलर का उपयोग करके Android नेटीव पुस्तकालयों का डिबगिंग](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)
|
||||
|
||||
### संदर्भ
|
||||
### References
|
||||
|
||||
- Frida 16.x परिवर्तन-लॉग (Android हुकिंग, छोटे-फंक्शन पुनर्स्थान) – [frida.re/news](https://frida.re/news/) citeturn5search0
|
||||
- `libwebp` ओवरफ्लो CVE-2023-4863 के लिए NVD सलाह – [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,85 +1,88 @@
|
||||
# Smali - Decompiling/\[Modifying]/Compiling
|
||||
# Smali - Decompiling/[Modifying]/Compiling
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
कभी-कभी एप्लिकेशन कोड को संशोधित करना दिलचस्प होता है ताकि आप छिपी हुई जानकारी तक पहुँच सकें (शायद अच्छी तरह से छिपे हुए पासवर्ड या झंडे)। फिर, यह दिलचस्प हो सकता है कि apk को डिकंपाइल करें, कोड को संशोधित करें और फिर से संकलित करें।
|
||||
|
||||
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
||||
कभी-कभी application code को modify करके आपके लिए hidden information तक पहुँच बनाना दिलचस्प होता है (शायद अच्छी तरह obfuscated passwords या flags)। ऐसे में apk को decompile करना, code में बदलाव करना और इसे recompile करना उपयोगी हो सकता है।
|
||||
|
||||
## Fast Way
|
||||
**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) एक्सटेंशन का उपयोग करके, आप बिना किसी कमांड को निष्पादित किए एप्लिकेशन को **स्वचालित रूप से डिकंपाइल**, संशोधित, **संकलित**, साइन और इंस्टॉल कर सकते हैं।
|
||||
## तेज़ तरीका
|
||||
|
||||
एक और **script** जो इस कार्य को बहुत आसान बनाता है वह है [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
Visual Studio Code और [APKLab](https://github.com/APKLab/APKLab) extension का उपयोग करके, आप बिना किसी कमांड को चलाए application को **automatically decompile**, modify, **recompile**, sign & install कर सकते हैं।
|
||||
|
||||
## Decompile the APK
|
||||
एक और **script** जो इस कार्य को बहुत आसान बनाती है वह है [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
||||
|
||||
## APK को Decompile करना
|
||||
|
||||
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/)
|
||||
|
||||
कुछ **दिलचस्प फ़ाइलें जिन पर आपको ध्यान देना चाहिए**:
|
||||
कुछ **दिलचस्प फ़ाइलें जिन्हें आपको देखना चाहिए**:
|
||||
|
||||
- _res/values/strings.xml_ (और सभी xmls जो res/values/\* के अंदर हैं)
|
||||
- _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` को **problems decoding the application** हैं, तो देखें [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) या तर्क **`-r`** का उपयोग करने की कोशिश करें (Resources को decode न करें)। फिर, यदि समस्या resource में थी और source code में नहीं, तो आपको यह समस्या नहीं होगी (आप resources को भी decompile नहीं करेंगे)।
|
||||
|
||||
## Smali कोड बदलें
|
||||
|
||||
आप **निर्देशों को बदल सकते हैं**, कुछ वेरिएबल्स के **मान** को बदल सकते हैं या **नए निर्देश जोड़ सकते हैं**। मैं Smali कोड को [**VS Code**](https://code.visualstudio.com) का उपयोग करके बदलता हूँ, आप फिर **smalise एक्सटेंशन** स्थापित करें और संपादक आपको बताएगा कि कोई **निर्देश गलत है**।\
|
||||
कुछ **उदाहरण** यहाँ मिल सकते हैं:
|
||||
आप **instructions** बदल सकते हैं, कुछ variables का **value** बदल सकते हैं या नए instructions **add** कर सकते हैं। मैं Smali code को [**VS Code**](https://code.visualstudio.com) का उपयोग करके बदलता/बदलती हूँ, उसके बाद आप **smalise extension** इंस्टॉल करें और editor बताएगा यदि कोई **instruction गलत** है.\
|
||||
कुछ **examples** यहाँ मिल सकते हैं:
|
||||
|
||||
- [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)।
|
||||
Or you can [**check below some Smali changes explained**](smali-changes.md#modifying-smali).
|
||||
|
||||
## APK को फिर से संकलित करें
|
||||
## 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** कोई **error** फेंकता है, तो [ installing the **latest version**](https://ibotpeaches.github.io/Apktool/install/) इंस्टॉल करने की कोशिश करें
|
||||
|
||||
### **नए APK पर हस्ताक्षर करें**
|
||||
|
||||
फिर, आपको एक **की** **जनरेट** करने की आवश्यकता है (आपसे एक पासवर्ड और कुछ जानकारी मांगी जाएगी जिसे आप यादृच्छिक रूप से भर सकते हैं):
|
||||
फिर, आपको **generate a key** बनानी होगी (आपसे password और कुछ जानकारी मांगी जाएगी जिसे आप यादृच्छिक रूप से भर सकते हैं):
|
||||
```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 एप्लिकेशन (APK) फ़ाइलों के लिए महत्वपूर्ण अनुकूलन प्रदान करता है। [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** का उपयोग करना **पसंद करते हैं** [**apksigner**](https://developer.android.com/studio/command-line/) के बजाय jarsigner, तो **आपको apk पर हस्ताक्षर करना चाहिए** **zipalign के साथ** ऑप्टिमाइजेशन लागू करने के बाद। लेकिन ध्यान दें कि आपको केवल **एक बार एप्लिकेशन पर हस्ताक्षर करना है** jarsigner के साथ (zipalign से पहले) या aspsigner के साथ (zipalign के बाद)।
|
||||
यदि आप jarsigner की बजाय [**apksigner**](https://developer.android.com/studio/command-line/) का उपयोग करना **पसंद** करते हैं, तो zipaling के साथ ऑप्टिमाइज़ेशन लागू करने के बाद आपको **APK पर साइन करना चाहिए**।
|
||||
|
||||
लेकिन ध्यान दें कि आपको केवल एक बार ही **एप्लिकेशन को साइन करना होगा**: jarsigner के साथ (zipalign से पहले) या aspsigner के साथ (zipaling के बाद)।
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
## Smali को संशोधित करना
|
||||
## Smali संशोधित करना
|
||||
|
||||
निम्नलिखित Hello World Java कोड के लिए:
|
||||
निम्नलिखित Hello World Java code के लिए:
|
||||
```java
|
||||
public static void printHelloWorld() {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
```
|
||||
Smali कोड होगा:
|
||||
Smali code होगा:
|
||||
```java
|
||||
.method public static printHelloWorld()V
|
||||
.registers 2
|
||||
@ -89,13 +92,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 instruction set उपलब्ध है [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
|
||||
### हल्के परिवर्तन
|
||||
### हल्के बदलाव
|
||||
|
||||
### एक फ़ंक्शन के अंदर एक चर के प्रारंभिक मानों को संशोधित करें
|
||||
### फ़ंक्शन के अंदर किसी वेरिएबल के प्रारंभिक मान बदलें
|
||||
|
||||
कुछ चर फ़ंक्शन की शुरुआत में _const_ ऑपकोड का उपयोग करके परिभाषित किए जाते हैं, आप इसके मानों को संशोधित कर सकते हैं, या आप नए मान परिभाषित कर सकते हैं:
|
||||
कुछ वेरिएबल फंक्शन की शुरुआत में opcode _const_ का उपयोग करके परिभाषित किए जाते हैं, आप इनके मान बदल सकते हैं, या नए वेरिएबल परिभाषित कर सकते हैं:
|
||||
```bash
|
||||
#Number
|
||||
const v9, 0xf4240
|
||||
@ -128,7 +131,7 @@ goto :goto_6 #Always go to: :goto_6
|
||||
```
|
||||
### बड़े परिवर्तन
|
||||
|
||||
### लॉगिंग
|
||||
### Logging
|
||||
```bash
|
||||
#Log win: <number>
|
||||
iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5
|
||||
@ -137,19 +140,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>"
|
||||
```
|
||||
सिफारिशें:
|
||||
Recommendations:
|
||||
|
||||
- यदि आप फ़ंक्शन के अंदर घोषित वेरिएबल्स (घोषित v0, v1, v2...) का उपयोग करने जा रहे हैं, तो इन पंक्तियों को _.local \<number>_ और वेरिएबल्स के घोषणाओं (_const v0, 0x1_) के बीच रखें।
|
||||
- यदि आप फ़ंक्शन के कोड के बीच में लॉगिंग कोड डालना चाहते हैं:
|
||||
- घोषित वेरिएबल्स की संख्या में 2 जोड़ें: उदाहरण: _.locals 10_ से _.locals 12_।
|
||||
- नए वेरिएबल्स पहले से घोषित वेरिएबल्स के अगले नंबर होने चाहिए (इस उदाहरण में _v10_ और _v11_ होने चाहिए, याद रखें कि यह v0 से शुरू होता है)।
|
||||
- लॉगिंग फ़ंक्शन के कोड को बदलें और _v10_ और _v11_ का उपयोग करें _v5_ और _v1_ के बजाय।
|
||||
- यदि आप फ़ंक्शन के अंदर घोषित वेरिएबल्स का उपयोग करने जा रहे हैं (घोषित v0,v1,v2...) तो ये पंक्तियाँ _.local <number>_ और वेरिएबल्स की घोषणाओं (_const v0, 0x1_) के बीच रखें
|
||||
- यदि आप लॉगिंग कोड को फ़ंक्शन के कोड के बीच में डालना चाहते हैं:
|
||||
- घोषित वेरिएबल्स की संख्या में 2 जोड़ें: उदाहरण: _.locals 10_ से _.locals 12_
|
||||
- नए वेरिएबल्स पहले से घोषित वेरिएबल्स के अगले नंबर होने चाहिए (इस उदाहरण में यह _v10_ और _v11_ होने चाहिए, याद रखें कि यह v0 से शुरू होता है)।
|
||||
- लॉगिंग फ़ंक्शन के कोड को बदलें और _v10_ और _v11_ का उपयोग _v5_ और _v1_ के स्थान पर करें।
|
||||
|
||||
### टोस्टिंग
|
||||
|
||||
याद रखें कि फ़ंक्शन की शुरुआत में _.locals_ की संख्या में 3 जोड़ें।
|
||||
|
||||
यह कोड **एक फ़ंक्शन के बीच में** डालने के लिए तैयार है (**ज़रूरत के अनुसार** **वेरिएबल्स** का **संख्या** बदलें)। यह **इस.o** का **मान** लेगा, **इसे** **String** में **परिवर्तित** करेगा और फिर इसके मान के साथ **एक टोस्ट** **बनाएगा**।
|
||||
यह कोड **एक फ़ंक्शन के बीच** में डालने के लिए तैयार किया गया है (**आवश्यकतानुसार** **वेरिएबल्स** की संख्या बदलें)। यह **this.o** का **value** लेगा, उसे **String** में **transform** करेगा और फिर उसके मान के साथ एक **toast** बनाएगा।
|
||||
```bash
|
||||
const/4 v10, 0x1
|
||||
const/4 v11, 0x1
|
||||
@ -161,4 +164,38 @@ invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/
|
||||
move-result-object v12
|
||||
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
||||
```
|
||||
### स्टार्टअप पर एक native लाइब्रेरी लोड करना (System.loadLibrary)
|
||||
|
||||
कभी-कभी आपको एक native लाइब्रेरी को preload करना पड़ता है ताकि यह अन्य JNI libs से पहले initialize हो जाए (उदा., process-local telemetry/logging सक्षम करने के लिए)। आप System.loadLibrary() कॉल को किसी static initializer में या Application.onCreate() की शुरुआत में inject कर सकते हैं। static class initializer (<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
|
||||
```
|
||||
वैकल्पिक रूप से, लाइब्रेरी को यथासंभव जल्दी लोड कराने के लिए अपने 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
|
||||
```
|
||||
नोट्स:
|
||||
- सुनिश्चित करें कि लाइब्रेरी का सही ABI संस्करण lib/<abi>/ के अंतर्गत मौजूद हो (उदा., arm64-v8a/armeabi-v7a) ताकि UnsatisfiedLinkError से बचा जा सके।
|
||||
- बहुत जल्दी लोड करने पर (class static initializer) यह सुनिश्चित होता है कि native logger बाद की JNI गतिविधियों का निरीक्षण कर सके।
|
||||
|
||||
## References
|
||||
|
||||
- SoTap: हल्का-फुल्का इन-ऐप JNI (.so) व्यवहार लॉगर – [github.com/RezaArbabBot/SoTap](https://github.com/RezaArbabBot/SoTap)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user