根据MachO文件结构获取类方法

.工具
1. demo一枚
2. MachoView(建议从git上下载下来自己编译再运行, 我测试从官网下载可执行文件下来的分析完会有闪退的情况)

.分析
首先我们将自己准备好的demo拖入到MachoView中 分析v7的结构(arm64类似, v7地址短 看的简短一点儿)


__object_classname和__object_classname 区段中分别存储的是类名和函数名. 使用MachohView查看的话, 可以暂时不管他.我们从关键的地方看.

__objc_classlist中存储的就是类对应的表信息.
首先我们来分析VCRoot这个类. 可以看到其在文件中对应的偏移为0xC228, 其值为0xCBAC. 这个0xCBAC值对应的位置就是我们要找的详细的类信息.

接着我们根据这个0xCBAC值在__objc_data中寻找.0xCBAC对应的表.


可以看到该结构指向的是一个结构体. 结构体为
typedef struct objc_class{
unsigned long long isa;
unsigned long long wuperclass;
unsigned long long cache;
unsigned long long vtable;
unsigned long long data;
unsigned long long reserved1;
unsigned long long reserved2;
unsigned long long reserved3;
}objc_class;

这里我们可以根据SuperClass获取到该类的父类是UIViewController.

其中Data地址的数据就是我们想要的类信息的数据信息. 我们记录下0xC40C地址.
接着我们去__objc_const段查看类的信息.

这里也是一个类信息的结构体.我来讲讲最重要的几个.
Base Methods: 保存着类中的函数信息对应的结构体.
Base Properties: 保存着类中数据成员变量对应的结构体.

我们先去看下函数的结构体, 这里可以看到函数的结构体对应的位置在0xC298.
同样是在const段, 我们可以找到Method List: 0xC298

Entry Size对应的是每个函数的结构大小.
Count对应的是该类中含有多少个函数.
接下来12字节就是函数的信息. (这里 v8@0:4还未搞清楚, 应该就是参数的问题.可以多写点儿类型进行测试)

这里函数的信息搞明白了 我们来看变量的. 查看Base Properties可以知道其对应的地址在0xC3EC处.

其结构跟类信息的结构是一样的, 一眼就可以看出来.

1 个赞

你这个操作是实现了一个功能,或者说达到了一个什么目的呢?

这是入群问题。。。。。