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说明正在被调试,检测调试器直接退出就可以达到反调试的效果。
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报