MASTG-TECH-0045: Runtime de Engenharia Reversa
A engenharia reversa em tempo de execução pode ser vista como a versão dinâmica da engenharia reversa, onde você não tem os dados binários em seu computador host. Em vez disso, você os analisa diretamente da memória do aplicativo.
Continuaremos usando o aplicativo HelloWorld JNI, abra uma sessão com r2frida r2 frida://usb//sg.vantagepoint.helloworldjni e você pode começar exibindo as informações do binário alvo usando o comando :i:
[0x00000000]> :i
arch arm
bits 64
os linux
pid 13215
uid 10096
objc false
runtime V8
java true
cylang false
pageSize 4096
pointerSize 8
codeSigningPolicy optional
isDebuggerAttached false
cwd /
dataDir /data/user/0/sg.vantagepoint.helloworldjni
codeCacheDir /data/user/0/sg.vantagepoint.helloworldjni/code_cache
extCacheDir /storage/emulated/0/Android/data/sg.vantagepoint.helloworldjni/cache
obbDir /storage/emulated/0/Android/obb/sg.vantagepoint.helloworldjni
filesDir /data/user/0/sg.vantagepoint.helloworldjni/files
noBackupDir /data/user/0/sg.vantagepoint.helloworldjni/no_backup
codePath /data/app/sg.vantagepoint.helloworldjni-1/base.apk
packageName sg.vantagepoint.helloworldjni
androidId c92f43af46f5578d
cacheDir /data/local/tmp
jniEnv 0x7d30a43c60
Pesquise todos os símbolos de um determinado módulo com :is <lib>, por exemplo :is libnative-lib.so.
[0x00000000]> :is libnative-lib.so
[0x00000000]>
Que estão vazios neste caso. Alternativamente, você pode preferir analisar as importações/exportações. Por exemplo, liste as importações com :ii <lib>:
[0x00000000]> :ii libnative-lib.so
0x7dbe1159d0 f __cxa_finalize /system/lib64/libc.so
0x7dbe115868 f __cxa_atexit /system/lib64/libc.so
E liste as exportações com :iE <lib>:
[0x00000000]> :iE libnative-lib.so
0x7d1c49954c f Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI
Para binários grandes, é recomendado redirecionar a saída para o programa interno less anexando
~.., ou seja,:ii libandroid_runtime.so~..(caso contrário, para este binário, você obteria quase 2500 linhas impressas no seu terminal).
A próxima coisa que você pode querer ver são as classes Java atualmente carregadas:
[0x00000000]> :ic~sg.vantagepoint.helloworldjni
sg.vantagepoint.helloworldjni.MainActivity
Liste os campos da classe:
[0x00000000]> :ic sg.vantagepoint.helloworldjni.MainActivity~sg.vantagepoint.helloworldjni
public native java.lang.String sg.vantagepoint.helloworldjni.MainActivity.stringFromJNI()
public sg.vantagepoint.helloworldjni.MainActivity()
Note que filtramos pelo nome do pacote, pois esta é a MainActivity e inclui todos os métodos da classe Activity do Android.
Você também pode exibir informações sobre o carregador de classes:
[0x00000000]> :icL
dalvik.system.PathClassLoader[
DexPathList[
[
directory "."]
,
nativeLibraryDirectories=[
/system/lib64,
/vendor/lib64,
/system/lib64,
/vendor/lib64]
]
]
java.lang.BootClassLoader@b1f1189dalvik.system.PathClassLoader[
DexPathList[
[
zip file "/data/app/sg.vantagepoint.helloworldjni-1/base.apk"]
,
nativeLibraryDirectories=[
/data/app/sg.vantagepoint.helloworldjni-1/lib/arm64,
/data/app/sg.vantagepoint.helloworldjni-1/base.apk!/lib/arm64-v8a,
/system/lib64,
/vendor/lib64]
]
]
Em seguida, imagine que você está interessado no método exportado por libnative-lib.so 0x7d1c49954c f Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI. Você pode navegar para esse endereço com s 0x7d1c49954c, analisar essa função af e imprimir 10 linhas de sua desmontagem pd 10:
[0x7d1c49954c]> pdf
;-- sym.fun.Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI:
╭ (fcn) fcn.7d1c49954c 18
│ fcn.7d1c49954c (int32_t arg_40f942h);
│ ; arg int32_t arg_40f942h @ x29+0x40f942
│ 0x7d1c49954c 080040f9 ldr x8, [x0]
│ 0x7d1c499550 01000090 adrp x1, 0x7d1c499000
│ 0x7d1c499554 21801591 add x1, x1, 0x560 ; hit0_4
│ 0x7d1c499558 029d42f9 ldr x2, [x8, 0x538] ; [0x538:4]=-1 ; 1336
│ 0x7d1c49955c 4000 invalid
Note que a linha marcada com ; hit0_4 corresponde à string que encontramos anteriormente: 0x7d1c499560 hit0_4 Hello from C++.
Para saber mais, consulte a wiki do r2frida.