Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用ptrace检测多线程应用程序中的linux调试器_Multithreading_Debugging_Assembly_Ptrace - Fatal编程技术网

Multithreading 使用ptrace检测多线程应用程序中的linux调试器

Multithreading 使用ptrace检测多线程应用程序中的linux调试器,multithreading,debugging,assembly,ptrace,Multithreading,Debugging,Assembly,Ptrace,我必须在linux下实现调试器检测技术。所以主要的想法是,我的代码通过syscallclone创建第二个线程。之后,创建的线程应该检查调试器是否存在于while循环中,并休眠几秒钟。我的问题是如何在无限循环内的多线程环境中通过ptrace实现调试器检测。我的问题是,在第二次调用ptrace(ptrace_TRACEME,0,1,0)后,检测到调试器(这当然是合理和正确的)。所以我必须在循环结束时以某种方式分离跟踪程序,还是以另一种方式使用ptrace?下面是一段代码: new_thread: ;

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

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

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

raise(SIGSTOP);

正如我之前所说的,我必须在多线程环境中实现调试器检测,所以基本上我是在问如何使用ptrace来实现它。我没有声明我使用PTRACE_TRACEME的解决方案是正确的,因为它不正确。