
रेडेक्सर बाइनरी इंस्ट्रूमेंटेशन फ्रेमवर्क फॉर डाल्विक बाइटकोड
रेडेक्सर एक पुनर्रचना उपकरण है जो Android ऐप बाइनरी में हेरफेर करता है। यह उपकरण DEX फ़ाइल को मेमोरी डेटा संरचना में पार्स करने में सक्षम है; यह अनुमान लगाने में सक्षम है कि ऐप किन मापदंडों के साथ कुछ अनुमतियों का उपयोग करता है (हम इस सुविधा को RefineDroid नाम देते हैं); उस डेटा संरचना को संशोधित और अनपार्स करने में सक्षम है ताकि आउटपुट DEX फ़ाइल उत्पन्न हो (हम इन सुविधाओं को Dr. Android नाम देते हैं, जो Dalvik Rewriting for Android के लिए है)।
यह उपकरण OCaml 4.09.0 और Ruby 1.8.6(7) के अंतर्गत परीक्षण किया गया है, इसलिए आपको इन्हें (या इनके उच्च संस्करण) स्थापित करने की आवश्यकता है।
DEX प्रारूप में SHA-1 हस्ताक्षर (हैश) में हेरफेर करने के लिए, हम OCaml SHA लाइब्रेरी का उपयोग करते हैं ocamlfind/findlib के माध्यम से, जो एक OCaml लाइब्रेरी प्रबंधक है। दोनों को स्थापित करने का सबसे आसान तरीका OPAM का उपयोग करना है, जो एक OCaml पैकेज प्रबंधक है, जिसमें दोनों पैकेज हैं---OPAM ocamlfind और OPAM sha।
आप दोनों पैकेजों को सीधे बना और/या स्थापित भी कर सकते हैं। यदि आप Linux मशीन का उपयोग कर रहे हैं, तो आप आसानी से वितरण पा सकते हैं।
यदि नहीं, उदाहरण के लिए Mac का उपयोग कर रहे हैं, तो आपको इसे स्वयं बनाना होगा।
आप मूल स्रोत कोड यहाँ पा सकते हैं।
इसे make चलाकर बनाएँ, और परिणामी निर्देशिका को ocamlfind की रूट site-lib निर्देशिका से लिंक करें; या sudo make install।
यदि आप PC का उपयोग कर रहे हैं, तो आपको पहले ocamlfind/findlib और FlexDLL स्थापित करना होगा। कृपया सुनिश्चित करें कि आपके पर्यावरण चर निम्नानुसार सही ढंग से सेट हैं:
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
OPAM पैकेज:
Android SDK (या स्रोत)
apk फ़ाइलों को अनपैक और रिपैक करने के लिए, हम apktool का उपयोग करते हैं, जो एक ओपन सोर्स APK पुनर्रचना उपकरण है। चूँकि यह aapt, Android Asset Packaging Tool का उपयोग करता है, आपको Android SDK या स्रोत स्थापित करने की आवश्यकता है। इसके अलावा, हम zipalign का उपयोग करते हैं, जो Android SDK से आता है, पुनर्लिखित ऐप्स को अनुकूलित करने के लिए।
आप Android आधार उपकरणों के पथ निम्नलिखित को अपने प्रोफ़ाइल में जोड़कर सेट कर सकते हैं:
ANDROID_HOME=$HOME/android-sdk # अपना खुद का पथ यहाँ!
export ANDROID_HOME
PATH=$PATH:$ANDROID_HOME/tools
PATH=$PATH:$ANDROID_HOME/platform-tools
PATH=$PATH:$ANDROID_HOME/build-tools/19.0.0 # स्थापित संस्करण संख्या
export PATH
मुख्य स्क्रिप्ट Ruby में लिखी गई हैं और उन्हें RubyGems, एक Ruby पैकेज प्रबंधक, और Nokogiri, मेनिफ़ेस्ट फ़ाइलों में हेरफेर करने के लिए एक XML लाइब्रेरी की आवश्यकता है।
यदि आप ग्राफ़ (जैसे कॉल ग्राफ़, नियंत्रण-प्रवाह ग्राफ़, डोमिनेटर ट्री, आदि) देखना चाहते हैं, तो आपको graphviz dot स्थापित करने की आवश्यकता है।
रेडेक्सर बनाने के लिए, बस make करें! आप शीर्ष स्तर पर रेडेक्सर बाइनरी देख सकते हैं।
$ make (clean)
उपकरण का उपयोग करने से पहले, apktool के लिए सबसे हालिया प्लेटफ़ॉर्म फ़ाइल स्थापित करना उपयोगकर्ताओं पर निर्भर है। उदाहरण के लिए, आपको ऐसा करने की आवश्यकता है
$ java -jar tools/apktool.jar if [उपयुक्त प्लेटफ़ॉर्म फ़ाइल]
आप HTML प्रारूप में API दस्तावेज़ भी उत्पन्न कर सकते हैं।
$ make api
आप उपकरण द्वारा प्रदान किए गए सभी विकल्प देख सकते हैं:
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
Android SDK में dexdump की तरह, रेडेक्सर आपको दी गई dex फ़ाइल के आंतरिक भाग को YAML प्रारूप में देखने की अनुमति देता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
यह विकल्प एक निर्दिष्ट विधि के लिए निर्देश डंप करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
यह सुविधा रेडेक्सर के पार्सिंग और डंपिंग मॉड्यूल का परीक्षण करने के लिए है। यह संभवतः एक समान dex फ़ाइल उत्पन्न करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
आप dex फ़ाइल के बारे में बुनियादी आँकड़े भी देख सकते हैं, उदाहरण के लिए, # instr.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
यह विकल्प dex फ़ाइल में परिभाषित सभी वर्ग नाम प्रिंट करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
यह विशिष्ट तृतीय-पक्ष पुस्तकालयों को खोजने में उपयोगी हो सकता है, उदाहरण के लिए,
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
यह विकल्प dex फ़ाइल में API उपयोग प्रिंट करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
क्या आप उत्सुक नहीं हैं कि Dalvik बाइटकोड में कुछ ऑपकोड कितने कम उपयोग होते हैं? यह आपको सभी ऑपकोड का हिस्टोग्राम दिखाएगा, या आप देख सकते हैं कि दिए गए ऐप में एक विशेष ऑपकोड कितनी बार उपयोग किया जाता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
उदाहरण के लिए,
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat --op div-int/lit16,nop
यह विकल्प प्रसार-आधारित इंटेंट समाधान विश्लेषण करता है, और Activity वर्गों के बीच संक्रमण प्रिंट करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
यह विकल्प एक pdf फ़ाइल उत्पन्न करता है जो दी गई फ़ाइल का कॉल ग्राफ़ दर्शाता है। यदि आप pdf नाम निर्दिष्ट नहीं करते हैं, तो cg.pdf का उपयोग किया जाएगा।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
यह विकल्प एक pdf फ़ाइल उत्पन्न करता है जो दी गई विधि का नियंत्रण-प्रवाह ग्राफ़ दिखाता है। वर्ग नाम के साथ एक डॉट द्वारा विधि नाम जोड़ें: class_name.method_name
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
यह विकल्प उपरोक्त सुविधा के समान है, सिवाय इसके कि यह (पोस्ट) डोमिनेटर ट्री दर्शाता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
यह विकल्प एक क्लासिक बैकवर्ड डेटा-प्रवाह विश्लेषण करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
यह विकल्प एक क्लासिक फॉरवर्ड डेटा-प्रवाह विश्लेषण करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd
यह विकल्प एक क्लासिक फॉरवर्ड डेटा-प्रवाह विश्लेषण करता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd reach --mtd cls.mtd
यह विकल्प वर्ग निर्भरता ढूँढता है।
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dependants --mtd cls.mtd
यह विकल्प दिए गए apk का प्रारंभकर्ता गतिविधि नाम प्रिंट करता है।
$ ruby scripts/cmd.rb target.apk --cmd launcher
यह विकल्प आपको बताता है कि बाहरी दुनिया के लिए कौन से घटक खुले हैं।
$ ruby scripts/cmd.rb target.apk --cmd exported
ये विकल्प मेनिफ़ेस्ट में घोषित Android बुनियादी घटकों को प्रिंट करते हैं।
$ ruby scripts/cmd.rb target.apk --cmd [activity | service | provider | receiver]
यह विकल्प संसाधन में लेआउट परिभाषाओं का अन्वेषण करता है और कस्टम व्यू प्रिंट करता है।
$ ruby scripts/cmd.rb target.apk --cmd custom_views
यह विकल्प संसाधन में लेआउट परिभाषाओं का अन्वेषण करता है और Fragment तत्वों को प्रिंट करता है।
$ ruby scripts/cmd.rb target.apk --cmd fragments
यह विकल्प संसाधन में लेआउट परिभाषाओं का अन्वेषण करता है और Buttons को प्रिंट करता है, उनके id (या text) के साथ-साथ कॉलबैक विधि (यदि मौजूद हो) के साथ।
$ ruby scripts/cmd.rb target.apk --cmd buttons
यह विकल्प उन अनुमतियों को प्रिंट करता है जिनका apk उपयोग करता है।
$ ruby scripts/cmd.rb target.apk --cmd permissions
यह विकल्प प्रिंट करता है कि apk को किस SDK संस्करण की आवश्यकता है।
$ ruby scripts/cmd.rb target.apk --cmd sdk
यदि आप apk फ़ाइल को अनपैक नहीं करना चाहते हैं, तो वास्तव में, आप कमांड के संयोजन से वही काम कर सकते हैं:
$ aapt dump badging target.apk | grep 'targetSdkVersion' | tr -dc 0-9.\\n
यह विकल्प एक dex फ़ाइल उत्पन्न करेगा जो एक सरल संदेश प्रिंट करती है। वह dex फ़ाइल केवल रेडेक्सर के APIs का उपयोग करके बनाई गई है।
$ ruby scripts/cmd.rb --cmd hello
इसकी आंतरिक जाँच करें।
$ dexdump -d results/classes.dex
यदि आप रुचि रखते हैं, तो आप उस dex फ़ाइल का निम्नानुसार परीक्षण कर सकते हैं। मान लें कि ANDROID_SDK का पथ सेट है।
// dalvik VM के लिए उपयुक्त एक अस्थायी jar बनाएँ
$ aapt add temp.jar results/classes.dex
// (वैकल्पिक) यदि आपने avd नहीं बनाया है, तो इसे बनाएँ।
$ android create avd -n myAVD1 -t android-8
// अपना एमुलेटर लॉन्च करें
$ emulator -avd myAVD1 &
// अस्थायी jar को पुश करें
$ adb push temp.jar /data
// adb शेल से कनेक्ट करें
$ adb shell
// अंत में, dex चलाएँ
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar \
-classpath /data/temp.jar Hello
Hello, DEX
#
यह पुनर्लेखन सुविधा का एक प्रकार है। इस सुविधा का उपयोग करके, आप विशिष्ट दृष्टिकोणों से ऐप व्यवहार लॉग कर सकते हैं। लॉगिंग लाइब्रेरी के लिए पूर्व-निर्मित dex फ़ाइल प्रदान की गई है: data/logging.dex। यदि आप अधिक सुविधाएँ या उपयोगिताएँ जोड़ना चाहते हैं, तो इसे निम्नानुसार बनाएँ:
$ cd logging
$ gradle copyDex
$ cd ..
फिर, निम्नलिखित कमांड का उपयोग करें:
$ ruby scripts/cmd.rb target.apk --cmd logging
trim.py उपकरणित ऐप के कॉल-रिटर्न अनुक्रमों को कैप्चर कर सकता है। (आपको पहले रेडेक्सर का उपयोग करके परीक्षण के तहत ऐप को उपकरणित करना चाहिए।)
यदि वे लॉग पर्याप्त छोटे हैं, अर्थात फ़ोन (या एमुलेटर) सभी जानकारी को मेमोरी में रख सकता है, तो आप स्क्रिप्ट का ऑफ़लाइन मोड उपयोग कर सकते हैं:
$ ./scripts/trim.py -d
ध्यान दें कि सभी कमांड-लाइन पैरामीटर adb logcat को पास किए जाएंगे, और डिफ़ॉल्ट रूप से, org.umd.logging:I *:S अप्रासंगिक लॉग को फ़िल्टर करने के लिए पास किया जाता है।
यदि लॉग ओवरफ़्लो हो जाते हैं, तो आपको ऑनलाइन मोड का उपयोग करना चाहिए:
$ ./scripts/trim.py
स्क्रिप्ट कीबोर्ड इंटरप्ट को पकड़ लेती है, इसलिए आप Ctrl+C के माध्यम से लॉगिंग समाप्त कर सकते हैं।
दोनों मोड में, लॉग log.txt में सहेजे जाते हैं और एक साथ स्क्रीन पर दिखाए जाते हैं। इस प्रकार, लॉग एकत्र करने के बाद, आपको उस फ़ाइल को स्थानांतरित करने की आवश्यकता हो सकती है, उदा:
$ mv log.txt app.scenario.txt
उपरोक्त लॉगिंग सुविधा सामान्य है कि आप निर्दिष्ट कर सकते हैं कि विधि स्तर पर क्या लॉग करना है।
(अधिक विवरण के लिए logging मॉड्यूल देखें।)
हालाँकि, यह कभी-कभी बहुत वर्बोज़ होता है और प्रदर्शन में गिरावट ला सकता है।
यह सुविधा केवल उपयोगकर्ता अंतःक्रियाओं को लॉग करने के लिए डिज़ाइन की गई है। इस सुविधा का उपयोग करके, आप केवल UI-संबंधित घटनाओं को कैप्चर कर सकते हैं। इसी तरह, लॉगिंग लाइब्रेरी के लिए पूर्व-निर्मित dex फ़ाइल प्रदान की गई है: data/logging-ui.dex। यदि आप UI जानकारी की वर्बोसिटी को संशोधित करना चाहते हैं, तो इसे निम्नानुसार बनाएँ:
$ cd logging-ui
$ gradle copyDex
$ cd ..
फिर, निम्नलिखित कमांड का उपयोग करें:
$ ruby scripts/cmd.rb target.apk --cmd logging_ui
लॉगिंग लाइब्रेरी android a11y सेवा से विरासत में मिली है, जिसके लिए उपयोगकर्ता की स्पष्ट सहमति आवश्यक है। इस प्रकार, पुनर्लिखित apk स्थापित करने के बाद, Settings/Accessibility पर जाएँ और UI Logging सेवा चालू करें।
(इस चरण को डिवाइस डीबगिंग मोड चालू करने के समान देखा जा सकता है।)
logcat में, टैग org.umd.logging_ui.* वाले संदेश उपयोगकर्ता और परीक्षण के तहत ऐप के बीच अंतःक्रियाएँ हैं।
यह विकल्प लक्ष्य विधि कॉल की ओर घटक संक्रमण पथ ढूँढता है।
$ ruby scripts/cmd.rb target.apk --cmd directed
आप data/directed.txt में लक्ष्य विधियों को निर्दिष्ट कर सकते हैं जिन्हें लागू किया जाना है।
वे घटक संक्रमण पथ तृतीय-पक्ष पुस्तकालयों में सुरक्षा कमजोरियों का परीक्षण करने के लिए ऐप्स चलाने के लिए उपयोग किए जाते हैं। अधिक विवरण निम्नलिखित पेपर में वर्णित हैं:
* Brahmastra: Driving Apps to Test the Security of Third-Party Components.
R. Bhoraskar, et al., In 23rd Usenix Security Symposium (Security '14).
withTimeout.rb स्वचालित रूप से एक ऐप के लिए एक स्किप फ़ाइल बना सकता है। यह स्क्रिप्ट cmd.rb को एक विशिष्ट टाइमआउट के साथ चलाती है, जिसका उपयोग किसी एकल वर्ग को उपकरणित करने में बिताए गए समय को सीमित करने के लिए किया जाता है। यह कभी-कभी उस वर्ग के लिए एक अस्थायी कार्य-समाधान है जो उपकरणीकरण के दौरान लूप में फँस जाता है। जब यह स्क्रिप्ट क्रैश होने वाले वर्ग को ढूँढती है, तो वह इसे स्किप फ़ाइल में जोड़ती है और जहाँ से छोड़ा था वहाँ से जारी रखती है। एक बार withTimeout समाप्त हो जाने के बाद, डेटा निर्देशिका में [apk name]-skip.txt नामक एक फ़ाइल होगी, जिसका उपयोग उस apk के लिए पूरी तरह से उपकरणित ऐप बनाने के लिए किया जा सकता है। withTimeout का उपयोग करने के लिए, बस कॉल करें:
$ ruby scripts/withTimeout.rb TIMEOUT COMMANDS
जहाँ TIMEOUT आपके द्वारा चाहे गए टाइमआउट की लंबाई है (सेकंड में) (300 अनुशंसित है) और COMMANDS वे सभी सामान्य कमांड-लाइन इनपुट हैं जो आप apk के लिए scripts/cmd.rb को पास करेंगे।