2014-12-15 8 views
5

Ich muss Debugger Detektionstechnik unter Linux implementieren. Die Hauptidee ist, mein Code erzeugt einen zweiten Thread via syscall clone. Danach soll der erzeugte Thread überprüfen, ob der Debugger in der while-Schleife vorhanden ist und für einige Sekunden schläft. Meine Frage ist, wie Debugger-Erkennung über Ptrace in Multi-Thread-Umgebung innerhalb der Endlosschleife zu implementieren. Mein Problem ist, dass nach dem zweiten Aufruf von ptrace (PTRACE_TRACEME, 0, 1, 0) der Debugger erkannt wird (das ist natürlich sinnvoll und korrekt). Muss ich also den Tracer irgendwie am Ende der Schleife lösen oder ptrace auf andere Weise benutzen? Hier ist ein Stück Code:Linux Debugger Erkennung in Anwendung Multi-Thread unter Verwendung 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 

Antwort

0

Ich weiß nicht, ob Ihr Design Sie zwingt, eine Loop-Erkennung zu versuchen. PTRACE_TRACEME wird von einem Tracee-Prozess verwendet, um von seinem übergeordneten Element (nach fork) verfolgt zu werden. Ich gebe zu, ich weiß nicht genau, wie das funktionieren würde, wenn der Tracer ein anderer Thread in demselben Prozess ist, aber ich denke, dass es nicht sehr gut funktionieren würde, da der Mechanismus von ptrace auf Signalen basiert.

Wenn Sie sichergehen möchten, dass Ihr (Kind-) Prozess an die Traces angehängt wird, ist es üblich, ein Stoppsignal zu setzen, damit der Tracer anhängen kann. Wenn die Ausführung fortgesetzt wird, wissen Sie, dass der Tracer vorhanden ist.

+0

Soweit ich vorher gesagt habe, muss ich Debugger-Erkennung in Multi-Thread-Umgebung zu implementieren, also im Grunde bin ich gefragt, wie es mit einem Ptrace zu tun. Ich habe nicht angegeben, dass meine Lösung mit PTRACE_TRACEME korrekt ist, weil sie falsch ist. – arl

Verwandte Themen