lldb:在实际代码的开始处中断,而不是入口点

逆向工程 调试 操作系统 数据库
2021-07-05 11:20:15

我希望 lldb 在 OS X 应用程序的实际代码开始时中断(如果符号存在,则可能称为main)。

我目前正在手动查找,但由于我想编写一些操作脚本,如果这可以以某种方式自动实现,那就太好了

在此处输入图片说明

你有什么想法吗?

2个回答

试试这个:

(lldb) break set -n main
(lldb) r
(lldb) thread backtrace

frame #0: 0x0000000000405696 app`main(argc=1, argv=...) + 22 at app.cpp:11
frame #1: 0x00007ffff7216ec5 libc.so.6`__libc_start_main + 245
frame #2: 0x0000000000401f79 app

下面(之前) main 的框架是您想要的框架,它显示了库和函数名称。您可以像其他任何人一样在其上设置断点:

(lldb) break set -n __libc_start_main
Breakpoint 1: where = libc.so.6`__libc_start_main, address = 0x00007ffff7216dd0

或者,更具体地说:

(lldb) break set -s libc.so.6 -n __libc_start_main
Breakpoint 2: where = libc.so.6`__libc_start_main, address = 0x00007ffff7216dd0

如果你知道地址,你可以直接使用它:

(lldb) break set -a 0x000000...

然后重新启动该过程,您应该立即点击它:

(lldb) r
There is a running process, kill it and restart?: [Y/n] y
...
* thread #1: ...__libc_start_main, name = 'app', stop reason = breakpoint
frame #0: 0x00007ffff7216dd0 libc.so.6`__libc_start_main
-> ...: pushq  %r14
(lldb)

尝试在错误地址上添加断点。在 GDB 中,我这样做的方式是:b *0xf00,或类似的东西。这是我在 GDB 中的样子,也许您会找到一种方法来复制相同的行为:


$ gdb ./a.out
(gdb) b *0xf00
(gdb) r
Starting program: ./a.out 
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0xf00

(gdb) x/2i $rip
=> 0x7ffff7ddb2d0 <_start>:   mov    rdi,rsp
   0x7ffff7ddb2d3 <_start+3>: call   0x7ffff7ddea70