ptrace反調試

  1. ptrace PTRACE_ATTACH可以附加到目標進程上,對其進行調試。
  2. 反調試的方式
    跟蹤自己:因爲,一個進程在同一時間只能被一個進程跟蹤。如果進程在啓動時,就調用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 二進制分析》的作者。也是我的第一本安全學習書。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章