使用 GDB 和处理断点检测

逆向工程 linux 数据库 反调试
2021-07-05 13:58:49

我正在尝试使用gdb. 我可以在其中运行程序,但是当我设置断点时,main我得到

Program received signal SIGSEGV, Segmentation fault.

将它设置为更早的设置_init(有两个 BTW)也不是很有成效,难道程序可能会在我没有发现的某个时刻损坏自己?看看backtrace这个问题:

#0  0x47048474 in ?? ()
#1  0x0804864a in __handle_global_ctors ()
#2  0x080488c5 in __do_global_ctors_aux ()
#3  0x08048349 in _init ()

现在我尝试使用一个简单的递归遍历反汇编器(不是 IDA)静态反编译它,但我找不到CC(INT 3) 的任何痕迹,所以我猜已经添加了另一层混淆。

我也试过record没有成功:

Breakpoint 5, 0x0804833a in _init ()
(gdb) record
(gdb) c
Continuing.
(null)Process record: failed to record execution log.

哦,我也找不到十六进制字符串“47048474”。

在这种情况下有什么可以帮助的更多想法?也许检测自我修改?

1个回答

所以,只是为了澄清评论中已经存在的内容:

gdb'sbreak将放置一个普通断点,它通过获取进程的内存映像并将其原始指令交换为特定中断指令来工作。如果我理解正确,hbreak告诉操作系统监视每条指令并将当前指令的地址与断点的地址进行比较(即不修改内存中的图像)。但是,一次可用的硬件断点数量是有限的。

若要将与硬件断点hbreak,你的程序必须是已经在运行gdbrun要实现这一点,您应该在最开始的某个地方(比方说,_start函数)放置一个普通断点,在那里成功中断,放置一个硬件断点,然后删除原来的普通断点。