使用gdb运行进程并将其分离

Tyi*_*ilo 3 gdb

是否可以使用运行流程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"
Run Code Online (Sandbox Code Playgroud)

这在我的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)
Run Code Online (Sandbox Code Playgroud)

And*_*rew 5

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

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

#! /bin/sh
echo $$
sleep 10
exec /path/to/your/program arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

现在开始,从中找出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)
Run Code Online (Sandbox Code Playgroud)

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

(gdb) detach
Run Code Online (Sandbox Code Playgroud)

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