Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
simplify — एंड्रॉइड वर्चुअल मशीन और डीओबफसकेटर | Kitploit
उपकरण/GitHubGitHub/calebfenton/simplify
एंड्रॉइड सुरक्षागतिशील विश्लेषण (सैंडबॉक्सिंग)रिवर्स इंजीनियरिंगमालवेयर विश्लेषणबाइनरी विश्लेषण
GitHubcalebfenton/simplify

simplify

एंड्रॉइड वर्चुअल मशीन और डीओबफसकेटर

रिपॉजिटरी देखें
4.7k45515 साल पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

सरल करें

निर्माण स्थिति कवरेज स्थिति कवरिटी स्कैन निर्माण स्थिति

सामान्य एंड्रॉइड डिओबफस्केटर

Simplify वस्तुतः एक ऐप को निष्पादित करके उसके व्यवहार को समझता है और फिर कोड को अनुकूलित करने का प्रयास करता है ताकि वह समान व्यवहार करे लेकिन मनुष्य के लिए समझना आसान हो। प्रत्येक अनुकूलन प्रकार सरल और सामान्य है, इसलिए इससे कोई फर्क नहीं पड़ता कि किस विशेष प्रकार का अस्पष्टीकरण (obfuscation) उपयोग किया गया है।

पहले और बाद में

बाईं ओर का कोड एक अस्पष्टीकृत ऐप का डीकंपाइलेशन है, और दाईं ओर का कोड डिओबफस्केट किया गया है।

बहुत सारे मेथड कॉल, कोई स्पष्ट अर्थ नहीं वाह, इतना शाब्दिक, बहुत अर्थ

अवलोकन

परियोजना के तीन भाग हैं: smalivm, simplify, और डेमो ऐप।

  1. smalivm: Dalvik विधियों को निष्पादित करने के लिए एक वर्चुअल मशीन सैंडबॉक्स प्रदान करता है। किसी विधि को निष्पादित करने के बाद, यह एक ग्राफ़ लौटाता है जिसमें प्रत्येक निष्पादन पथ के लिए सभी संभावित रजिस्टर और क्लास मान शामिल होते हैं। यह तब भी काम करता है जब कुछ मान अज्ञात हों, जैसे फ़ाइल और नेटवर्क I/O। उदाहरण के लिए, अज्ञात मान वाली कोई भी if या switch सशर्त स्थिति दोनों शाखाओं को लेने का कारण बनती है।
  2. simplify: smalivm से निष्पादन ग्राफ़ का विश्लेषण करता है और अनुकूलन लागू करता है जैसे स्थिर प्रसार, मृत कोड हटाना, अनुरूपण हटाना (unreflection), और कुछ पीपहोल अनुकूलन। ये काफी सरल हैं, लेकिन जब एक साथ बार-बार लागू किए जाते हैं, तो वे स्ट्रिंग्स को डिक्रिप्ट करेंगे, रिफ्लेक्शन हटाएंगे, और कोड को बहुत सरल बनाएंगे। यह विधियों और कक्षाओं का नाम बदलता नहीं है।
  3. demoapp: आपके अपने प्रोजेक्ट में smalivm का उपयोग करने के लिए सरल, भारी टिप्पणी वाले उदाहरण शामिल हैं। यदि आप कुछ ऐसा बना रहे हैं जिसे Dalvik कोड निष्पादित करने की आवश्यकता है, तो इसे देखें।

उपयोग

root@kitploit:~
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 के साथ क्लोन करें:

root@kitploit:~
git clone --recursive https://github.com/CalebFenton/simplify.git

या किसी भी समय सबमॉड्यूल को अपडेट करें:

root@kitploit:~
git submodule update --init --recursive

फिर, सभी निर्भरताओं वाला एक एकल jar बनाने के लिए:

root@kitploit:~
./gradlew fatjar

Simplify jar simplify/build/libs/ में होगा। आप प्रदान किए गए अस्पष्टीकृत उदाहरण ऐप को सरल बनाकर इसके काम करने की जांच कर सकते हैं। इसे चलाने का तरीका यहां दिया गया है (आपको simplify.jar बदलने की आवश्यकता हो सकती है):

root@kitploit:~
java -jar simplify/build/libs/simplify.jar -it "org/cf/obfuscated" -et "MainActivity" simplify/obfuscated-app.apk

