#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, поэтому вставьте его сюда