ptrace反除錯
阿新 • • 發佈:2018-12-13
- 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 二進位制分析》的作者。也是我的第一本安全學習書。