反調試原理:
ptrace函數
原型為:
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
ptrace有四個參數:
1). enum __ptrace_request request:指示了ptrace要執行的命令。
2). pid_t pid: 指示ptrace要跟蹤的進程。
3). void *addr: 指示要監控的內存地址。
4). void *data: 存放讀取出的或者要寫入的數據。
ptrace是如此的強大,以至於有很多大家所常用的工具都基於ptrace來實現,如strace和gdb。
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
ptrace有四個參數:
1). enum __ptrace_request request:指示了ptrace要執行的命令。
2). pid_t pid: 指示ptrace要跟蹤的進程。
3). void *addr: 指示要監控的內存地址。
4). void *data: 存放讀取出的或者要寫入的數據。
ptrace是如此的強大,以至於有很多大家所常用的工具都基於ptrace來實現,如strace和gdb。
參數為reqest為PTRACE_TRACCEME,表示父進程和子進程是Trace關系。如下圖:

我們知道調試Android應用程序,必須調用附加進城,此刻必須調用
ptrace(PTRACE_ATTACH). 此刻進程從程序已經被Tracce, 此刻ptrace必會失敗。利用這一點我們就可以做反調試。
實現代碼如下:

解決方案:NOP調用 ptrace(PTRACE_TRACEME)這個代碼