Код: Выделить всё
$ cat foo.c
/*foo.c*/
#include <unistd.h>
int main(int argc, char** argv) {
while (1) {
sleep(1);
};
return 0;
}Shell
$ gcc foo.c
$ ./a.out
...Shell
$ objdump -d .text a.out
...
0000000000001139 <main>:
1139: 55 push %rbp
113a: 48 89 e5 mov %rsp,%rbp
113d: 48 83 ec 10 sub $0x10,%rsp
1141: 89 7d fc mov %edi,-0x4(%rbp)
1144: 48 89 75 f0 mov %rsi,-0x10(%rbp)
1148: bf 01 00 00 00 mov $0x1,%edi
114d: e8 de fe ff ff call 1030 <sleep@plt>
1152: eb f4 jmp 1148 <main+0xf>
...
$ Shell
$ pidof a.out
4987
$ gdb attach $(pidof a.out)
...dump memory dump_gdb 0x557ebe6f0139 0x557ebe6f0154
Содержимое дампа суть функция main:
Shell
$ hexdump -v -e "1/1 \"0x%02x \"" dump_gdb
0x55 0x48 0x89 0xe5 0x48 0x83 0xec 0x10 0x89 0x7d 0xfc 0x48 0x89 0x75 0xf0 0xbf 0x01 0x00 0x00 0x00 0xe8 0xde 0xfe 0xff 0xff 0xeb 0xf4 $
$К каждому процессу не наприаттачиваешься. Дамп всей памяти процесса сделаем и попробуем найти функцию main. Сперва закроем (не описываю, как) отладчик (оттатачимся от процесса a.out), потом удостоверимся, что процесс a.out есть:
Shell
$ pidof a.out
4987
$Shell
$ sudo gcore -a 4987
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f0135219503 in clock_nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
Saved corefile core.4987
[Inferior 1 (process 4987) detached]
$...А наша последовательность должна лежать в файле core.4987 . На картинке она лежит по адресу 0x557ebe6f0139, а процесс загружен по адресу 0x557ebe6ef000:
Shell
$ cat /proc/$(pidof a.out)/maps | head -n 2
557ebe6ef000-557ebe6f0000 r--p 00000000 08:01 1055517 /home/user/foo/bar/ch04-process-memory-structure/a.out
557ebe6f0000-557ebe6f1000 r-xp 00001000 08:01 1055517 /home/user/foo/bar/ch04-process-memory-structure/a.out
$Shell
$ dd if=core.4987 of=dump_dd bs=1 skip=4409 count=27
27+0 records in
27+0 records out
27 bytes copied, 0,00159238 s, 17,0 kB/s
$
$ hexdump -v -e "1/1 \"0x%02x \"" dump_dd
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 $
$