动态调试MachO文件物理地址

在动态调试MachO文件之前,首先需了解一下什么是ASLR(Address space layout randomization)。

简单来说,ASLR是在程序运行时,为了防止内存地址被简单破解的一种防护措施。在iOS4.3之前,系统对于内存地址的分配是顺序的,这样很容易对app进行反编译。所以使用ASLR之后,app每次运行时,内存的起始地址都是不一样的,这样大大增加了反编译的困难度。

下图为MachO在内存条运行的缩略图:

动态调试MachO文件物理地址_第1张图片

在lldb中使用命令image list可获取ASLR分配的起始位置,

$image list[  0] BABA2BAC-C9FF-3C81-A194-18A723675DFC 0x000000010db72000 ~/demo.app/demo

 [  1] AFAB4EFA-7020-34B1-BBEF-0F26C6D3CA36 0x00000001120bf000 /usr/lib/dyld

 [  2] 4015E9B7-0BDE-3909-849B-54CB9DB7DDC4 0x000000010f4a2000 

...

此时,0x000000010db72000就是内存分配给此app的起始位置,每次重新启动此app,起始位置都会发生改变。

我们可以通过MachOView等工具反编译MachO文件,清楚的看到LC_SEGMENT_64的一些基本信息,下图为LC_SEGMENT_64(_TEXT)案例


动态调试MachO文件物理地址_第2张图片

File Offset表示__TEXT段在MachO文件中的偏移量,此时value为0,说明__TEXT的起始位置即是0x000000010db72000

之后再通过Section64(__TEXT,__objc_methname)  /  C String Literals可获取到每个方法的地址偏移量,如下图:


动态调试MachO文件物理地址_第3张图片

此时,viewDidLoad的地址偏移量为0x00006CAF,那它的此时在内存中的真实物理地址即是0x000000010db72000 + 0x00006CAF = 0x10DB78CAF

之后在lldb中执行 b -a 0x10DB78CAF即可在断点到viewDidLoad方法,也可使用命令x 0x10DB78CAF查看内存信息。

$ b -a 0x10DB78CAF

$x 0x10DB78CAF

总结:

我们在发布app包时,通常会启用dsYM文件,使用友盟或其他工具能够捕获异常信息,此类工具正是通过分析MachO文件及ASLR分配地址,能够获取到异常方法的地址偏移量,之后使用地址偏移量能够快速的定位到具体的方法名。

你可能感兴趣的:(动态调试MachO文件物理地址)