我目前正在手工查找,但是由于我要编写一些动作脚本,因此如果能够以某种方式自动实现,那就太好了
你有办法吗?
#1 楼
试试这个:(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)
#2 楼
尝试在错误的地址上添加断点。在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
评论
噢,我想我误解了这个问题。尽管如此,这是一个方便的技巧:-P也许您可以找出main之前是否存在已知的入口点,例如__libc_start_main。您可能会发现,有一种半破解的方法可以在相对于入口点具有固定的,可预测的偏移量的地址处添加断点。
– Peter Goodman
2014年11月28日0:32
感谢您的回答:)我的问题是,我希望使用可编写脚本的工作流程。当然,我可以寻找某种主电源,但这不一定存在。
–马夫
2014年11月28日上午10:06