这个_mh_execute_header到底是个啥东东?


#1

最近逆向个程序,
我设置一个断点,如:
(lldb) b 0x70150
Breakpoint 1: where = xxx`_mh_execute_header + 152048, address = 0x00070150

我又image list -o -f
[ 0] 0x00040000 /Applications/xxx.app/xxx(0x0000000000044000)

那么0x70150-0x00040000=0x30150 这个值是此处代码的相对偏移。
但这个值0x30150 不等于152048的十六进制,也就是说xxx_mh_execute_header不等于基地址的值,那么这个xxx_mh_execute_header到底是个啥东西,跟基地址you啥关系?


#2

就是macho头部的地址


#3

主要作用是作为一个符号允许可执行文件里的源码访问自己的头部地址。这里的话是因为没有其他可用符号所以使用这个头部的地址作为基地址+偏移用于显示指令地址


#4
(lldb) b 0x70150
Breakpoint 1: where = xxx`_mh_execute_header + 152048, address = 0x00070150

你的指令的意思是在内存地址0x70150下断点。
lldb的提示是告诉你确认一下,我在二进制的头部+152048偏移处下了断点,这个地方在内存里的地址是0x70150


#5

张总大人,帅帅张总,如果从崩溃日志中找到崩溃点,比如xxx`_mh_execute_header + 152048,那我怎么找到相对于lldb时,下断点要用的那个偏移量呢?


#7

张总,请赐教【抱大腿】


#8

在LLDB下 基地址 + 152048 断点试试?


#9

不对啊,断不下来


#10

利用mach-o查看mh_execute_header 地址,然后再加上152048转成16进制的和就是你要下断点的地址