是的你可以。但这并不容易。我给你举个例子。
假设我有以下程序foo.c:
main()
{
*((char *) 0) = '\0';
}
我将编译它并确保没有符号:
$ cc foo.c
$ strip a.out
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
好的,是时候运行它了:
$ ./a.out
Segmentation fault (core dumped)
哎呀。似乎有一个错误。让我们启动一个调试器:
$ gdb ./a.out core
[..]
Reading symbols from /tmp/a.out...(no debugging symbols found)...done.
[..]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x0804839c in ?? ()
(gdb) bt
#0 0x0804839c in ?? ()
#1 0xb7724e37 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6
#2 0x08048301 in ?? ()
嗯,看起来很糟糕。没有符号。我们能弄清楚发生了什么吗?
(gdb) x/i $eip
=> 0x804839c: movb $0x0,(%eax)
看起来它试图将一个值为 0 的字节存储到 EAX 寄存器指向的内存位置。为什么失败了?
(gdb) p $eax
$1 = 0
(gdb)
它失败了,因为 EAX 寄存器指向内存地址 0,并且它试图在该地址存储一个字节。哎呀!
不幸的是我没有任何好的教程的指导。搜索“gdb 逆向工程”会提供一些可能有帮助的链接。
Update:
我注意到评论说这是关于在客户处调试核心转储。当您将剥离的二进制文件发送给客户时,您应该始终保留该二进制文件的调试版本。
我建议不要剥离,甚至给出源代码。我编写的所有代码都会连同源代码一起发送给客户。我在客户方面已经多次面对一个无能的供应商,该供应商交付了一个损坏的软件,但不知道如何修复它。太糟糕了。
这似乎实际上是这个问题的重复:
调试没有符号的核心文件
那里有一些附加信息。