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

devtools/2025/1/16 11:50:01/

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

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

// Namespace: MiniJSON
public static class Json // TypeDefIndex: 13713
{// Methods// RVA: 0x151A02C Offset: 0x151A02C VA: 0x151A02Cpublic static object Deserialize(string json) { }// RVA: 0x151A1D4 Offset: 0x151A1D4 VA: 0x151A1D4public 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;}


http://www.ppmy.cn/devtools/150937.html

相关文章

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(一)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(一) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

3 生成器(Builder)模式

生成器模式 1.1 分类 &#xff08;对象&#xff09;创建型 1.2 提出问题 构造一个房屋&#xff0c;需要考虑是否有车库&#xff0c;游泳池&#xff0c;花园&#xff0c;雕塑等&#xff0c;需要对诸多成员变量进行初始化工作。都写在构造函数里&#xff1f;每种可能都创建一…

Python自学 - 标准库介绍

<< 返回目录 1 Python自学 - 标准库介绍 标准库是安装Python时自带的一些模块集合&#xff0c;集成了丰富的功能&#xff0c;避免用户反复造轮子&#xff0c;这极大的提高了生产效率&#xff01; 1.1 几种常用的标准库 1.1.1 os 模块 提供了与操作系统交互的接口&…

java_抽象类最佳实践-模板设计模式

基本介绍 模板设计模式可解决的问题 最佳实践 Template类 package com.hspedu.abstract_; abstract public class Template { //抽象类-模板设计模式public abstract void job();//抽象方法public void calculateTime() {//实现方法&#xff0c;调用 job 方法//得到开始的时间…

线程池底部工作原理

线程池内部是通过线程和队列实现的&#xff0c;当我们通过线程池处理任务时&#xff1a; 如果线程池中的线程数量小于corePoolSize&#xff0c;无论是否有处于空闲的线程&#xff0c;都创建新的线程来处理被添加的任务。 如果线程池中的线程数量等于corePoolSize&#xff0c;…

ros2笔记-6.2 使用urdf创建机器人模型

本节主要跟着小鱼老师的视频操作&#xff0c;不同的仿真平台有不同的建模语言&#xff0c;但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…

线程间通信

线程间通信&#xff08;Inter-Thread Communication, 简称ITC&#xff09;是指在多线程编程中&#xff0c;不同线程之间如何交换信息或协调彼此的行为。良好的线程间通信机制是构建高效、可靠的并发程序的关键。Java语言提供了多种内置工具和库来支持线程间的通信&#xff0c;包…

0098__Windbg调试dump文件

Windbg调试dump文件_windbg怎样调试dmp文件-CSDN博客