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.