如何对MachO文件进行内存调试

2023-02-27  本文已影响0人  song91425

| 导语 本文主要介绍如何打内存断点进入第三方的MachO文件,必备工具协助工具MachOView、Hopper

1 MachOView和Hopper解析后的效果图

image.png image.png

2 如何查看MachO文件的虚拟内存大小

通过MachOView的VM size字段可以查看虚拟内存的大小,如下图所示,虚拟内存大小为42949674296(十进制) = 4G(2^32),对应的16进制为:0x100000000

image.png

3 MachOView和Hopper的地址的差别

在MachOView文件中Offset和pFile字段表示的该地址相对MachO文件的偏移,它们需要加上VM Size才是真正的虚拟地址,Hopper解析后地址直接是虚拟地址。它们2个的关系为:

Hopper = offset/pFile + VM size

4 如何找到某个方法在运行的时候对应的内存地址

以下面这段代码为例

-(void)eatWithObject:(NSString *)objc{
    NSLog(@"吃到了%@",objc);
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self eatWithObject:@"汉堡!"];
}

通过Hopper查看上面代码对应的MachO文件,如下图:eatWithObject在MachO文件的虚拟内存为:0x0000000100005ea4,相对MachO文件的偏移为:0x0000000100005ea4 - 0x100000000 = 5ea4

image.png

4.1 如何查看MachO文件在内存中的物理地址

通过命令:image list 可以查看加载MachO文件在内存中的物理地址,如下图,MachO文件在内存的地址是:0x00000001024d8000

image.png

4.2 eatWithObject:方法的物理内存地址

image.png

5 ASLR:地址空间配置随机

image.png

6 通过某个物理地址,查找MachO文件的虚拟地址

通过公式ASLR = 物理地址 - 虚拟地址 ,所以假设我们知道某个对象的物理地址,就可以反推出这个对象在MachO文件中的虚拟地址。

测试:

定义int a = 10;的全局变量

image.png

7 实操一下第三方的MachO文件

最近在学习逆向开发,下面实操一下微信的MachO文件的内存断点设置。

步骤1:通过解析微信页面的元素,找到action对应的方法名:showFileManagerWindow:

步骤2:通过Hopper查找showFileManagerWindow:如下图所示,选取第一行的地址:0x0000000101271fec,Hopper里的地址是虚拟地址

image.png

步骤3:计算ASLR,通过image list命令可以得到此次运行的MachO文件的物理地址,如下图所示,则ASLR = 0x0000000106d98000 - 0x100000000 = 0x6d98000

image.png

步骤4:计算步骤二在运行的时候对应的物理地址 = ASLR + 虚拟地址 = 0x0000000101271fec + 0x6d98000 = 0x108009FEC

步骤5:通过命令对地址0x108009FEC设置断点b -a 0x108009FEC,结果如下图所示

image.png

步骤6:测试点击文件图标,能够正确触发步骤5设置的断点,结果如下图

image.png image.png

总结

本文介绍了如何计算MachO文件在内存中的物理地址和如何下内存断点,这是在逆向开发中必须掌握的方法,此文的目的主要是当做自己的笔记,仅供参考。

遗留问题:此文还有一个遗留问题是如何调试汇编,这个在学习中,后续在写一篇笔记记录如何调试汇编。

上一篇 下一篇

猜你喜欢

热点阅读