gpt4 book ai didi

c - 绕过 gdb 中的 ptrace

转载 作者:行者123 更新时间:2023-11-30 17:08:28 24 4
gpt4 key购买 nike

如果程序使用 ptrace 来检测它是否在调试器中运行,我发现可以使用以下技巧:

catch syscall ptrace
commands 1
set ($eax) = 0
continue
end

有人可以解释一下它是如何工作的吗?我尝试在 commands 1 之后插入 i r eax,但是我不明白我得到的负值:

Catchpoint 1 (call to syscall ptrace), 0x00007ffff778af1e in ptrace (request=PTRACE_TRACEME) at ../sysdeps/unix/sysv/linux/ptrace.c:45
45 ../sysdeps/unix/sysv/linux/ptrace.c: No such file or directory.
eax 0xffffffda -38

Catchpoint 1 (returned from syscall ptrace), 0x00007ffff778af1e in ptrace (request=PTRACE_TRACEME) at ../sysdeps/unix/sysv/linux/ptrace.c:45
45 in ../sysdeps/unix/sysv/linux/ptrace.c
eax 0xffffffff -1

最佳答案

ptrace系统调用允许一个进程跟踪另一个进程。我的猜测是您的应用程序(试图检测调试器)生成一个子进程(或者可能是线程),然后使用 ptrace附加到这个 child ,就像调试器一样。

问题是,如果第二个进程尝试使用 ptrace 附加,则只有一个进程可以跟踪另一个进程。然后是第二个ptrace将失败,返回-1和设置errnoEPERM 。如果您在调试器下运行,那么调试器将首先进入并附加 ptrace ,因此当应用程序本身尝试附加 ptrace 时此调用将失败。

因此,在您的示例中,当捕获点在系统调用 ptrace 的返回上触发时,您可以看到 eax设置为-1,表示系统调用失败(寄存器eax保存x86-64上的返回值)。

现在,如果您正在调试的应用程序中的代码不是很好,它只会检查是否 ptrace返回成功与否,然后强制eax的值为 0(其中 0 表示 ptrace 成功)可能足以欺骗应用程序,使其认为它没有在调试器下运行。

显然,可以在应用程序中编写更复杂的代码来更广泛地使用 ptrace这样一来,解决此检测就会更困难(尽管并非不可能)。

关于c - 绕过 gdb 中的 ptrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33646927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com