- ptrace PTRACE_ATTACH可以附加到目標進程上,對其進行調試。
- 反調試的方式
跟蹤自己:因爲,一個進程在同一時間只能被一個進程跟蹤。如果進程在啓動時,就調用ptrace PTRACE_TRACEME跟蹤了自己。那麼這個進程將無法被其他進程附加。
如果對方調用的是exec()的時候,暫停你的程序呢。這個時候調用ptrace跟蹤。也就是在你調用ptrace之前。
- 這種情況很好解決,通過調用ptrace(PTRACE_TRACEME, 0);如果返回值爲小於0的值,也就是調用失敗,這說明當前進程正在被跟蹤,那麼這時退出進程即可。代碼如下。
if (ptrace(PTRACE_TRACEME, 0) < 0) {
printf("This process is being traced!");
exit(-1);
}
如果,對方劫持你的鏈接庫呢,修改你調用的ptrace函數。
- 這也簡單,自己封裝一個ptrace系統調用即可。
ptrace系統調用編號:
32位:26
64位:101 (64位代碼如下)
static __always_inline volatile long ptrace(
enum __ptrace_request request,
pid_t pid,
void *addr,
void *data)
{
__asm__ volatile(
"mov %0, %%rdi\n"
"mov %1, %%rsi\n"
"mov %2, %%rdx\n"
"mov %3, %%r10\n"
"mov $0x65, %%rax\n"
"syscall"
:
: "g"(request), "g"(pid), "g"(addr), "g"(data));
asm("mov %%rax, %0"
: "=r"(ret));
return (void *)ret;
}
當然以上的方式能成功防禦反調試,是必須保證,可執行文件沒被修改的情況下有效的。如果可執行文件被靜態反彙編。找到ptrace系統調用的代碼將其替換成無效指令。那反調試策略將失效,所以,這樣的保護還是得基於,可執行代碼的加密。比如Ryan O’Neill的一個項目中可執行代碼保護方式,將靜態代碼加密,執行時,動態的解析沒一個調用的函數的二進制代碼,調用完成後,又進行加密。這樣大大的增大瞭解密難度。
Ryan O’Neill是《Linux 二進制分析》的作者。也是我的第一本安全學習書。