简介
每个App的用于程序都是通过父进程zygote进行fork出来的子进程,所以zygote也是所有app的父进程。 那么对于zygote进程可以用于检测判断app应该是否处于被调试状态。
检测父进程原理
有的时候不使用apk附加调试的方法进行逆向,而是写一个.out可执行文件直接加载so进行 调试,这样程序的父进程名和正常启动apk的父进程名是不一样的。
实验测试
1、正常启动的apk程序:父进程是zygote2、调试启动的apk程序:在AS中用LLDB调试发现父进程还是zygote3、附加调试的apk程序:父进程是zygote4、vs远程调试 用可执行文件加载so:父进程名为gdbserver
实验结论:父进程名非zygote的,判定为调试状态
代码实现
int CheckApkParents()
{
// 设置buf
char strPpidCmdline[0x100]={0};
snprintf(strPpidCmdline, sizeof(strPpidCmdline), "/proc/%d/cmdl ine", getppid());
// 调用系统的open函数进行打开文件
int file=open(strPpidCmdline,O_RDONLY); if(file<0)
{ //打开失败, LOGA("CheckApkParents open错误!\n"); return -1;
}
// 文件内容读入内存
memset(strPpidCmdline,0,sizeof(strPpidCmdline));
//调用系统read函数进行读内存操作
ssize_t ret=read(file,strPpidCmdline,sizeof(strPpidCmdline));
if(-1==ret)
{
//读取内存数据失败 LOGA("CheckApkParents read错误!\n"); return -1;
}
// 没找到返回0
char sRet=strstr(strPpidCmdline,"zygote");
if(NULL==sRet)
{
// 执行到这里,判定为调试状态 LOGA("父进程cmdline没有zygote子串!\n"); return 0;
}
return 1;
}
网络安全成长路线图
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成hei客大神,这个方向越往后,需要学习和掌握的东西就会越来越多,以下是学习网络安全需要走的方向:
# 网络安全学习方法
上面介绍了技术分类和学习路线,这里来谈一下学习方法:
## 视频学习
无论你是去B站或者是油管上面都有很多网络安全的相关视频可以学习,当然如果你还不知道选择那套学习,我这里也整理了一套和上述成长路线图挂钩的视频教程,完整版的视频已经上传至CSDN官方,朋友们如果需要可以点击这个链接免费领取。网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!