【问题标题】:linux debugger detection in multi-thread application using ptrace使用 ptrace 在多线程应用程序中检测 linux 调试器
【发布时间】:2014-12-15 11:16:38
【问题描述】:

我必须在 linux 下实现调试器检测技术。所以主要思想是,我的一段代码通过系统调用克隆创建第二个线程。之后,创建的线程应该检查调试器是否存在于 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

【问题讨论】:

    标签: multithreading debugging assembly ptrace


    【解决方案1】:

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

    如果您想确保您的(子)进程正在附加到跟踪,常用方法是发出停止信号以允许跟踪器附加。恢复执行后,您就知道跟踪器在那里。

    raise(SIGSTOP);
    

    【讨论】:

    • 据我之前所说,我必须在多线程环境中实现调试器检测,所以基本上我是在问如何使用 ptrace 来实现。我没有说明我的 PTRACE_TRACEME 解决方案是正确的,因为它不正确。
    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2011-07-25
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多