
ferramenta de busca e patch de memória em apk depurável sem root e ndk
Apk-medit é uma ferramenta de busca e patch de memória para apk debugável sem root e ndk. Foi criada para testes de segurança em jogos móveis. Muitos jogos móveis possuem detecção de root, mas o apk-medit não requer privilégios de root, portanto a modificação de memória pode ser feita sem contornar a detecção de root.
A modificação de memória é a maneira mais fácil de trapacear em jogos, sendo um dos itens a serem verificados no teste de segurança. Existem também ferramentas de trapaça que podem ser usadas casualmente como o GameGuardian. No entanto, não havia ferramentas disponíveis para dispositivos sem root e CUI. Então eu a fiz como uma ferramenta de teste de segurança. A versão que tem como alvo aplicativos iOS é sterrasec/ipa-medit.
Este é um demo que usa o apk-medit para zerar um jogo que requer um milhão de toques para ser zerado.


Baixe o binário de GitHub Releases e envie o binário para /data/local/tmp/ em um dispositivo android.
$ adb push medit /data/local/tmp/medit
medit: 1 file pushed. 29.0 MB/s (3135769 bytes in 0.103s)
Você pode compilar com o comando make. Requer um compilador Go.
Após a compilação, se o adb estiver conectado, ele envia o binário compilado para /data/local/tmp/ em um dispositivo android.
$ 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)
Use o comando run-as para ler arquivos usados pelo aplicativo alvo, portanto o apk-medit só pode ser usado com aplicativos que tenham o atributo debugável ativado.
Para ativar o atributo debugável, abra AndroidManifest.xml e adicione o seguinte atributo xml no nó application:
android:debuggable="true"
Você também pode usar sterrasec/apkutil para ativar facilmente o atributo debugável sem editar AndroidManifest.xml, é útil.
$ apkutil debuggable <target-apk-name>.apk
Após executar o comando run-as, o diretório é alterado automaticamente. Então copie medit de /data/local/tmp/.
Executar medit inicia um prompt interativo.
$ adb shell
$ pm list packages # to check <target-package-name>
$ run-as <target-package-name>
$ cp /data/local/tmp/medit ./medit
$ ./medit
Você também pode optar por não usar ptrace ao escrever na memória. Isso evita a detecção de depurador pelo ptrace, mas não funciona no Android 10 ou superior devido ao SELinux.
$ ./medit -without-ptrace
Aqui estão os comandos disponíveis em um prompt interativo.
Pesquisa o inteiro especificado na memória.
> 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
Você também pode especificar o tipo de dado como string, word, dword, qword.
> find dword 999996
Search Double Word...
Target Value: 999996([60 66 15 0])
Found: 1!
Address: 0xe7021f70
Filtra resultados de pesquisa anteriores que correspondem aos resultados atuais.
> filter 993881
Check previous results of searching dword...
Target Value: 993881([89 42 15 0])
Found: 1!
Address: 0xe7021f70
Escreve o valor especificado no endereço encontrado pela pesquisa.
> patch 10
...
Successfully patched!
Encontra o processo alvo e, se houver apenas um, especifica-o como alvo. ps é executado automaticamente na inicialização.
> ps
Package: jp.sterrasec.tap1000000, PID: 4398
Target PID has been set to 4398.
Se o pid alvo for definido pelo ps, anexa ao processo alvo, interrompe todos os processos do aplicativo via 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
Se o pid alvo não estiver definido, pode ser especificado na linha de comando.
> attach <pid>
Desanexa do processo anexado.
> 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
Exibe dump de memória como hexdump.
> 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|
...
#### exit
Para sair do medit, use o comando `exit` ou `Ctrl-D`.
exit Bye!
## Teste
Você pode executar os códigos de teste com o comando make.
$ make test
## Licença
MIT License