Как управлять статическими переменными родного приложения для Android с помощью Frida?

#android #native #reverse-engineering #instrumentation #frida

#Android #родной #обратная разработка #инструментарий #фрида

Вопрос:

Чтобы практиковать Frida, я создал простое приложение Unity и сбросил apk через Il2cppInspector, чтобы получить все смещения. Пока мне удалось перехватить функцию, изменить ее аргументы и возвращаемое значение, я также могу получить и установить значение нестатических полей (переменных экземпляра), добавив смещение поля к экземпляру класса.

Сброшенный файл содержит символы и смещения:

 public class GameManager : MonoBehaviour // TypeDefIndex: 2195
{
    // Fields
    public static int a; // 0x00
    public static int b; // 0x04
    public int aa; // 0x10
    public int bb; // 0x14

    // Constructors
    public GameManager(); // 0x00666D88-0x00666E00
    static GameManager(); // 0x00666E00-0x00666E00

    // Methods
    private void Start(); // 0x006663F4-0x00666470
    public void ShowNonStatic(); // 0x006668B0-0x006668B8
    public void ShowNonStaticByGet(); // 0x00666944-0x006669C0
    public int GetNonStaticVal(int val); // 0x006668B8-0x00666944
    public void ShowStatic(); // 0x006669C8-0x00666AC0
    public void ShowStaticByGet(); // 0x00666B5C-0x00666CD4
    public int GetStaticVal(int val); // 0x00666CD4-0x00666D88
}
  

Я могу легко управлять значениями aa и bb с помощью простого скрипта Frida:

 Module.ensureInitialized('libil2cpp.so');
const il2cpp = Module.findBaseAddress('libil2cpp.so');

Interceptor.attach(il2cpp.add('0x006668B0'), { // offset of ShowNonStatic()
    onEnter: function (args) {
        console.log('ShowNonStatic is called!');
        this.instance = args[0]; // args[0] is the ptr to instance of class GameManager
        var aa = this.instance.add('0x10'); // instance   offset of int aa
        var bb = this.instance.add('0x14'); // instance   offset of int bb
        // get value
        console.log('Value of aa is: ', aa.readInt());
        console.log('Value of bb is: ', bb.readInt());
        // set value
        console.log('aa is changed to: ', aa.writeInt(999)); // set aa = 999
        console.log('bb is changed to: ', bb.writeInt(000)); // set bb = 000
    }
})
  

Но, AFAIK, статические переменные не являются частью экземпляра класса, поэтому я не могу использовать описанную выше реализацию для изменения или чтения значений a, b . После некоторых исследований я обнаружил, что статические переменные расположены в сегменте данных, поэтому я открыл libil2cpp.so с помощью IDA и просмотрел сегмент .bss и .data. Но я все равно попал в тупик, поскольку поиск смещений внутри общей библиотеки не является тривиальной задачей, и я также не знаком с IDA Pro.

Итак, как получить доступ к статическим полям и манипулировать ими, как я делал с нестатическими (вычислить смещение)? И есть ли какой-либо способ сделать это только с помощью Frida?

Комментарии:

1. взгляните @ github.com/iddoeldor/mplus

2. ну, я пытался использовать Mplus в течение нескольких лет, как в Windows, так и в Mac, но я не смог заставить его работать. Ваш проект потрясающий, интересно, может ли он поддерживать Il2cpp или только для Mono? Поскольку я всегда получаю одну и ту же ошибку при использовании его с приложением на основе Il2cpp, должен ли я выдать эту ошибку на Github или опубликовать ее здесь?

3. Ну .. я не смотрел на il2cpp, поэтому вставьте его сюда