
Speicher-Such- und Patch-Tool für debuggbare APK ohne Root und NDK
Apk-medit ist ein Werkzeug zum Durchsuchen und Patchen des Speichers von debuggable APKs ohne Root und NDK. Es wurde für Sicherheitstests von Mobile Games entwickelt. Viele Mobile Games verfügen über Root-Erkennung, aber apk-medit benötigt keine Root-Rechte, sodass Speicheränderungen ohne Umgehung der Root-Erkennung durchgeführt werden können.
Die Speicheränderung ist der einfachste Weg, um in Spielen zu betrügen, und gehört zu den Punkten, die bei einem Sicherheitstest überprüft werden. Es gibt auch Cheat-Tools, die man beiläufig verwenden kann, wie GameGuardian. Es gab jedoch keine Tools für Nicht-Root-Geräte und CUI. Also habe ich es als Sicherheitstest-Tool erstellt. Die Version für iOS-Apps ist sterrasec/ipa-medit.
Dies ist eine Demo, die apk-medit verwendet, um ein Spiel zu meistern, das eine Million Taps zum Meistern erfordert.


Laden Sie die Binärdatei von GitHub Releases herunter und übertragen Sie die Binärdatei nach /data/local/tmp/ auf einem Android-Gerät.
Binärdateien werden für arm64 (physische Geräte) und amd64 (x86_64-Android-Emulatoren, z. B. auf Windows-PCs) bereitgestellt. Prüfen Sie die ABI Ihres Geräts mit 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)
Sie können mit dem make-Befehl bauen. Es erfordert einen Go-Compiler.
Nach Abschluss des Builds wird die erstellte Binärdatei, falls adb verbunden ist, nach /data/local/tmp/ auf einem Android-Gerät übertragen.
$ 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)
Um für einen x86_64-Android-Emulator zu bauen, verwenden Sie stattdessen das Ziel 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"
Unter Windows 10 Cmd und PowerShell verschiebt sich das immer sichtbare Befehlsbeschreibungsfeld nach oben und verdeckt die Eingabeaufforderung (#37).
Wenn medit eine Windows-ähnliche Konsole erkennt (ein natives Windows-Build oder TERM leer/dumb), gibt es die Befehlsliste einmal beim Start aus und deaktiviert das Live-Panel stattdessen; Tab vervollständigt weiterhin Befehlsnamen.
APK_MEDIT_LIVE_HELP=1 / 0 erzwingt das Live-Panel ein- oder auszuschalten.APK_MEDIT_WINDOWS_CONSOLE=1 / 0 überschreibt die Konsolenerkennung.Verwenden Sie den Befehl run-as, um Dateien zu lesen, die von der Ziel-App verwendet werden, sodass apk-medit nur mit Apps verwendet werden kann, bei denen das debuggable-Attribut aktiviert ist.
Um das debuggable-Attribut zu aktivieren, öffnen Sie AndroidManifest.xml und fügen Sie das folgende XML-Attribut im application-XML-Knoten hinzu:
android:debuggable="true"
Sie können auch sterrasec/apkutil verwenden, um das debuggable-Attribut einfach zu aktivieren, ohne AndroidManifest.xml zu bearbeiten; das ist nützlich.
$ apkutil debuggable <target-apk-name>.apk
Nach dem Ausführen des Befehls run-as wird das Verzeichnis automatisch geändert. Kopieren Sie also medit aus /data/local/tmp/.
Das Ausführen von medit startet eine interaktive Eingabeaufforderung.
$ adb shell
$ pm list packages # to check <target-package-name>
$ run-as <target-package-name>
$ cp /data/local/tmp/medit ./medit
$ ./medit
Sie können auch wählen, ptrace beim Schreiben in den Speicher nicht zu verwenden. Dies vermeidet die Debugger-Erkennung durch ptrace, funktioniert jedoch aufgrund von SELinux nicht unter Android 10 oder höher.
$ ./medit -without-ptrace
Hier sind die in einer interaktiven Eingabeaufforderung verfügbaren Befehle.
Durchsucht den Speicher nach der angegebenen Ganzzahl.
> 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
Sie können auch einen Datentyp wie string, word, dword, qword angeben.
> find dword 999996
Search Double Word...
Target Value: 999996([60 66 15 0])
Found: 1!
Address: 0xe7021f70
Filtert vorherige Suchergebnisse, die mit den aktuellen Suchergebnissen übereinstimmen.
> filter 993881
Check previous results of searching dword...
Target Value: 993881([89 42 15 0])
Found: 1!
Address: 0xe7021f70
Schreibt den angegebenen Wert an die durch die Suche gefundene Adresse.
> patch 10
...
Successfully patched!
Findet den Zielprozess und legt ihn, falls nur einer vorhanden ist, als Ziel fest. ps wird beim Start automatisch ausgeführt.
> ps
Package: jp.sterrasec.tap1000000, PID: 4398
Target PID has been set to 4398.
Wenn die Ziel-PID durch ps festgelegt wurde, wird eine Verbindung zum Zielprozess hergestellt und alle Prozesse in der App per ptrace angehalten.
> 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
Wenn keine Ziel-PID festgelegt ist, kann sie in der Befehlszeile angegeben werden.
> attach <pid>
Trennt die Verbindung zum angehängten Prozess.
> 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
Zeigt einen Speicherauszug wie hexdump an.