Фрида - доступ к атрибуту класса, который имеет нужный тип - PullRequest
1 голос
/ 29 февраля 2020

У меня есть программа android, которая была запутана. И в этой программе классы имеют атрибуты с одинаковыми именами. Декомпилированный код, подобный этому

public class d implements c
{
    public int a;
    public Cache$Entry a;
    public Cache a;
    public volatile a a;
    public e a;
    public ByteArrayOutputStream a;
    public volatile AtomicBoolean a;

или код smali, подобный этому

# interfaces
.implements Le/a/x/c;
# instance fields
.field public a:I
.field public a:Lanetwork/channel/cache/Cache$Entry;
.field public a:Lanetwork/channel/cache/Cache;
.field public volatile a:Ld/a/w/a;
.field public a:Le/a/x/e;
.field public a:Ljava/io/ByteArrayOutputStream;
.field public volatile a:Ljava/util/concurrent/atomic/AtomicBoolean;  

Я создаю ловушку для одного метода asd (), и мне нужен доступ к атрибуту «a» этого класса , Но мне нужен атрибут "a" с типом "eaxe"

Java.perform(function () {
   var var_ddd = Java.use("e.a.x.d");
    var_ddd.asd.implementation = function() {
       this.asd();
       console.log("e.a.x.d.asd()",Java.cast(this.a.value,Java.use("e.a.x.e")));
    };
});

Когда я пытаюсь написать this.a.value - я получаю неправильный атрибут. Когда я пишу Java .cast (this.a.value, Java .use ("eaxe")), я получаю сообщение

TypeError: cannot read property 'hasOwnProperty' of undefined

Пожалуйста, скажите мне, как получить правильный атрибут с правильным тип

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Благодаря Роберту, решение было найдено. Код внес незначительные исправления

var lo_fld_eaxe;
var lv_found = false;
var lt_fields = this.getClass().getDeclaredFields();
for (var i = 0; i < lt_fields.length && lv_found == false; i++) {
    if(lt_fields[i].getName().toString() == 'a' &&  lt_fields[i].getType().getName().toString() == 'e.a.x.e' ){
       lo_fld_eaxe = lt_fields[i];
       lv_found = true; 
  }
}
if(lv_found == true) {
   lo_fld_eaxe.setAccessible(true);
   try{ 
          var       lv_e_a_x_e = lo_fld_eaxe.get(this);   
   }
   catch(err){
          console.log("Error:"+err);
   }
 }
0 голосов
/ 29 февраля 2020

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

Если есть имя коллизия, метод и элемент имеют то же имя, к элементу будет добавлено подчеркивание.

Но я не уверен, что эта информация все еще действительна. Текущий код моста Frida Java не похож на то, как бы он переименовал поля со встречными именами полей: https://github.com/frida/frida-java-bridge/blob/master/lib/class-factory.js#L301

Я также не вижу способа доступа к полям в Frida в путь, который не основан на его имени.

Единственный шанс, который я вижу, это получить доступ к полю через Java отражение:

const eaxe = Java.use("e.a.x.e");
for (f of eaxe.class.getDeclaredFields()) {
    if (f.getType().getName() == "e.a.x.e") {
        f.setAccessible(true);
        var fieldValue = f.get(this);
        console.log("Field of type e.a.x.e has value: " + fieldValue);
    }
}

Примечание. Приведенный выше код не был проверен в Фриде, поэтому может потребоваться дополнительная доработка перед это на самом деле работает.

...