Zurück zu den Updates
New releaseSep 21, 2026

apk-medit v0.2.7

Speicher-Such- und Patch-Tool für debuggbare APK ohne Root und NDK

Teilen

apk-medit

GitHub release License: MIT typos workflow

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.

Motivation

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.

Demo

Dies ist eine Demo, die apk-medit verwendet, um ein Spiel zu meistern, das eine Million Taps zum Meistern erfordert.

Installation

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)

How to Build

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"

Usage

Windows consoles

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

Commands

Hier sind die in einer interaktiven Eingabeaufforderung verfügbaren Befehle.

find

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

filter

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

patch

Schreibt den angegebenen Wert an die durch die Suche gefundene Adresse.

> patch 10
...
Successfully patched!

ps

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.

attach

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>

detach

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

dump

Zeigt einen Speicherauszug wie hexdump an.

> dump 0xf0aee000 0xf0aee300
Address range: 0xf0aee000 - 0xf0aee300
----------------------------------------------
00000000  34 32 20 61 6e 73 77 65  72 20 28 74 6f 20 6c 69  |42 answer (to li|
00000010  66 65 20 74 68 65 20 75  6e 69 76 65 72 73 65 20  |fe the universe |
00000020  65 74 63 7c 33 29 0a 33  31 34 20 70 69 0a 31 30  |etc|3).314 pi.10|
00000030  30 33 20 61 75 64 69 74  64 20 28 61 76 63 7c 33  |03 auditd (avc|3|
00000040  29 0a 31 30 30 34 20 63  68 61 74 74 79 20 28 64  |).1004 chatty (d|
00000050  72 6f 70 70 65 64 7c 33  29 0a 31 30 30 35 20 74  |ropped|3).1005 t|
00000060  61 67 5f 64 65 66 20 28  74 61 67 7c 31 29 2c 28  |ag_def (tag|1),(|
00000070  6e 61 6d 65 7c 33 29 2c  28 66 6f 72 6d 61 74 7c  |name|3),(format||
00000080  33 29 0a 31 30 30 36 20  6c 69 62 6c 6f 67 20 28  |3).1006 liblog (|
00000090  64 72 6f 70 70 65 64 7c  31 29 0a 32 37 31 38 20  |dropped|1).2718 |
000000a0  65 0a 32 37 31 39 20 63  6f 6e 66 69 67 75 72 61  |e.2719 configura|
000000b0  74 69 6f 6e 5f 63 68 61  6e 67 65 64 20 28 63 6f  |tion_changed (co|
000000c0  6e 66 69 67 20 6d 61 73  6b 7c 31 7c 35 29 0a 32  |nfig mask|1|5).2|
000000d0  37 32 30 20 73 79 6e 63  20 28 69 64 7c 33 29 2c  |720 sync (id|3),|
000000e0  28 65 76 65 6e 74 7c 31  7c 35 29 2c 28 73 6f 75  |(event|1|5),(sou|
000000f0  72 63 65 7c 31 7c 35 29  2c 28 61 63 63 6f 75 6e  |rce|1|5),(accoun|

exit

Um medit zu beenden, verwenden Sie den Befehl exit oder Ctrl-D.

> exit
Bye!

Test

Sie können Testcodes mit dem make-Befehl ausführen.

$ make test

License

MIT License

Kategorien