
डीबग करने योग्य APK पर बिना रूट और NDK के मेमोरी खोज और पैच टूल
Apk-medit, root और ndk के बिना debuggable apk के लिए एक मेमोरी सर्च और पैच टूल है। यह मोबाइल गेम सुरक्षा परीक्षण के लिए बनाया गया था। कई मोबाइल गेम्स में रूटिंग डिटेक्शन होता है, लेकिन apk-medit को root विशेषाधिकारों की आवश्यकता नहीं होती है, इसलिए रूटिंग डिटेक्शन को बायपास किए बिना मेमोरी संशोधन किया जा सकता है।
मेमोरी संशोधन गेम्स में धोखा देने का सबसे आसान तरीका है, यह सुरक्षा परीक्षण में जांच किए जाने वाले मदों में से एक है। GameGuardian जैसे चीट टूल्स भी हैं जिन्हें आसानी से उपयोग किया जा सकता है। हालाँकि, non-root डिवाइस और CUI के लिए कोई टूल उपलब्ध नहीं था। इसलिए मैंने इसे एक सुरक्षा परीक्षण टूल के रूप में बनाया। iOS ऐप्स को लक्षित करने वाला संस्करण sterrasec/ipa-medit है।
यह एक डेमो है जो apk-medit का उपयोग करके एक गेम को क्लियर करता है जिसे क्लियर करने के लिए दस लाख टैप की आवश्यकता होती है।


