arl*_*arl 5 debugging assembly multithreading ptrace
我必须在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
Run Code Online (Sandbox Code Playgroud)
我不知道你的设计是否强迫你尝试循环检测。PTRACE_TRACEME 由被跟踪进程使用,以被其父进程(fork 之后)跟踪。我承认我不确定当跟踪器是同一进程中的另一个线程时这将如何工作,但我认为它不会很好地工作,因为 ptrace 的机制是基于信号的。
如果您想确保您的(子)进程已附加到跟踪,常见的方法是发出停止信号以允许跟踪器附加。当执行恢复时,您就知道跟踪器在那里。
raise(SIGSTOP);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |