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

时间:2015-06-02 04:52:17

标签: macos llvm lldb mach-o

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

我在Windows上知道OllyDbg我可以选择整个块并设置一个断点,如果该内存中的任何字节都被执行了。

如果代码被读/写,我就不想破解......只是执行了。

我可以在Mac上使用LLDB吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

要了解页面的当前保护,您需要在另一个shell中使用vmmap -interleaved <pid>命令。

如果程序试图从不可执行的页面执行代码,它将获得SIGBUSSIGSEGV信号,lldb通常会捕获并停止进程。< / p>

如果您想允许程序执行代码,请再次将其标记为可执行文件,然后继续执行。您可以使用finish命令或在您认为执行退出您感兴趣的页面时在某个时刻设置断点,然后再次删除执行权限。但是,其他线程可能有机会执行您在该间隔期间尝试观察的代码。

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