4

是否可以运行一个进程gdb,修改一些内存,然后再detach从该进程中运行?

在执行第一条指令之前,我无法从外部启动该过程,gdb因为我需要修改内存。

当你detach从一个以 , 开头的进程开始时gdbgdb会挂起,但从gdb另一个进程中杀掉会使被调试的进程仍在运行。

我目前使用以下脚本来启动该过程:

echo '# custom gdb function that finds the entry_point an assigns it to $entry_point_address
entry_point
b *$entry_point_address
run
set *((char *)0x100004147) = 0xEB
set *((char *)0x100004148) = 0xE2
detach # gdb hangs here
quit # quit never gets executed
' | gdb -quiet "$file"

这发生在我的两个gdb版本中:

GNU gdb 6.3.50-20050815 (Apple version gdb-1824)
GNU gdb 6.3.50-20050815 (Apple version gdb-1822 + reverse.put.as patches v0.4)
4

1 回答 1

6

我很确定您不能脱离直接在 下启动的劣质进程gdb,但是,类似以下的内容可能对您有用,这是基于最近的gdb,我不知道其中有多少可以工作在 6.3 版上。

创建一个小的 shell 脚本,如下所示:

#! /bin/sh
echo $$
sleep 10
exec /path/to/your/program arg1 arg2 arg3

现在启动它,从 中找到 pid echo $$,然后像这样附加到 shell 脚本gdb -p PID。连接后,您可以:

(gdb) set follow-fork-mode child
(gdb) catch exec
(gdb) continue
Continuing.
[New process NEW-PID]
process NEW-PID is executing new program: /path/to/your/program
[Switching to process NEW-PID]

Catchpoint 1 (exec'd /path/to/your/program), 0x00007f40d8e9fc80 in _start ()
(gdb)

您现在可以根据需要修改子进程。完成后,只需执行以下操作:

(gdb) detach

并且/path/to/your/program应该恢复(或在这种情况下开始)运行。

于 2015-10-09T21:38:10.887 回答