1. 程式人生 > >ptrace反除錯

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 二進位制分析》的作者。也是我的第一本安全學習書。