反调试检测之一TracerPid

当我们使用Ptrace方式跟踪一个进程时,目标进程会记录自己被谁跟踪,可以查看/proc/pid/status看到这个信息,下图展示的是使用ida进行调试的情况。

Paste_Image.png

Paste_Image.png

而没有被调试的时候TracerPid为0:

Paste_Image.png

因此一种常见的检测调试的办法就是去读取这个值,发现不是0则判定为被调试。

本文提供一个反检测的方法,通过修改和重新编译kernel的方式来让TracerPid在调试的时候仍然为0。

编译kernel参考编译nexus5的linux kernel源码

下面说一下改动点:

kernel/msm/fs/proc/base.c 
kernel/msm/fs/proc/array.c 

base.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,刷机即可。

效果:

Paste_Image.png

至于代码为啥这么改,参考:http://www.evil0x.com/posts/26301.html

假如你不想重新编译kernel,可以参考逆向修改手机内核,绕过反调试

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

Win7 U盘安装Ubuntu16.04 双系统详细教程

http://blog.sciencenet.cn/blog-3027933-956284.html

2.5K20
来自专栏软件开发

一个小时学会Maven

在开发中经常需要依赖第三方的包,包与包之间存在依赖关系,版本间还有兼容性问题,有时还里要将旧的包升级或降级,当项目复杂到一定程度时包管理变得非常重要。

82730
来自专栏云计算教程系列

如何在Ubuntu上使用Webhooks和Slack部署React

Webhook,也就是人们常说的钩子,是一个很有用的工具。你可以通过定制 Webhook 来监测你在 Github.com 上的各种事件,最常见的莫过于 pus...

27520
来自专栏云计算教程系列

如何在CentOS 7上使用Linux审计系统

在Linux审核系统可以帮助系统管理员创建一个审计跟踪,日志服务器上的每一个动作。我们可以通过检查审计日志文件来跟踪与安全相关的事件,将事件记录在日志文件中,以...

1.5K50
来自专栏cmazxiaoma的架构师之路

FastDFS蛋疼的集群和负载均衡(六)之Nginx高可用集群

17930
来自专栏杂烩

otter安装 原

    https://github.com/alibaba/otter/wiki/QuickStart

14130
来自专栏散尽浮华

针对负载均衡集群中的session解决方案的总结

在日常运维工作中,当给Web站点使用负载均衡之后,必须面临的一个重要问题就是Session的处理办法,无论是PHP、Python、Ruby还是Java语言环境,...

240110
来自专栏佳爷的后花媛

SVN命令解析以及问题解决(update...)

1.Repo-browser(浏览版本库) 通过“浏览版本库”可以直接查看服务器上指定目录下的所有目录结构(需要有相关权限),包括特定版本的作者,提交时间等,...

1K30
来自专栏黑白安全

8种DOS命令

  它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:...

25320
来自专栏陈树义

如何在IntelJ下用Maven创建一个Web项目

相信一开始做Web项目的同学都是直接把项目包放在WEB-INF/lib目录下,然后就开始做项目了。但是之后接触了一些使用了Maven进行包管理的项目,我们就不得...

28460

扫码关注云+社区

领取腾讯云代金券