所以,我正在调试一个非常狂野的程序,它在运行时解密可执行代码,然后执行它。代码blob大约是2000个字节。
我在Windows上知道OllyDbg我可以选择整个块并设置一个断点,如果该内存中的任何字节都被执行了。
如果代码被读/写,我就不想破解......只是执行了。
我可以在Mac上使用LLDB吗?
答案 0 :(得分:3)
一种方法是使用lldb
支持脚本来在整个地址范围内设置断点:
(lldb) script
>>> for a in range(0xabc000, 0xabc010):
... lldb.target.BreakpointCreateByAddress(a)
...
另一种方法是调用(来自lldb
命令行)mprotect()
函数,以从页面中删除执行权限,包括相关代码。由于您只能影响整个页面,因此不如您所希望的那样精确。
要了解页面的当前保护,您需要在另一个shell中使用vmmap -interleaved <pid>
命令。
如果程序试图从不可执行的页面执行代码,它将获得SIGBUS
或SIGSEGV
信号,lldb
通常会捕获并停止进程。< / p>
如果您想允许程序执行代码,请再次将其标记为可执行文件,然后继续执行。您可以使用finish
命令或在您认为执行退出您感兴趣的页面时在某个时刻设置断点,然后再次删除执行权限。但是,其他线程可能有机会执行您在该间隔期间尝试观察的代码。
请注意,在将代码写入后,程序可能会将页面标记为可执行文件,因此您需要在执行该操作后删除执行权限。