【问题标题】:LLDB on Mac OS X: set breakpoint on memory executionMac OS X 上的 LLDB:在内存执行时设置断点
【发布时间】:2015-08-15 17:52:33
【问题描述】:

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

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

如果代码被读/写,我不想中断......只是执行。

我可以在 Mac 上使用 LLDB 吗?

【问题讨论】:

    标签: macos llvm lldb mach-o


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢,伙计!这正是我想要的。
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2013-07-27
    • 2019-05-05
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多