2014-12-15 9 views
5

Devo implementare la tecnica di rilevamento del debugger sotto linux. Quindi l'idea principale è che il mio pezzo di codice crea il secondo thread tramite il clone di syscall. Dopodiché, il thread creato dovrebbe controllare se il debugger è presente nel ciclo while, dormendo per alcuni secondi. La mia domanda è come implementare il rilevamento del debugger tramite ptrace in ambiente multi-thread all'interno di loop infinito. Il mio problema è che dopo aver chiamato ptrace (PTRACE_TRACEME, 0, 1, 0) per un secondo debugger viene rilevato (che è ragionevole e corretto, ovviamente). Quindi devo staccare il tracer in qualche modo alla fine del ciclo o usare ptrace in un altro modo? Ecco un codice:Rilevamento debugger Linux nell'applicazione multi-thread usando 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 

risposta

0

Non so se il tuo progetto ti costringe a provare un rilevamento di loop. PTRACE_TRACEME è utilizzato da un processo tracee per essere tracciato dal suo genitore (dopo la forcella). Ammetto di non sapere con certezza come funzionerebbe quando il tracciante è un altro thread nello stesso processo, ma penso che non funzionerebbe molto bene, poiché il meccanismo di ptrace si basa sui segnali.

Se si desidera essere sicuri che il processo (figlio) sia collegato alle tracce, l'approccio comune è di generare un segnale di arresto per consentire il collegamento del tracciante. Quando l'esecuzione è ripresa, sai che il tracciante è lì.

raise(SIGSTOP); 
+0

Per quanto ho detto prima devo implementare il rilevamento del debugger in ambiente multi-thread, quindi in pratica sto chiedendo come farlo usando un ptrace. Non ho dichiarato che la mia soluzione con PTRACE_TRACEME sia corretta, perché non è corretta. – arl