使用ptrace在多线程应用程序中检测Linux调试器

5

我需要在Linux下实现调试器检测技术。主要思路是,我的代码段通过系统调用clone创建了第二个线程。然后,新创建的线程应该在while循环中检查调试器是否存在,等待几秒钟。我的问题是,在无限循环中如何在多线程环境下通过ptrace实现调试器检测。我的问题是,当第二次调用ptrace(PTRACE_TRACEME, 0, 1, 0)时,会检测到调试器(这当然是合理和正确的)。那么我是不是需要在循环结束时以某种方式分离跟踪器,或者以另一种方式使用ptrace?以下是一段代码:

new_thread:
; PTRACE
xor rdi, rdi
xor rsi, rsi
xor rdx, rdx
inc rdx
xor r10, r10
mov rax, 101 ; ptrace syscall
syscall
cmp rax, 0
jge __nondbg
call _dbg
db 'debugged!', 0xa, 0
_dbg:
mov rdi, 1
pop rsi
mov rdx, 10
mov rax, 1 ; syscall write
syscall
; exit_group call
mov rdi, 127
mov rax, 231 ; exit_group syscall
syscall
__nondbg:
call _nondbg
db 'non-debugged!', 0xa, 0
_nondbg:
mov rdi, 1
pop rsi
mov rdx, 14
mov rax, 1 ; syscall write
syscall
; ==========
; SLEEP.....
; ==========
push 0 ; value should be a parameter
push 5 ; value should be a parameter
mov rdi, rsp
xor rsi, rsi
mov rax, 35 ; syscall nanosleep
syscall ; syscall
pop rax
pop rax
jmp new_thread
1个回答

0

我不知道你的设计是否需要尝试循环检测。PTRACE_TRACEME 由被跟踪进程用于被其父进程(在 fork 后)跟踪。我承认我不确定当跟踪器是同一进程中的另一个线程时,这将如何工作,但我认为它不会很好地工作,因为 ptrace 的机制基于信号。

如果您想确保您的(子)进程正在被附加到跟踪中,常见的方法是发出停止信号以允许跟踪器附加。当执行恢复时,您就知道跟踪器已经存在了。

raise(SIGSTOP);

就像我之前说过的,我必须在多线程环境中实现调试器检测,因此基本上我想知道如何使用ptrace来实现。我并没有说我的PTRACE_TRACEME解决方案是正确的,因为它是错误的。 - arl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接