MASTG-TECH-0042: Recuperando Classes e Métodos Carregados Dinamicamente
Você pode usar o comando Java no Frida CLI para acessar o runtime Java e recuperar informações do aplicativo em execução. Lembre-se de que, diferentemente do Frida para iOS, no Android você precisa encapsular seu código dentro de uma função Java.perform. Por isso, é mais conveniente usar scripts do Frida para, por exemplo, obter uma lista de classes Java carregadas e seus respectivos métodos e campos, ou para coletas de informações ou instrumentações mais complexas. Um desses scripts é listado abaixo. O script para listar os métodos de classe utilizado a seguir está disponível no Github.
// Obter lista de classes e métodos Java carregados
// Nome do arquivo: java_class_listing.js
Java.perform(function() {
Java.enumerateLoadedClasses({
onMatch: function(className) {
console.log(className);
describeJavaClass(className);
},
onComplete: function() {}
});
});
// Obter os métodos e campos
function describeJavaClass(className) {
var jClass = Java.use(className);
console.log(JSON.stringify({
_name: className,
_methods: Object.getOwnPropertyNames(jClass.__proto__).filter(function(m) {
return !m.startsWith('$') // filtrar propriedades especiais relacionadas ao Frida
|| m == 'class' || m == 'constructor' // opcional
}),
_fields: jClass.class.getFields().map(function(f) {
return( f.toString());
})
}, null, 2));
}
Após salvar o script em um arquivo chamado java_class_listing.js, você pode instruir o Frida CLI a carregá-lo usando a flag -l e injetá-lo no ID do processo especificado por -p.
frida -U -l java_class_listing.js -p <pid>
// Saída
[Huawei Nexus 6P::sg.vantagepoint.helloworldjni]->
...
com.scottyab.rootbeer.sample.MainActivity
{
"_name": "com.scottyab.rootbeer.sample.MainActivity",
"_methods": [
...
"beerView",
"checkRootImageViewList",
"floatingActionButton",
"infoDialog",
"isRootedText",
"isRootedTextDisclaimer",
"mActivity",
"GITHUB_LINK"
],
"_fields": [
"public static final int android.app.Activity.DEFAULT_KEYS_DIALER",
...
Dada a verbosidade da saída, as classes do sistema podem ser filtradas programaticamente para tornar a saída mais legível e relevante para o caso de uso.