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.