LLDB on Mac OS X: 在内存执行时设置断点

LLDB on Mac OS X: set breakpoint on memory execution

所以,我正在调试一个非常疯狂的程序,它在运行时解密可执行代码,然后执行它。代码块大约有 2000 字节。

我知道 Windows 在 OllyDbg 我可以 select 整个块并在该内存中的任何字节被执行时设置断点。

如果代码是read/written...我不想中断...刚刚执行。

我可以在 Mac 上使用 LLDB 执行此操作吗?

一种方法是使用 lldb 对脚本的支持在整个地址范围内设置断点:

(lldb) script
>>> for a in range(0xabc000, 0xabc010):
...     lldb.target.BreakpointCreateByAddress(a)
... 

另一种方法是调用(从 lldb 命令行)mprotect() 函数以从页面(包括有问题的代码)中删除执行权限。由于您只能影响整个页面,因此这并不像您希望的那样精确。

要了解页面的当前保护是什么,您需要在另一个 shell.

中使用 vmmap -interleaved <pid> 命令

如果程序试图从不可执行的页面执行代码,它将得到一个 SIGBUSSIGSEGV 信号,lldb 通常会捕获并停止进程.

如果你想让程序执行完代码,再次将其标记为可执行,然后让它继续。当您认为执行已退出您感兴趣的页面时,您可能会使用 finish 命令或以其他方式设置断点,然后再次删除执行权限。但是,其他线程可能有机会在该时间间隔内执行您要查看的代码。

请注意,程序可能会在将代码写入页面后将页面标记为可执行,因此您需要在完成后删除执行权限。