GitHub Releases से बाइनरी डाउनलोड करें, कृपया बाइनरी को एंड्रॉइड डिवाइस पर /data/local/tmp/ में पुश करें।
बाइनरीज़ arm64 (भौतिक डिवाइस) और amd64 (x86_64 एंड्रॉइड एमुलेटर, जैसे Windows PCs पर) के लिए प्रदान की जाती हैं। अपने डिवाइस का ABI adb shell getprop ro.product.cpu.abi से जांचें।
$ adb push medit /data/local/tmp/medit
medit: 1 file pushed. 29.0 MB/s (3135769 bytes in 0.103s)
आप make कमांड से बना सकते हैं। इसके लिए go कंपाइलर की आवश्यकता होती है।
बिल्ड पूरा होने के बाद, यदि adb कनेक्टेड है, तो यह बिल्ड की गई बाइनरी को एंड्रॉइड डिवाइस पर /data/local/tmp/ में पुश करता है।
$ make
GOOS=linux GOARCH=arm64 GOARM=7 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"
medit: 1 file pushed. 23.7 MB/s (3131205 bytes in 0.126s)
x86_64 एंड्रॉइड एमुलेटर के लिए बिल्ड करने के लिए, इसके बजाय build-x86_64 टारगेट का उपयोग करें।
$ make build-x86_64 deploy
GOOS=linux GOARCH=amd64 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"
Windows 10 Cmd और PowerShell पर हमेशा-चालू कमांड विवरण पैनल ऊपर की ओर खिसकता है और प्रॉम्प्ट को ढक देता है (#37)।
जब medit एक Windows-जैसे कंसोल का पता लगाता है (एक नेटिव Windows बिल्ड, या TERM खाली/dumb), तो यह स्टार्टअप पर कमांड सूची एक बार प्रिंट करता है और लाइव पैनल को अक्षम कर देता है; Tab अभी भी कमांड नामों को पूरा करता है।
APK_MEDIT_LIVE_HELP=1 / 0 लाइव पैनल को जबरन चालू या बंद करता है।APK_MEDIT_WINDOWS_CONSOLE=1 / 0 कंसोल डिटेक्शन को ओवरराइड करता है।लक्ष्य ऐप द्वारा उपयोग की जाने वाली फाइलों को पढ़ने के लिए run-as कमांड का उपयोग करें, इसलिए apk-medit का उपयोग केवल उन ऐप्स के साथ किया जा सकता है जिनमें debuggable एट्रिब्यूट सक्षम है।
debuggable एट्रिब्यूट को सक्षम करने के लिए, AndroidManifest.xml खोलें, application xml नोड में निम्नलिखित xml एट्रिब्यूट जोड़ें:
android:debuggable="true"
आप AndroidManifest.xml को संपादित किए बिना debuggable एट्रिब्यूट को आसानी से सक्षम करने के लिए sterrasec/apkutil का भी उपयोग कर सकते हैं, यह उपयोगी है।
$ apkutil debuggable <target-apk-name>.apk
run-as कमांड चलाने के बाद, डायरेक्टरी स्वचालित रूप से बदल जाती है। इसलिए /data/local/tmp/ से medit कॉपी करें।
medit चलाने से एक इंटरैक्टिव प्रॉम्प्ट लॉन्च होता है।
$ adb shell
$ pm list packages # to check <target-package-name>
$ run-as <target-package-name>
$ cp /data/local/tmp/medit ./medit
$ ./medit
आप मेमोरी में लिखते समय ptrace का उपयोग न करने का विकल्प भी चुन सकते हैं। यह ptrace द्वारा डिबगर डिटेक्शन से बचता है, लेकिन SELinux के कारण Android 10 या बाद के संस्करणों पर काम नहीं करता है।
$ ./medit -without-ptrace
यहाँ इंटरैक्टिव प्रॉम्प्ट में उपलब्ध कमांड्स दिए गए हैं।
मेमोरी पर निर्दिष्ट इंटेजर खोजें।
> find 999982
Search UTF-8 String...
Target Value: 999982([57 57 57 57 56 50])
Found: 0!
------------------------
Search Word...
parsing 999982: value out of range
------------------------
Search Double Word...
Target Value: 999982([46 66 15 0])
Found: 1!
Address: 0xe7021f70
आप string, word, dword, qword जैसे डेटाटाइप भी निर्दिष्ट कर सकते हैं।
> find dword 999996
Search Double Word...
Target Value: 999996([60 66 15 0])
Found: 1!
Address: 0xe7021f70
पिछले सर्च परिणामों को फ़िल्टर करें जो वर्तमान सर्च परिणामों से मेल खाते हैं।
> filter 993881
Check previous results of searching dword...
Target Value: 993881([89 42 15 0])
Found: 1!
Address: 0xe7021f70
सर्च द्वारा पाए गए एड्रेस पर निर्दिष्ट मान लिखें।
> patch 10
...
Successfully patched!
लक्ष्य प्रोसेस खोजें और यदि केवल एक है, तो उसे लक्ष्य के रूप में निर्दिष्ट करें। ps स्टार्टअप पर स्वचालित रूप से चलता है।
> ps
Package: jp.sterrasec.tap1000000, PID: 4398
Target PID has been set to 4398.
यदि ps द्वारा लक्ष्य pid सेट किया गया है, तो लक्ष्य प्रोसेस से अटैच करें, ptrace द्वारा ऐप में सभी प्रोसेस को रोकें।
> attach
Target PID: 4398
Attached TID: 4398
Attached TID: 4405
Attached TID: 4407
Attached TID: 4408
Attached TID: 4410
Attached TID: 4411
Attached TID: 4412
Attached TID: 4413
Attached TID: 4414
Attached TID: 4415
Attached TID: 4418
Attached TID: 4420
Attached TID: 4424
Attached TID: 4429
Attached TID: 4430
Attached TID: 4436
Attached TID: 4437
Attached TID: 4438
Attached TID: 4439
Attached TID: 4440
Attached TID: 4441
Attached TID: 4442
यदि लक्ष्य pid सेट नहीं है, तो इसे कमांड लाइन पर निर्दिष्ट किया जा सकता है।
> attach <pid>
अटैच की गई प्रोसेस से डिटैच करें।
> detach
Detached TID: 4398
Detached TID: 4405
Detached TID: 4407
Detached TID: 4408
Detached TID: 4410
Detached TID: 4411
Detached TID: 4412
Detached TID: 4413
Detached TID: 4414
Detached TID: 4415
Detached TID: 4418
Detached TID: 4420
Detached TID: 4424
Detached TID: 4429
Detached TID: 4430
Detached TID: 4436
Detached TID: 4437
Detached TID: 4438
Detached TID: 4439
Detached TID: 4440
Detached TID: 4441
Detached TID: 4442
hexdump की तरह मेमोरी डंप प्रदर्शित करें।