返回

TracerPid反调试的实现

发布时间:2022-03-25 17:52:55 588
# android# linux# 技术

1、首先,查看程序的/proc/{PID}/status文件:

# cat /proc/29139/status
Name:   n.myapplication /*进程的程序名*/
State:  S (sleeping)
Tgid:   29139 /*线程组号*/
Pid:    29139 /*进程pid process id*/
PPid:   281 /*父进程的pid parent processid*/
TracerPid:      0 /*跟踪进程的pid*/
Uid:    10123   10123   10123   10123 /*uid euid suid fsuid*/
Gid:    10123   10123   10123   10123 /*gid egid sgid fsgid*/
FDSize: 256 /*文件描述符的最大个数,file->fds*/
Groups: 50123 /*启动该进程的用户所属的组的id*/
VmPeak:   960944 kB /*进程地址空间的大小*/
VmSize:   923620 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/
VmLck:         0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/
VmPin:         0 kB
VmHWM:     31468 kB /*文件内存映射和匿名内存映射的大小*/
VmRSS:     31468 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/
VmData:    18428 kB /*程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据*/
VmStk:       136 kB /*进程在用户态的栈的大小*/
VmExe:        20 kB /*程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 */
VmLib:     61212 kB /*被映像到任务的虚拟内存空间的库的大小*/
VmPTE:       192 kB /*该进程的所有页表的大小*/
VmSwap:    13144 kB
Threads:        12 /*共享使用该信号描述符的任务的个数*/
SigQ:   0/14462 /*待处理信号的个数/目前最大可以处理的信号的个数*/
SigPnd: 0000000000000000 /*屏蔽位,存储了该线程的待处理信号*/
ShdPnd: 0000000000000000 /*屏蔽位,存储了该线程组的待处理信号*/
SigBlk: 0000000000001204 /*存放被阻塞的信号*/
SigIgn: 0000000000000000 /*存放被忽略的信号*/
SigCgt: 00000002000094f8 /*存放被俘获到的信号*/
CapInh: 0000000000000000 /*能被当前进程执行的程序的继承的能力*/
CapPrm: 0000000000000000 /*进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的*/
CapEff: 0000000000000000 /*是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性*/
CapBnd: fffffff000000000
Cpus_allowed:   f /*可以执行该进程的CPU掩码集*/
Cpus_allowed_list:      0-3
voluntary_ctxt_switches:        258 /*进程主动切换的次数*/
nonvoluntary_ctxt_switches:     201 /*进程被动切换的次数*/

2、试着使用IDA attach写好的一个Helloworld Demo:

(1)先设置ro.debuggable为1:

adb shell
mprop ro.debuggable 1

(2)运行android_server:

adb push android_server /data/local/tmp/
adb shell
cd /data/local/tmp
chmod 777 /data/local/tmp/android_server
/data/local/tmp/android_server

(3)转发23946端口:

adb forward tcp:23946 tcp:23946

(4)使用IDA attach,观察TracerPid字段,发现变成了8319,State字段也变成了tracing stop:

# cat /proc/29139/status
Name:   n.myapplication
State:  t (tracing stop)
Tgid:   29139
Pid:    29139
PPid:   281
TracerPid:      8319
Uid:    10123   10123   10123   10123
Gid:    10123   10123   10123   10123
FDSize: 256
Groups: 50123
VmPeak:   961076 kB
VmSize:   923620 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     32216 kB
VmRSS:     32216 kB
VmData:    18428 kB
VmStk:       136 kB
VmExe:        20 kB
VmLib:     61212 kB
VmPTE:       192 kB
VmSwap:    13132 kB
Threads:        12
SigQ:   0/14462
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000001204
SigIgn: 0000000000000000
SigCgt: 00000002000094f8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: fffffff000000000
Cpus_allowed:   f
Cpus_allowed_list:      0-3
voluntary_ctxt_switches:        577
nonvoluntary_ctxt_switches:     315

(5)8319是什么?使用ps命令查看:

# ps |grep 8319
root      8319  8277  12700  10968 ffffffff b6f324c4 S ./android_server

原来是我们的android_server程序,那么看到这里,大家应该有一些理解了,当我们使用IDA attach程序的时候,在/proc/{PID}/status文件的TracerPid字段会写入调试程序的PID。
也就是说,使用TracerPid反调试的原理就是检测这个字段是否为0,为0说明没有被调试,不为0说明正在被调试,检测调试器直接退出就可以达到反调试的效果。

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线