Как подключить fopen с помощью Frida в Android? - PullRequest
1 голос
/ 11 июня 2019

У меня есть приложение для Android, в которое я загружаю библиотеку и в какой-то момент читаю файл. Это код, который используется в приложении.

    FILE *fp = fopen(file_name, "r");
    if (fp == NULL) {
        return res;
    }

Теперь я пытаюсь использовать Frida , чтобы перехватить это fopen, чтобы заставить его возвращать ноль, но я, похоже, не могу выяснить, как это сделать.

Библиотека, включенная в приложение, называется libnative-lib.so, и моя попытка перехвата fopen включает следующий код для frida

 Module.enumerateExports("libnative-lib.so", {                
      onMatch: function(e) {                            
          if(e.type == 'function') {
              if(e.name == "fopen") {
        console.log("Function recognized by name");
        Interceptor.attach(e.address, {       
        onEnter: function(args) {         
            console.log("Interceptor attached onEnter...");
            },                                
        onLeave: function(retval){        
            console.log("Interceptor attached onLeave...");
            }                                 
        });                                                                   
              }                   
          }                                             
      },                                                
      onComplete: function() {}                         
  }); 

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Вместо перечисления экспортов конкретной библиотеки вы можете попробовать вызвать Module.findExportByName(null, "fopen"), чтобы получить адрес fopen (аргумент null указывает frida просмотреть экспорт всех загруженных библиотек) и использовать Interceptor API так же, как вы сделали.
Это должно выглядеть примерно так:

Interceptor.attach(Module.findExportByName(null, "fopen"), {
    onEnter: function(args) {
        console.log("Interceptor attached onEnter...");
    },
    onLeave: function(args) {
        console.log("Interceptor attached onLeave...");
    }
}

Вы точно не указали, как происходит сбой кода, но чтобы убедиться, что библиотека, о которой вы говорите, действительно загружена в приложение, вы можете перечислить все загруженные модули:

Process.enumerateModules()
    .forEach(function(m) {
        // You can print just the name by using m.name or the entire system path with m.path
        console.log(JSON.stringify(m));
    });

Другим способом было бы использовать Process.enumerateModules() для поиска правильного модуля и затем вызывать enumerateExports для полученного вами объекта Module.
Это гарантирует, что вы ищете fopen в правильном модуле, если имя модуля не совсем libnative-lib.so:

Process.enumerateModules()
    .filter(function(m){ return m["path"].toLowerCase().indexOf("libnative") != -1 ; })
    .forEach(function(mod) {
        console.log(JSON.stringify(mod));
        mod.enumerateExports().forEach(function (exp) {
            if (exp.name.indexOf("fopen") != -1) {
                console.log("fopen found!");
            }
        })
    });

HTH, если это все еще не решит вашу проблему, опубликуйте дополнительную информацию в вашем вопросе.

0 голосов
/ 16 июня 2019

fopen вызовет open

Я бы предложил использовать условие, чтобы утверждать, что оно открывает ваш конкретный файл, а не заменять / переопределять.

Interceptor.attach(Module.findExportByName(null, "open"), {
  onEnter: function(args) {
    this.file_name = Memory.readCString(ptr(args[0]));
  },
  onLeave: function(retval) {
    if ("your file name" === this.file_name) // passed from onEnter
      retval.replace(0x0); // return null
  }
});

Кстати, если вы включите флаг --enable-jit, вы можете фильтровать с помощью ECMAScript6

Module.enumerateExports(moduleName).filter(ex => ex.name.includes('fopen')).forEach(ex => { .. })
...