
एंड्रॉइड वर्चुअल मशीन और डीओबफसकेटर
Simplify वस्तुतः एक ऐप को निष्पादित करके उसके व्यवहार को समझता है और फिर कोड को अनुकूलित करने का प्रयास करता है ताकि वह समान व्यवहार करे लेकिन मनुष्य के लिए समझना आसान हो। प्रत्येक अनुकूलन प्रकार सरल और सामान्य है, इसलिए इससे कोई फर्क नहीं पड़ता कि किस विशेष प्रकार का अस्पष्टीकरण (obfuscation) उपयोग किया गया है।
बाईं ओर का कोड एक अस्पष्टीकृत ऐप का डीकंपाइलेशन है, और दाईं ओर का कोड डिओबफस्केट किया गया है।
परियोजना के तीन भाग हैं: smalivm, simplify, और डेमो ऐप।
if या switch सशर्त स्थिति दोनों शाखाओं को लेने का कारण बनती है।usage: java -jar simplify.jar <input> [options]
deobfuscates a dalvik executable
-et,--exclude-types <pattern> उन कक्षाओं और विधियों को बाहर करें जिनमें REGEX शामिल है, जैसे: "com/android", include-types के बाद लागू होता है
-h,--help यह संदेश प्रदर्शित करें
-ie,--ignore-errors विधियों को निष्पादित और अनुकूलित करते समय त्रुटियों को अनदेखा करें। इससे अप्रत्याशित व्यवहार हो सकता है।
--include-support Android समर्थन लाइब्रेरी पैकेजों में कक्षाओं को निष्पादित और अनुकूलित करने का प्रयास करें, डिफ़ॉल्ट: false
-it,--include-types <pattern> निष्पादन को उन कक्षाओं और विधियों तक सीमित करें जिनमें REGEX शामिल है, जैसे: ";->targetMethod\("
--max-address-visits <N> किसी विधि को निष्पादित करना छोड़ दें जब उसी पते पर N बार जाया जाए, लूप को सीमित करता है, डिफ़ॉल्ट: 10000
--max-call-depth <N> N की कॉल गहराई तक पहुँचने के बाद विधियों को कॉल न करें, पुनरावृत्ति और लंबी विधि श्रृंखलाओं को सीमित करता है, डिफ़ॉल्ट: 50
--max-execution-time <N> किसी विधि को N सेकंड के बाद निष्पादित करना छोड़ दें, डिफ़ॉल्ट: 300
--max-method-visits <N> किसी विधि में N निर्देश निष्पादित करने के बाद उसे निष्पादित करना छोड़ दें, डिफ़ॉल्ट: 1000000
--max-passes <N> किसी विधि पर अनुकूलक को N बार से अधिक न चलाएं, डिफ़ॉल्ट: 100
-o,--output <file> सरलीकृत आउटपुट को FILE में लिखें
--output-api-level <LEVEL> आउटपुट DEX API संगतता को LEVEL पर सेट करें, डिफ़ॉल्ट: 15
-q,--quiet शांत रहें
--remove-weak कमजोर दुष्प्रभाव होने पर भी कोड हटाएं, डिफ़ॉल्ट: true
-v,--verbose <LEVEL> वाचालता को LEVEL पर सेट करें, डिफ़ॉल्ट: 0
निर्माण के लिए जावा डेवलपमेंट किट 8 (JDK) स्थापित होना आवश्यक है।
क्योंकि इस परियोजना में Android फ्रेमवर्क के लिए सबमॉड्यूल शामिल हैं, --recursive के साथ क्लोन करें:
git clone --recursive https://github.com/CalebFenton/simplify.git
या किसी भी समय सबमॉड्यूल को अपडेट करें:
git submodule update --init --recursive
फिर, सभी निर्भरताओं वाला एक एकल jar बनाने के लिए:
./gradlew fatjar
Simplify jar simplify/build/libs/ में होगा। आप प्रदान किए गए अस्पष्टीकृत उदाहरण ऐप को सरल बनाकर इसके काम करने की जांच कर सकते हैं। इसे चलाने का तरीका यहां दिया गया है (आपको simplify.jar बदलने की आवश्यकता हो सकती है):
java -jar simplify/build/libs/simplify.jar -it "org/cf/obfuscated" -et "MainActivity" simplify/obfuscated-app.apk
यह समझने के लिए कि क्या डिओबफस्केट किया जा रहा है, Obfuscated App का README देखें।
यदि Simplify विफल हो जाता है, तो क्रम से इन सुझावों को आज़माएं:
-it विकल्प का उपयोग करें।--max-address-visits, --max-call-depth, और --max-method-visits का उपयोग करने का प्रयास करें।-v या -v 2 के साथ प्रयास करें और लॉग और DEX या APK के हैश के साथ समस्या की रिपोर्ट करें।यदि Windows पर निर्माण कर रहे हैं और निर्माण इस तरह की त्रुटि के साथ विफल होता है:
Could not find tools.jar. Please check that C:\Program Files\Java\jre1.8.0_151 contains a valid JDK installation.
इसका अर्थ है कि Gradle उचित JDK पथ खोजने में असमर्थ है। सुनिश्चित करें कि JDK स्थापित है, JAVA_HOME पर्यावरण चर को अपने JDK पथ पर सेट करें, और निर्माण के लिए उपयोग किए जाने वाले कमांड प्रॉम्प्ट को बंद करके फिर से खोलें।
संकोच न करें। मुझे वर्चुअल निष्पादन और डिओबफस्केशन आकर्षक समस्याएँ लगती हैं। जो भी रुचि रखता है वह स्वतः ही अच्छा है और योगदान का स्वागत है, भले ही वह केवल एक टाइपो सुधारने के लिए हो। प्रश्न पूछने के लिए issues में और पुल रिक्वेस्ट सबमिट करने में संकोच न करें।
कृपया APK या DEX का लिंक और आपके द्वारा उपयोग किया जा रहा पूर्ण कमांड शामिल करें। इससे आपकी समस्या को पुन: उत्पन्न करना (और इस प्रकार ठीक करना) बहुत आसान हो जाता है।
यदि आप नमूना साझा नहीं कर सकते, तो कृपया फ़ाइल हैश (SHA1, SHA256, आदि) शामिल करें।
यदि कोई op किसी प्रकार का मान रखता है जिसे स्थिरांक में बदला जा सकता है जैसे स्ट्रिंग, संख्या या बूलियन, तो यह अनुकूलन उस op को स्थिरांक से बदल देगा। उदाहरण के लिए:
const-string v0, "VGVsbCBtZSBvZiB5b3VyIGhvbWV3b3JsZCwgVXN1bC4="
invoke-static {v0}, Lmy/string/Decryptor;->decrypt(Ljava/lang/String;)Ljava/lang/String;
# Decrypts to: "Tell me of your homeworld, Usul."
move-result v0
इस उदाहरण में, एक एन्क्रिप्टेड स्ट्रिंग को डिक्रिप्ट किया जाता है और v0 में रखा जाता है। चूंकि स्ट्रिंग "constantizable" हैं, move-result v0 को const-string से बदला जा सकता है:
const-string v0, "VGVsbCBtZSBvZiB5b3VyIGhvbWV3b3JsZCwgVXN1bC4="
invoke-static {v0}, Lmy/string/Decryptor;->decrypt(Ljava/lang/String;)Ljava/lang/String;
const-string v0, "Tell me of your homeworld, Usul."