如何解决如何使用Frida操纵Native Android应用的静态变量?
为了练习Frida,我制作了一个简单的Unity应用,并通过Il2cppInspector转储了apk以获取所有偏移量。 到目前为止,我设法拦截函数,篡改其参数和返回值,我还可以通过将字段的偏移量添加到类的实例中来获取和设置非静态字段(实例变量)的值。
转储的文件包含符号和偏移量:
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
}
我可以使用简单的Frida脚本轻松控制 aa 和 bb 值:
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 的值。经过研究后,我发现静态变量位于数据段中,因此我使用IDA打开libil2cpp.so并浏览了.bss和.data段。但是我仍然碰壁,因为在共享库中查找偏移量并不是一件容易的事,而且我对IDA Pro也不熟悉。
那么,如何像我对非静态字段那样进行访问和操作静态字段(计算偏移量)?而且有什么办法只能使用Frida吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。