यह समझने के लिए कि क्या डिओबफस्केट किया जा रहा है, Obfuscated App का README देखें।

समस्या निवारण

यदि Simplify विफल हो जाता है, तो क्रम से इन सुझावों को आज़माएं:

  1. केवल कुछ विधियों या कक्षाओं को लक्षित करने के लिए -it विकल्प का उपयोग करें।
  2. यदि विफलता अधिकतम विज़िट से अधिक होने के कारण है, तो उच्च --max-address-visits, --max-call-depth, और --max-method-visits का उपयोग करने का प्रयास करें।
  3. -v या -v 2 के साथ प्रयास करें और लॉग और DEX या APK के हैश के साथ समस्या की रिपोर्ट करें।
  4. फिर से प्रयास करें, लेकिन आँख से संपर्क न तोड़ें। Simplify डर को महसूस कर सकता है।

यदि 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 को स्थिरांक से बदल देगा। उदाहरण के लिए:

root@kitploit:~
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 से बदला जा सकता है:

root@kitploit:~
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."

मृत कोड हटाना

कोड मृत है यदि उसे हटाने से ऐप के व्यवहार में कोई बदलाव नहीं आ सकता। सबसे स्पष्ट मामला तब है जब कोड अप्राप्य है, जैसे if (false) { // dead })। यदि कोड प्राप्य है, तो उसे मृत माना जा सकता है यदि वह विधि के बाहर किसी भी स्थिति को प्रभावित नहीं करता, यानी उसका कोई दुष्प्रभाव नहीं है। उदाहरण के लिए, कोड विधि के लिए वापसी मान को प्रभावित नहीं कर सकता, किसी भी क्लास चर को नहीं बदल सकता, या कोई IO नहीं कर सकता। स्थैतिक विश्लेषण में यह निर्धारित करना कठिन है। सौभाग्य से, smalivm को स्मार्ट होने की आवश्यकता नहीं है। यह बस मूर्खतापूर्ण ढंग से वह सब कुछ निष्पादित करता है जो वह कर सकता है और यदि वह सुनिश्चित नहीं है तो दुष्प्रभाव मानता है। स्थिर प्रसार के उदाहरण पर विचार करें:

root@kitploit:~
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."

इस कोड में, invoke-static अब विधि के वापसी मान को प्रभावित नहीं करता और मान लें कि यह कुछ अजीब नहीं करता जैसे फ़ाइल सिस्टम या नेटवर्क सॉकेट पर बाइट्स लिखना, इसलिए इसका कोई दुष्प्रभाव नहीं है। इसे आसानी से हटाया जा सकता है।

root@kitploit:~
const-string v0, "VGVsbCBtZSBvZiB5b3VyIGhvbWV3b3JsZCwgVXN1bC4="
const-string v0, "Tell me of your homeworld, Usul."

अंत में, पहला const-string एक रजिस्टर को एक मान निर्दिष्ट करता है, लेकिन वह मान कभी उपयोग नहीं किया जाता, यानी असाइनमेंट मृत है। इसे भी हटाया जा सकता है।

root@kitploit:~
const-string v0, "Tell me of your homeworld, Usul."

वाह!

अनुरूपण हटाना (Unreflection)

जावा के स्थैतिक विश्लेषण में एक प्रमुख चुनौती रिफ्लेक्शन है। यह जानना संभव नहीं है कि रिफ्लेक्शन विधियों के लिए तर्क क्या हैं, बिना सावधान डेटा प्रवाह विश्लेषण किए। ऐसा करने के स्मार्ट, चतुर तरीके हैं, लेकिन smalivm इसे केवल कोड निष्पादित करके करता है। जब यह एक परावर्तित विधि आह्वान पाता है जैसे:

root@kitploit:~
invoke-virtual {v0, v1, v2}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;

यह v0, v1, और v2 के मान जान सकता है। यदि यह सुनिश्चित है कि मान क्या हैं, तो यह Method.invoke() के कॉल को एक वास्तविक गैर-परावर्तित विधि आह्वान से बदल सकता है। यही परावर्तित फ़ील्ड और क्लास लुकअप पर भी लागू होता है।

पीपहोल (Peephole)

जो कुछ भी किसी विशेष श्रेणी में साफ-साफ फिट नहीं होता, उसके लिए पीपहोल अनुकूलन हैं। इसमें बेकार check-cast ops को हटाना, Ljava/lang/String;-><init> कॉल को const-string से बदलना, और इसी तरह के अन्य कार्य शामिल हैं।

डिओबफस्केशन उदाहरण

अनुकूलन से पहले

root@kitploit:~
.method public static test1()I
    .locals 2

    new-instance v0, Ljava/lang/Integer;
    const/4 v1, 0x1
    invoke-direct {v0, v1}, Ljava/lang/Integer;-><init>(I)V

    invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
    move-result v0

    return v0
.end method

यह सब बस v0 = 1 करता है।

स्थिर प्रसार के बाद

root@kitploit:~
.method public static test1()I
    .locals 2

    new-instance v0, Ljava/lang/Integer;
    const/4 v1, 0x1
    invoke-direct {v0, v1}, Ljava/lang/Integer;-><init>(I)V

    invoke-virtual {v0}, Ljava/lang/Integer;->intValue()I
    const/4 v0, 0x1

    return v0
.end method

move-result v0 को const/4 v0, 0x1 से बदल दिया गया है। ऐसा इसलिए क्योंकि intValue()I के लिए केवल एक संभावित वापसी मान है और वापसी प्रकार को स्थिरांक बनाया जा सकता है। तर्क v0 और v1 असंदिग्ध हैं और बदलते नहीं हैं। यानी, intValue()I पर प्रत्येक संभावित निष्पादन पथ के लिए मानों की सर्वसम्मति है। अन्य प्रकार के मान जिन्हें स्थिरांक में बदला जा सकता है:

  • संख्याएं - const/4, const/16, आदि।
  • स्ट्रिंग - const-string
  • क्लास - const-class

मृत कोड हटाने के बाद

root@kitploit:~
.method public static test1()I
    .locals 2

    const/4 v0, 0x1

    return v0
.end method

क्योंकि उपरोक्त const/4 v0, 0x1 का कोड विधि के बाहर की स्थिति को प्रभावित नहीं करता (कोई दुष्प्रभाव नहीं), इसे व्यवहार बदले बिना हटाया जा सकता है। यदि कोई मेथड कॉल होता जिसने फ़ाइल सिस्टम या नेटवर्क पर कुछ लिखा होता, तो इसे नहीं हटाया जा सकता क्योंकि यह विधि के बाहर की स्थिति को प्रभावित करता है। या यदि test()I एक परिवर्तनीय तर्क लेता, जैसे LinkedList, तो उस तक पहुँचने वाले किसी भी निर्देश को मृत नहीं माना जा सकता।

मृत कोड के अन्य उदाहरण:

  • असंदर्भित असाइनमेंट - रजिस्टरों को असाइन करना और उनका उपयोग न करना
  • अप्राप्य / अगम्य निर्देश - if (false) { dead_code(); }

लाइसेंस

यह उपकरण एक दोहरे लाइसेंस के तहत उपलब्ध है: एक वाणिज्यिक लाइसेंस जो बंद स्रोत परियोजनाओं के लिए उपयुक्त है, और एक GPL लाइसेंस जिसका उपयोग ओपन सोर्स सॉफ्टवेयर में किया जा सकता है।

आपकी आवश्यकताओं के आधार पर, आपको उनमें से एक को चुनना होगा और उसकी नीतियों का पालन करना होगा। प्रत्येक लाइसेंस प्रकार के लिए नीतियों और समझौतों का विवरण LICENSE.COMMERCIAL और LICENSE.GPL फ़ाइलों में उपलब्ध है।

आगे पढ़ने के लिए

  • SmaliVM के साथ Dalvik वर्चुअल निष्पादन
  • Guillot, Yoann, and Alexandre Gazet. "Automatic Binary Deobfuscation." Journal in Computer Virology 6.3 (2010): 261-76
  • Unicorn - अंतिम CPU एमुलेटर
  • Babak Yadegari, Saumya Debray. "Symbolic Execution of Obfuscated Code"
  • सफलता की कहानियाँ:
    • Android डायनामिक क्लास लोडिंग "AES/CFB/NoPadding" एन्क्रिप्शन के साथ। पहले और बाद में एक झलक लें। उपयोग किया गया उपकरण: #simplify. #Android #obfuscation #classencryption #dex
    • मैलवेयर स्ट्रिंग एन्क्रिप्शन को डिक्रिप्ट करना
टूल डाउनलोड करें