MASTG-TECH-0035: JNI Rastreamento

Conforme detalhado em Análise de Código Nativo Desmontado, o primeiro argumento passado para cada função JNI é um ponteiro de interface JNI. Este ponteiro contém uma tabela de funções que permite ao código nativo acessar o Android Runtime. Identificar chamadas para essas funções pode auxiliar na compreensão da funcionalidade da biblioteca, como quais strings são criadas ou quais métodos Java são invocados.

O jnitrace é uma ferramenta baseada em Frida, similar ao frida-trace, que especificamente direciona o uso da API JNI do Android por bibliotecas nativas, fornecendo uma maneira conveniente de obter traces de métodos JNI, incluindo argumentos e valores de retorno.

Você pode instalá-lo facilmente executando pip install jnitrace e executá-lo diretamente da seguinte forma:

jnitrace -l libnative-lib.so sg.vantagepoint.helloworldjni

A opção -l pode ser fornecida múltiplas vezes para traçar várias bibliotecas, ou * pode ser fornecido para traçar todas as bibliotecas. No entanto, isso pode gerar uma grande quantidade de saída.

Na saída, você pode ver o trace de uma chamada para NewStringUTF feita a partir do código nativo (seu valor de retorno é então devolvido ao código Java; consulte Análise de Código Nativo Desmontado para mais detalhes). Observe como, de forma similar ao frida-trace, a saída é colorida, ajudando a distinguir visualmente as diferentes threads.

Ao traçar chamadas da API JNI, você pode ver o ID da thread no topo, seguido pela chamada do método JNI, incluindo o nome do método, os argumentos de entrada e o valor de retorno. No caso de uma chamada a um método Java a partir do código nativo, os argumentos do método Java também serão fornecidos. Por fim, o jnitrace tentará usar a biblioteca de backtracing do Frida para mostrar de onde a chamada JNI foi originada.

Para saber mais sobre todas as opções de uso avançado, consulte a documentação na página do jnitrace no GitHub.