42 KiB
नेटिव लाइब्रेरीज को रिवर्स इंजीनियर करना
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप साइबरसिक्योरिटी कंपनी में काम करते हैं? क्या आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे? या क्या आप PEASS के नवीनतम संस्करण तक पहुँचना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं? सब्सक्रिप्शन प्लान्स देखें!
- The PEASS Family की खोज करें, हमारा एक्सक्लूसिव NFTs का संग्रह
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- 💬 Discord समूह में शामिल हों या telegram समूह या Twitter पर मुझे फॉलो करें 🐦@carlospolopm.**
- अपनी हैकिंग ट्रिक्स साझा करें, hacktricks repo और hacktricks-cloud repo में PRs सबमिट करके.
जानकारी https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html से ली गई है (वहाँ समाधान मिल सकते हैं)
Android एप्लिकेशन में कंपाइल की गई, नेटिव लाइब्रेरीज हो सकती हैं। नेटिव लाइब्रेरीज वह कोड होते हैं जो डेवलपर ने लिखा है और फिर एक विशिष्ट कंप्यूटर आर्किटेक्चर के लिए कंपाइल किया है। अक्सर, इसका मतलब होता है C या C++ में लिखा गया कोड। डेवलपर द्वारा इसे करने के वैध, या वैध कारणों में गणितीय रूप से गहन या समय संवेदनशील ऑपरेशन शामिल हो सकते हैं, जैसे कि ग्राफिक्स लाइब्रेरीज। मैलवेयर डेवलपर्स नेटिव कोड की ओर बढ़ रहे हैं क्योंकि कंपाइल की गई बाइनरीज को रिवर्स इंजीनियर करना DEX बाइटकोड का विश्लेषण करने की तुलना में कम सामान्य कौशल सेट होता है। यह ज्यादातर इसलिए है क्योंकि DEX बाइटकोड को जावा में डीकंपाइल किया जा सकता है जबकि नेटिव, कंपाइल किए गए कोड का अक्सर असेंबली के रूप में विश्लेषण करना पड़ता है।
लक्ष्य
इस खंड का लक्ष्य आपको असेंबली (ASM) सिखाना या कंपाइल किए गए कोड को अधिक सामान्य रूप से रिवर्स इंजीनियर करना नहीं है, बल्कि अधिक सामान्य बाइनरी रिवर्स इंजीनियरिंग कौशल को कैसे लागू करें, विशेष रूप से Android के लिए। चूंकि इस वर्कशॉप का लक्ष्य आपको ASM आर्किटेक्चर्स सिखाना नहीं है, इसलिए सभी अभ्यासों में विश्लेषण के लिए लाइब्रेरी का एक ARM और एक x86 संस्करण शामिल होगा ताकि प्रत्येक व्यक्ति उस आर्किटेक्चर को चुन सके जिसमें वे अधिक सहज हैं।
ARM असेंबली सीखना
यदि आपके पास पहले से बाइनरी रिवर्स इंजीनियरिंग/ असेंबली का अनुभव नहीं है, तो यहाँ कुछ सुझावित संसाधन हैं। अधिकांश Android उपकरण ARM पर चलते हैं, लेकिन इस वर्कशॉप में सभी अभ्यासों में लाइब्रेरी का एक x86 संस्करण भी शामिल है।
ARM असेंबली सीखने और/या समीक्षा करने के लिए, मैं ARM Assembly Basics की सलाह देता हूँ, जो Azeria Labs से है।
Java Native Interface (JNI) का परिचय
Java Native Interface (JNI) डेवलपर्स को नेटिव कोड में लागू किए गए Java मेथड्स को घोषित करने की अनुमति देता है (आमतौर पर कंपाइल किए गए C/C++ में)। JNI इंटरफेस Android-विशिष्ट नहीं है, बल्कि विभिन्न प्लेटफॉर्म्स पर चलने वाले Java एप्लिकेशनों के लिए अधिक सामान्य रूप से उपलब्ध है।
Android Native Development Kit (NDK) JNI के ऊपर Android-विशिष्ट टूलसेट है। डॉक्स के अनुसार:
Android में, Native Development Kit (NDK) एक टूलसेट है जो डेवलपर्स को उनके Android एप्स के लिए C और C++ कोड लिखने की अनुमति देता है।
साथ में, JNI और NDK Android डेवलपर्स को उनके एप्प की कुछ कार्यक्षमता को नेटिव कोड में लागू करने की अनुमति देते हैं। Java (या Kotlin) कोड एक Java-घोषित नेटिव मेथड को कॉल करेगा जो कंपाइल की गई, नेटिव लाइब्रेरी में लागू होता है।
संदर्भ
Oracle JNI डॉक्स
- JNI विनिर्देश
- JNI फंक्शन्स ← मैं हमेशा इसे खुला रखता हूँ और Android नेटिव लाइब्रेरीज को रिवर्स करते समय इसका संदर्भ लेता हूँ
Android JNI & NDK संदर्भ
- Android JNI टिप्स ← "नेटिव लाइब्रेरीज" अनुभाग पढ़ने की अत्यधिक सलाह दी जाती है
- NDK के साथ शुरुआत करना ← यह डेवलपर्स के लिए नेटिव लाइब्रेरीज को विकसित करने के लिए मार्गदर्शन है और यह समझना कि चीजें कैसे बनाई जाती हैं, इसे रिवर्स करना आसान बनाता है।
विश्लेषण का लक्ष्य - Android नेटिव लाइब्रेरीज
इस खंड में, हम Android नेटिव लाइब्रेरीज में लागू एप्प कार्यक्षमता को रिवर्स इंजीनियर करने पर केंद्रित हैं। जब हम Android नेटिव लाइब्रेरीज कहते हैं, तो हमारा क्या मतलब है?
Android नेटिव लाइब्रेरीज APKs में .so
, शेयर्ड ऑब्जेक्ट लाइब्रेरीज के रूप में ELF फाइल फॉर्मेट में शामिल की जाती हैं। यदि आपने पहले Linux बाइनरीज का विश्लेषण किया है, तो यह वही फॉर्मेट है।
ये लाइब्रेरीज डिफ़ॉल्ट रूप से APK में फाइल पथ /lib/<cpu>/lib<name>.so
पर शामिल की जाती हैं। यह डिफ़ॉल्ट पथ है, लेकिन डेवलपर्स यदि चाहें तो नेटिव लाइब्रेरी को /assets/<custom_name>
में भी शामिल कर सकते हैं। अधिक बार, हम मैल
लाइब्रेरी लोड करना
एक Android ऐप द्वारा किसी नेटिव लाइब्रेरी में लागू कोड को कॉल और निष्पादित करने से पहले, एप्लिकेशन (Java कोड) को लाइब्रेरी को मेमोरी में लोड करना होता है। इसे करने के लिए दो अलग API कॉल्स हैं:
System.loadLibrary("calc")
Since you haven't provided any content to translate, I'm unable to proceed with a translation. Please provide the specific English text from the file mobile-pentesting/android-app-pentesting/reversing-native-libraries.md
that you would like translated into Hindi.
System.load("lib/armeabi/libcalc.so")
दोनों API कॉल्स के बीच का अंतर यह है कि loadLibrary
केवल लाइब्रेरी का छोटा नाम एक तर्क के रूप में लेता है (उदाहरण के लिए, libcalc.so = "calc" & libinit.so = "init") और सिस्टम सही ढंग से वास्तुकला का निर्धारण करेगा जिस पर यह वर्तमान में चल रहा है और इस प्रकार सही फाइल का उपयोग करेगा। दूसरी ओर, load
को लाइब्रेरी का पूरा पथ चाहिए। इसका मतलब है कि ऐप डेवलपर को वास्तुकला का निर्धारण करना होगा और इस प्रकार सही लाइब्रेरी फाइल को खुद लोड करना होगा।
जब इनमें से कोई भी दो (loadLibrary
या load
) APIs को जावा कोड द्वारा कॉल किया जाता है, तो तर्क के रूप में पास की गई नेटिव लाइब्रेरी अपनी JNI_OnLoad
को निष्पादित करती है यदि यह नेटिव लाइब्रेरी में लागू की गई थी।
दोहराने के लिए, किसी भी नेटिव मेथड्स को निष्पादित करने से पहले, नेटिव लाइब्रेरी को जावा कोड में System.loadLibrary
या System.load
को कॉल करके लोड किया जाना चाहिए। जब इनमें से कोई भी 2 APIs निष्पादित किया जाता है, तो नेटिव लाइब्रेरी में JNI_OnLoad
फंक्शन भी निष्पादित होता है।
जावा से नेटिव कोड कनेक्शन
नेटिव लाइब्रेरी से एक फंक्शन को निष्पादित करने के लिए, एक जावा-घोषित नेटिव मेथड होना चाहिए जिसे जावा कोड कॉल कर सकता है। जब यह जावा-घोषित नेटिव मेथड कॉल किया जाता है, तो नेटिव लाइब्रेरी (ELF/.so) से "जोड़ा" गया नेटिव फंक्शन निष्पादित होता है।
एक जावा-घोषित नेटिव मेथड नीचे दिए गए जावा कोड में दिखाई देता है। यह किसी अन्य जावा मेथड की तरह दिखाई देता है, सिवाय इसके कि इसमें नेटिव
कीवर्ड शामिल होता है और इसके कार्यान्वयन में कोई कोड नहीं होता है, क्योंकि इसका कोड वास्तव में संकलित, नेटिव लाइब्रेरी में होता है।
public native String doThingsInNativeLibrary(int var0);
इस नेटिव मेथड को कॉल करने के लिए, जावा कोड इसे किसी अन्य जावा मेथड की तरह कॉल करेगा। हालांकि, बैकएंड में, JNI और NDK के बजाय नेटिव लाइब्रेरी में संबंधित फंक्शन को एक्जीक्यूट करेगा। इसके लिए, उसे जावा-घोषित नेटिव मेथड और नेटिव लाइब्रेरी में फंक्शन के बीच की जोड़ी को जानना आवश्यक है।
इस जोड़ी को बनाने के लिए, या लिंक करने के लिए, 2 अलग-अलग तरीके हैं:
- JNI नेटिव मेथड नाम रिज़ॉल्विंग का उपयोग करके डायनामिक लिंकिंग, या
RegisterNatives
API कॉल का उपयोग करके स्टेटिक लिंकिंग
डायनामिक लिंकिंग
जावा घोषित नेटिव मेथड और नेटिव लाइब्रेरी में फंक्शन को डायनामिक रूप से लिंक करने के लिए, डेवलपर मेथड और फंक्शन का नाम ऐसे रखता है जैसे कि स्पेक्स के अनुसार JNI सिस्टम डायनामिक रूप से लिंकिंग कर सके।
स्पेक के अनुसार, डेवलपर निम्नलिखित घटकों से जोड़कर फंक्शन का नाम इस प्रकार रखेगा ताकि सिस्टम नेटिव मेथड और फंक्शन को डायनामिक रूप से लिंक कर सके:
- प्रीफिक्स Java_
- एक मैंगल्ड पूर्ण-योग्यता वाला क्लास नाम
- एक अंडरस्कोर (“_”) सेपरेटर
- एक मैंगल्ड मेथड नाम
- ओवरलोडेड नेटिव मेथड्स के लिए, दो अंडरस्कोर (“__”) के बाद मैंगल्ड आर्ग्युमेंट सिग्नेचर
जावा-घोषित नेटिव मेथड के लिए डायनामिक लिंकिंग करने के लिए और मान लीजिए यह क्लास com.android.interesting.Stuff
में है
public native String doThingsInNativeLibrary(int var0);
नेटिव लाइब्रेरी में फंक्शन का नाम होना चाहिए:
Java_com_android_interesting_Stuff_doThingsInNativeLibrary
स्टैटिक लिंकिंग
यदि डेवलपर नेटिव फंक्शन्स को स्पेक के अनुसार नाम नहीं देना चाहते या नहीं दे सकते (उदाहरण के लिए, डिबग सिंबल्स को हटाना चाहते हैं), तो उन्हें जावा-घोषित नेटिव मेथड और नेटिव लाइब्रेरी में फंक्शन के बीच जोड़ी बनाने के लिए RegisterNatives
(दस्तावेज़) API के साथ स्टैटिक लिंकिंग का उपयोग करना चाहिए। RegisterNatives
फंक्शन को नेटिव कोड से कॉल किया जाता है, जावा कोड से नहीं और यह अक्सर JNI_OnLoad
फंक्शन में कॉल किया जाता है क्योंकि RegisterNatives
को जावा-घोषित नेटिव मेथड को कॉल करने से पहले निष्पादित किया जाना चाहिए।
jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
typedef struct {
char *name;
char *signature;
void *fnPtr;
} JNINativeMethod;
रिवर्स इंजीनियरिंग करते समय, यदि एप्लिकेशन स्टेटिक लिंकिंग विधि का उपयोग कर रहा है, तो हम विश्लेषकों को JNINativeMethod
संरचना मिल सकती है जो RegisterNatives
को पास की जा रही है ताकि यह निर्धारित किया जा सके कि जब जावा-घोषित नेटिव विधि को कॉल किया जाता है तो नेटिव लाइब्रेरी में कौन सी सबरूटीन निष्पादित होती है।
JNINativeMethod
संरचना को जावा-घोषित नेटिव विधि के नाम की एक स्ट्रिंग और विधि के हस्ताक्षर की एक स्ट्रिंग की आवश्यकता होती है, इसलिए हमें अपनी नेटिव लाइब्रेरी में ये मिलनी चाहिए।
विधि हस्ताक्षर
JNINativeMethod
संरचना को विधि हस्ताक्षर की आवश्यकता होती है। एक विधि हस्ताक्षर यह बताता है कि विधि किस प्रकार के तर्कों को लेती है और यह क्या लौटाती है। इस लिंक में "टाइप हस्ताक्षर" अनुभाग में JNI टाइप हस्ताक्षर का दस्तावेज़ीकरण है।
- Z: boolean
- B: byte
- C: char
- S: short
- I: int
- J: long
- F: float
- D: double
- L पूर्ण-योग्य-क्लास ; :पूर्ण-योग्य-क्लास
- [ प्रकार: प्रकार[]
- ( तर्क-प्रकार ) रिटर्न-प्रकार: विधि प्रकार
- V: void
नेटिव विधि के लिए
public native String doThingsInNativeLibrary(int var0);
प्रकार हस्ताक्षर है
(I)Ljava/lang/String;
यहाँ एक नेटिव मेथड और उसके सिग्नेचर का एक और उदाहरण है। निम्नलिखित मेथड डिक्लेरेशन है
public native long f (int n, String s, int[] arr);
इसका प्रकार हस्ताक्षर है:
(ILjava/lang/String;[I)J
अभ्यास #5 - नेटिव फंक्शन के एड्रेस का पता लगाएं
अभ्यास #5 में हम नेटिव लाइब्रेरीज को डिसासेम्बलर में लोड करना और जब नेटिव मेथड को कॉल किया जाता है तो उसे निष्पादित करने वाले नेटिव फंक्शन की पहचान करना सीखेंगे। इस विशेष अभ्यास का उद्देश्य नेटिव मेथड को रिवर्स इंजीनियर करना नहीं है, बस जावा में नेटिव मेथड के कॉल और नेटिव लाइब्रेरी में निष्पादित होने वाले फंक्शन के बीच की कड़ी का पता लगाना है। इस अभ्यास के लिए, हम Mediacode.apk नमूने का उपयोग करेंगे। यह नमूना VM में ~/samples/Mediacode.apk
पर उपलब्ध है। इसका SHA256 हैश a496b36cda66aaf24340941da8034bd53940d1b08d83a97f17a65ae144ebf91a है।
लक्ष्य
इस अभ्यास का लक्ष्य है:
- DEX बाइटकोड में घोषित नेटिव मेथड्स की पहचान करना
- यह निर्धारित करना कि कौन सी नेटिव लाइब्रेरीज लोड की जाती हैं (और इस प्रकार नेटिव मेथड्स कहाँ लागू किए जा सकते हैं)
- APK से नेटिव लाइब्रेरी निकालना
- डिसासेम्बलर में नेटिव लाइब्रेरी लोड करना
- नेटिव लाइब्रेरी में उस फंक्शन के एड्रेस (या नाम) की पहचान करना जो नेटिव मेथड को कॉल करने पर निष्पादित होता है
निर्देश
- Mediacode.apk को jadx में खोलें। अभ्यास #1 को फिर से देखें।
- इस बार, यदि आप Resources टैब को विस्तारित करते हैं, तो आप देखेंगे कि इस APK में
lib/
डायरेक्टरी है। इस APK की नेटिव लाइब्रेरीज डिफ़ॉल्ट CPU पथों में हैं। - अब हमें किसी भी घोषित नेटिव मेथड्स की पहचान करनी होगी। jadx में खोज करें और सभी घोषित नेटिव मेथड्स की सूची बनाएं। दो होने चाहिए।
- घोषित नेटिव मेथड के आसपास, देखें कि कहीं नेटिव लाइब्रेरी लोड की जा रही है या नहीं। यह जानकारी देगी कि किस नेटिव लाइब्रेरी में फंक्शन को लागू करने के लिए देखना है।
- APK से नेटिव लाइब्रेरी निकालने के लिए एक नया डायरेक्टरी बनाएं और APK को उस फोल्डर में कॉपी करें। फिर
unzip Mediacode.APK
कमांड चलाएं। आप APK से निकाली गई सभी फाइलें देखेंगे, जिसमेंlib/
डायरेक्टरी शामिल है। - नेटिव लाइब्रेरी की आर्किटेक्चर का चयन करें जिसे आप विश्लेषण करना चाहते हैं।
ghidraRun
चलाकर ghidra शुरू करें। यह Ghidra खोलेगा।- नेटिव लाइब्रेरी को विश्लेषण के लिए खोलने के लिए, "New Project", "Non-Shared Project" चुनें, प्रोजेक्ट को सेव करने के लिए एक पथ चुनें और उसे एक नाम दें। यह एक प्रोजेक्ट बनाता है जिसमें आप बाइनरी फाइलें लोड कर सकते हैं।
- आपके प्रोजेक्ट बनाने के बाद, कोड ब्राउज़र खोलने के लिए ड्रैगन आइकन का चयन करें। फिर "File" > "Import File" पर जाएं ताकि टूल में नेटिव लाइब्रेरी लोड कर सकें। आप सभी डिफ़ॉल्ट्स को वैसे ही छोड़ सकते हैं।
- आपको निम्नलिखित स्क्रीन दिखाई देगी। "Analyze" का चयन करें।
- ऊपर दी गई लिंकिंग जानकारी का उपयोग करके, नेटिव लाइब्रेरी में उस फंक्शन की पहचान करें जो जावा-घोषित नेटिव मेथड को कॉल करने पर निष्पादित होता है।
समाधान
एंड्रॉइड नेटिव लाइब्रेरीज कोड को रिवर्स करना - JNIEnv
एंड्रॉइड नेटिव लाइब्रेरीज को रिवर्स इंजीनियर करना शुरू करते समय, मुझे नहीं पता था कि मुझे JNIEnv
के बारे में जानने की जरूरत है। JNIEnv
फंक्शन पॉइंटर्स का एक स्ट्रक्चर है जो JNI फंक्शन्स के लिए है। हर JNI फंक्शन एंड्रॉइड नेटिव लाइब्रेरीज में, पहले आर्गुमेंट के रूप में JNIEnv*
लेता है।
एंड्रॉइड JNI टिप्स डॉक्यूमेंटेशन से:
JNIEnv और JavaVM के C घोषणाएँ C++ घोषणाओं से अलग हैं। "jni.h" इनक्लूड फाइल C या C++ में शामिल होने पर अलग टाइपडेफ्स प्रदान करती है। इस कारण से, यह एक बुरा विचार है कि JNIEnv आर्गुमेंट्स को हेडर फाइल्स में शामिल किया जाए जिन्हें दोनों भाषाओं द्वारा शामिल किया जाता है। (दूसरे शब्दों में: अगर आपकी हेडर फाइल में #ifdef __cplusplus की आवश्यकता है, तो आपको कुछ अतिरिक्त काम करना पड़ सकता है अगर उस हेडर में कुछ भी JNIEnv को संदर्भित करता है।)
यहाँ कुछ सामान्य रूप से उपयोग किए जाने वाले फंक्शन्स (और उनके JNIEnv में ऑफसेट्स) हैं:
- JNIEnv + 0x18: jclass (*FindClass)(JNIEnv_, const char_);
- JNIEnv + 0x34: jint (*Throw)(JNIEnv*, jthrowable);
- JNIEnv + 0x70: jobject (*NewObject)(JNIEnv*, jclass, jmethodID, …);
- JNIEnv + 0x84: jobject (*NewObject)(JNIEnv*, jclass, jmethodID, …);
- JNIEnv + 0x28C: jstring (*NewString)(JNIEnv_, const jchar_, jsize);
- JNIEnv + 0x35C: jint (*RegisterNatives)(JNIEnv_, jclass, const JNINativeMethod_, jint);
एंड्रॉइड नेटिव लाइब्रेरीज का विश्लेषण करते समय, JNIEnv की उपस्थिति का मतलब है कि:
- JNI नेटिव फंक्शन्स के लिए, आर्गुमेंट्स 2 से शिफ्ट हो जाएंगे। पहला आर्गुमेंट हमेशा JNIEnv* होता है। दूसरा आर्गुमेंट वह ऑब्जेक्ट होगा जिस पर फंक्शन को चलाना होगा। स्टैटिक नेटिव मेथड्स के लिए (उनके जावा घोषणा में स्टैटिक कीवर्ड होता है) यह NULL होगा।
- आप अक्सर डिसासेम्बली में इंडायरेक्ट ब्रांचेस देखेंगे क्योंकि कोड JNIEnv* पॉइंटर के लिए ऑफसेट जोड़ रहा है, उस स्थान पर फंक्शन पॉइंटर को डिरेफरेंस कर रहा है, फिर फंक्शन को ब्रांच कर रहा है।
यहाँ JNIEnv स्ट्रक्चर के C-इम्प्लीमेंटेशन की एक [स्प्रेडशीट](https://docs.google.com/spreadsheets/d/1yqjFaY7mqyVIDs5jNjGLT-G8pUaRATzHWGFUgpdJRq8/edit?usp=
सौभाग्य से, यह सब मैन्युअली किए बिना JNI फंक्शन प्राप्त करने का एक तरीका है! Ghidra और IDA Pro डिकंपाइलर्स दोनों में आप JNI फंक्शन्स के पहले आर्गुमेंट को `JNIEnv *` टाइप में री-टाइप कर सकते हैं और यह स्वचालित रूप से कॉल किए जा रहे JNI फंक्शन्स की पहचान करेगा। IDA Pro में, यह बॉक्स से बाहर काम करता है। Ghidra में, आपको पहले JNI टाइप्स लोड करना होगा (या तो jni.h फाइल या jni.h फाइल का Ghidra Data Types आर्काइव)। आसानी के लिए, हम Ghidra Data Types आर्काइव (gdt) से JNI टाइप्स लोड करेंगे जो Ayrx द्वारा निर्मित है और [यहाँ](https://github.com/Ayrx/JNIAnalyzer/blob/master/JNIAnalyzer/data/jni\_all.gdt) उपलब्ध है। आसानी के लिए, यह फाइल VM में `~/jni_all.gdt` पर उपलब्ध है।
Ghidra में इसे उपयोग के लिए लोड करने के लिए, Data Type Manager Window में, दाहिने हाथ के कोने में नीचे की ओर तीर पर क्लिक करें और "Open File Archive" चुनें।
![Screenshot of Open File Archive Menu](https://maddiestone.github.io/AndroidAppRE/images/OpenArchive.png)
फिर `jni_all.gdt` फाइल को लोड करने के लिए चुनें। एक बार यह लोड हो जाने के बाद, आपको Data Type Manager List में jni\_all दिखाई देगा जैसा कि नीचे दिखाया गया है।
![Screenshot of jni\_all Loaded in Data Type Manager](https://maddiestone.github.io/AndroidAppRE/images/LoadedInDataTypeManager.png)
एक बार यह Ghidra में लोड हो जाने के बाद, आप फिर डिकंपाइलर में किसी भी आर्गुमेंट टाइप्स को चुन सकते हैं और "Retype Variable" चुन सकते हैं। नए टाइप को JNIEnv \* सेट करें। इससे डिकंपाइलर अब पॉइंटर से ऑफसेट्स के बजाय JNIFunctions के नाम दिखाएगा।
![Screenshot of JNI Function names after the argument was Re-Typed to JNIEnv\*](https://maddiestone.github.io/AndroidAppRE/images/RetypedToJNIEnv.png)
#### अभ्यास #6 - नेटिव फंक्शन खोजें और रिवर्स करें <a href="#exercise-6---find-and-reverse-the-native-function" id="exercise-6---find-and-reverse-the-native-function"></a>
हम अपने पिछले सभी कौशलों को एक साथ लाने जा रहे हैं: RE के लिए प्रारंभिक बिंदुओं की पहचान करना, DEX को रिवर्स करना, और नेटिव कोड को रिवर्स करना ताकि एक ऐप्लिकेशन का विश्लेषण किया जा सके जिसने अपने हानिकारक व्यवहारों को नेटिव कोड में स्थानांतरित कर दिया हो। नमूना `~/samples/HDWallpaper.apk` है।
**लक्ष्य**
इस अभ्यास का लक्ष्य हमारे सभी Android रिवर्सिंग कौशलों को एक साथ रखना है ताकि एक ऐप का संपूर्ण रूप से विश्लेषण किया जा सके: इसका DEX और नेटिव कोड।
**अभ्यास संदर्भ**
आप एक Android ऐप्लिकेशन्स के लिए मैलवेयर विश्लेषक हैं। आपको चिंता है कि यह नमूना प्रीमियम SMS धोखाधड़ी कर रहा हो सकता है, अर्थात यह बिना खुलासे और उपयोगकर्ता सहमति के एक प्रीमियम फोन नंबर पर SMS भेजता है। मैलवेयर के रूप में चिह्नित करने के लिए, आपको निर्धारित करना होगा कि Android ऐप्लिकेशन:
1. एक SMS संदेश भेज रहा है, और
2. वह SMS संदेश एक प्रीमियम नंबर पर जा रहा है, और
3. क्या एक स्पष्ट खुलासा है, और
4. क्या SMS संदेश केवल उपयोगकर्ता सहमति के बाद प्रीमियम नंबर पर भेजा जाता है।
**निर्देश**
आगे बढ़ें और रिवर्स करें!
**समाधान**
## **JEB - डीबग Android नेटिव लाइब्रेरीज**
**इस ब्लॉग को देखें:** [**https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3**](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* क्या आप **साइबरसिक्योरिटी कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी का विज्ञापन HackTricks में देखना चाहते हैं**? या क्या आप **PEASS के नवीनतम संस्करण तक पहुँच प्राप्त करना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं**? [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह।
* [**आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें**](https://peass.creator-spring.com)
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord group**](https://discord.gg/hRep4RUj7f) या [**telegram group**](https://t.me/peass) में **शामिल हों** या मुझे **Twitter** पर **फॉलो** करें [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **hacktricks repo** और [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) में अपनी हैकिंग ट्रिक्स साझा करके PRs सबमिट करें।
</details>