Todas as etapas mencionadas abaixo estão no macOS Mojave
Instale frida-tools
com pip3
Execute o comando $ pip --version
e $ pip3 --version
para verificar de qual pip é o Python 3x . Por exemplo, você deve ver informações de versão como abaixo:
$ pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
Em seguida, execute o comando pip correto para instalar frida-tools
, por exemplo, pip3
$ pip3 install frida-tools
Resultados de sucesso:
....
Successfully built frida-tools frida
Installing collected packages: colorama, frida, six, wcwidth, prompt-toolkit, pygments, frida-tools
Successfully installed colorama-0.4.1 frida-12.4.7 frida-tools-1.3.2 prompt-toolkit-2.0.9 pygments-2.3.1 six-1.12.0 wcwidth-0.1.7
Testando sua instalação
Copie o binário cat
para uma pasta temporária, por exemplo, /tmp/cat
e execute cat
nesse diretório:
$ mkdir ~ /frida
$ cp /bin/cat /frida/cat
$ /frida/cat
Em outro terminal, crie um arquivo example.py
com o seguinte conteúdo:
import frida
def on_message ( message , data ):
print ( "[on_message] message:" , message , "data:" , data )
session = frida . attach ( "cat" )
script = session . create_script ( """'use strict';
rpc.exports.enumerateModules = function () {
return Process.enumerateModulesSync();
};
""" )
script . on ( "message" , on_message )
script . load ()
print ([ m [ "name" ] for m in script . exports . enumerate_modules ()])
Em seguida, execute o script example.py
com o comando abaixo
$ python3 example.py
A saída deve ser algo semelhante a isto (dependendo da plataforma e das versões da biblioteca):
[ u'cat' , …, u'ld-2.15.so' ]
Comando adb
do Android
Certifique-se de que adb
possa ver seu dispositivo:
$ adb devices -l
Isso também garantirá que o daemon adb esteja sendo executado em sua área de trabalho, o que permite que Frida descubra e se comunique com seu dispositivo, independentemente de você tê-lo conectado via USB ou WiFi.
frida-server
no emulador (ou dispositivo real)As etapas abaixo são baseadas no Android Emulator Nexus 6P (x86) api 23 no macOS Majave.
Primeiro, baixe o frida-server
mais recente para Android na página de lançamentos do frida-server, por exemplo, para o emulador Android x86
, você deve baixar frida-server-12.4.7-android-x86.xz e executá-lo em seu emulador:
$ adb root # might be required
$ adb push frida-server /data/local/tmp/
$ adb shell " chmod 755 /data/local/tmp/frida-server "
$ adb shell " /data/local/tmp/frida-server & "
Para a última etapa, se você vir o erro abaixo:
Unable to load SELinux policy from the kernel: Failed to open file “/sys/fs/selinux/policy”: Permission denied
Então você precisa executar frida-server
usando o shell root, por exemplo
$ adb shell
angler:/ $ su
angler:/ # /data/local/tmp/frida-server &
[1] 12089
angler:/ #
[1] 12089
é o ID do processo de frida-server
.
Agora, na sua área de trabalho, é hora de garantir que o básico esteja funcionando. Correr:
frida-ps -U
Isso deve fornecer uma lista de processos semelhante a:
PID Name
----- ---------------------------------------------------
721 ATFWD-daemon
4450 adbd
730 [email protected]
407 [email protected]
408 [email protected]
409 [email protected]
410 [email protected]
406 [email protected]
Para adulterar um valor Boolean
dentro do código-fonte Java, ou seja, o Boolean bTamperingSucces = false;
, ou algum outro código no qual você tenha interesse.
apktool
pode ser obtido no site Apktool. Basta seguir as etapas nesta página para instalar o apktool.
adb
é fornecido com Android SDK, ele pode ser encontrado no diretório
apksigner
é assinar seu apk com um arquivo keystore. Esta ferramenta pode ser encontrada no diretório
e o uso está documentado na linha de comando apksigner.
Clone o projeto de exemplo do DecompileApk.
Encontre o arquivo apk já compilado DecompileApk/app/release/app-release.apk
.
Descompile-o usando apktool .
$ cd < your-path > /DecompileApk/app/release/
$ apktool d --no-res -f app-release.apk
Você verá as saídas abaixo
I: Using Apktool 2.4.0 on app-release.apk
I: Copying raw resources...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
Procure DecompileApk/app/release/app-release/smali/com/arophix/decompileapk/MainActivity.smali
no diretório de código smali e encontre o código abaixo
const / 4 p1 , 0x0
Basta alterar 0x0
(que significa false
) para 0x1
(que significa true
) e salvar o arquivo.
Usando o apktool para construir o apk adulterado.
apktool b app - release
Você deve ver os resultados abaixo
I: Using Apktool 2.4.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Copying raw resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
Encontre o apk recém-criado no diretório dist
DecompileApk/app/release/app-release/dist/app-release.apk
Assine o apk usando apksigner e keystore localizados em DecompileApk/app/decompileapk.jks
(modifique os caminhos para keystore e apk de acordo com seu próprio caso),
$ < ANDROID_HOME > /sdk/build-tools/28.0.3/apksigner sign --ks ../decompileapk.jks app-release.apk
Você deve ver as saídas abaixo e inserir a senha 123456
Keystore password for signer # 1:
Instale o apk assinado usando o comando adb.
$ adb install < path-to-the-tampered-apk > /app-release.apk
Em vez de ver "Hello from C++"
na tela, agora você deverá ver "Hello, Android reverse engineer!"
.
Conectando o código-fonte Android Java usando Frida.
Encontre o script em hook_java_methods.py e execute-o usando o comando abaixo e clique no botão do seu aplicativo Android iniciado.
$ python3 hook_java_methods.py
[ * ] Running CTF
[ * ] onClick
[ * ] Called - isPhoneRooted ()
[ * ] onClick
[ * ] Called - isPhoneRooted ()
Se você vir um erro como abaixo:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
Lembre-se de que você iniciou frida-server
em seu emulador.
Enquanto isso, na tela do emulador, você deverá ver a mensagem do brinde alterada para Device not rooted
se for bem-sucedido.
Conectando o código-fonte do Android C usando Frida.
Descompilar APK
Em primeiro lugar, descompile o apk usando apktool para extrair a biblioteca compartilhada, ou seja, libnative-lib.so
.
$ cd DecompileApk/app/release
$ apktool d --no-res app-release.apk
Encontre o método JNI de destino
Em segundo lugar, use o comando abaixo para encontrar a função JNI para conectar.
$ nm --demangle --dynamic app-release/lib/x86/libnative-lib.so
Você deverá ver os resultados abaixo:
00004d80 T Java_com_arophix_decompileapk_MainActivity_stringFromJNI
000090b0 T std::bad_typeid::what () const
00005cf0 T std::bad_exception::what () const
00005e70 T std::bad_array_length::what () const
00005df0 T std::bad_array_new_length::what () const
00008ff0 T std::bad_cast::what () const
...
Função Hook C por nome
Encontre o script em hooknative-by-function-name.py e execute-o usando o comando abaixo e clique no botão do seu aplicativo Android iniciado.
$ python3 hooknative-by-function-name.py
[ * ] Running Arophix Hook Test ...
Java_com_arophix_decompileapk_MainActivity_stringFromJNI called with:
ret: 0x200019
Se você vir um erro como abaixo:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
Lembre-se de que você iniciou frida-server
em seu emulador.
Enquanto isso, na tela do emulador, você deverá ver o texto alterado para Frida is hooking this displayed text from Native layer by function name.
se sucesso.
Função Hook C por endereço
Encontre o script em hooknative-by-function-address.py e execute-o usando o comando abaixo e clique no botão do seu aplicativo Android iniciado.
$ python3 hooknative-by-function-address.py
[ * ] Running Arophix Hook Test ...
[+] membase: 0xb2acd000
[+] addressOfStringFromJni: 0xb2ad1d80
[++] addressOfStringFromJni: 0xb2ad1d80
ret: 0x19
Se você vir um erro como abaixo:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
Lembre-se de que você iniciou frida-server
em seu emulador.
Enquanto isso, na tela do emulador, você deverá ver o texto alterado para Frida is hooking this displayed text from Native layer by function address.
se sucesso.