美文网首页
动态调试MachO文件物理地址

动态调试MachO文件物理地址

作者: 小狼_zy | 来源:发表于2018-05-07 10:52 被阅读0次

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

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

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

    在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)案例

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

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

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

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

    $ b -a 0x10DB78CAF

    $x 0x10DB78CAF

    总结:

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

    相关文章

      网友评论

          本文标题:动态调试MachO文件物理地址

          本文链接:https://www.haomeiwen.com/subject/jjhmrftx.html