Frida调试il2cpp的程序打印原生c#对象为json

        主要的思路是,输入一个对象,那么使用反射的GetType,  然后使用type的GetFields, 拿到Field的列表,然后遍历field列表。 

      需要配合il2cpp原来程序里的一些json序列化的工具来进行,一般都可以找到,如下面的。MiniJSON.Json,像这个 Serialize到运行时对象就不行了。

// Namespace: MiniJSON
public static class Json // TypeDefIndex: 13713
{
	// Methods

	// RVA: 0x151A02C Offset: 0x151A02C VA: 0x151A02C
	public static object Deserialize(string json) { }

	// RVA: 0x151A1D4 Offset: 0x151A1D4 VA: 0x151A1D4
	public static string Serialize(object obj) { }
}

Field是一个抽象类的,这里我使用 RuntimeFieldInfo : RtFieldInfo里面的函数来实现。代码如下。

function dumpCsObject(base_addr , obj,MiniJsonSerialize)
{


    var GetType = new NativeFunction(ptr(base_addr).add(0x26433E8), "pointer", ["pointer"]);




    var GetFields = new NativeFunction(ptr(base_addr).add(0x261D450), "pointer", ["pointer"]);

    var t = GetType(obj);

    var fields = GetFields(t);


    var num = fields.add(0x18).readU64();
    var szRet = "{";
     for(var i=0;i<num;i++)
     {
        var FieldInfo = ptr(fields).add(0x20+i*8).readPointer();


        var GetValue = new NativeFunction(ptr(base_addr).add(0x25603F8), "pointer", ["pointer","pointer"]);

        var val = GetValue(FieldInfo,obj);

        var pVal= MiniJsonSerialize(val);
        var szJson = ptr(pVal).add(0x14).readUtf16String();
       var fn = FieldInfo.add(0x20).readPointer().add(0x14).readUtf16String();
        szRet = szRet + fn + ":" + szJson;
        if(num-1!=i)
        {
            szRet = szRet + ",";
        }

     }
     szRet = szRet + "}"

     return szRet;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值