反调试检测之一TracerPid
生活随笔
收集整理的這篇文章主要介紹了
反调试检测之一TracerPid
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
當(dāng)我們使用Ptrace方式跟蹤一個(gè)進(jìn)程時(shí),目標(biāo)進(jìn)程會(huì)記錄自己被誰跟蹤,可以查看/proc/pid/status看到這個(gè)信息,下圖展示的是使用ida進(jìn)行調(diào)試的情況。
Paste_Image.png
Paste_Image.png
而沒有被調(diào)試的時(shí)候TracerPid為0:
Paste_Image.png
因此一種常見的檢測(cè)調(diào)試的辦法就是去讀取這個(gè)值,發(fā)現(xiàn)不是0則判定為被調(diào)試。
本文提供一個(gè)反檢測(cè)的方法,通過修改和重新編譯kernel的方式來讓TracerPid在調(diào)試的時(shí)候仍然為0。
編譯kernel參考編譯nexus5的linux kernel源碼。
下面說一下改動(dòng)點(diǎn):
kernel/msm/fs/proc/base.c kernel/msm/fs/proc/array.cbase.c在 line285 處修改如下:
else { if (strstr(symname, "trace")) { return sprintf(buffer, "%s", "sys_epoll_wait"); } return sprintf(buffer, "%s", symname); }array.c在 line134處修改如下:
static const char * const task_state_array[] = { "R (running)", /* 0 */ "S (sleeping)", /* 1 */ "D (disk sleep)", /* 2 */ "S (sleeping)", /* 4 */ "S (sleeping)", /* 8 */ "Z (zombie)", /* 16 */ "X (dead)", /* 32 */ "x (dead)", /* 64 */ "K (wakekill)", /* 128 */ "W (waking)", /* 256 */ };在 line187 處修改如下:
"Gid:\t%d\t%d\t%d\t%d\n", get_task_state(p), task_tgid_nr_ns(p, ns), pid_nr_ns(pid, ns), ppid, /*tpid*/0, cred->uid, cred->euid, cred->suid, cred->fsuid, cred->gid, cred->egid, cred->sgid, cred->fsgid);修改后,重新編譯kernel,替換zImage-dtb,重新編譯AOSP,刷機(jī)即可。
效果:
Paste_Image.png
至于代碼為啥這么改,參考:http://www.evil0x.com/posts/26301.html
假如你不想重新編譯kernel,可以參考逆向*修改手機(jī)內(nèi)核*,繞過反調(diào)試
作者:difcareer
鏈接:http://www.jianshu.com/p/26c16c747720
來源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的反调试检测之一TracerPid的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JNI实现源码分析【四 函数调用】
- 下一篇: 彻底弄懂dalvik字节码【一】