APK防护中Anti_Virtual App的思路和实现是怎样的
APK防护中Anti_Virtual App的思路和实现是怎样的
APK防护中Anti_Virtual App的思路和实现是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
0x00 前言
Virtual App是一个很强大的存在,破坏了Android 系统本身的隔离措施,可以进行免root hook和其他黑科技操作,你可以用这个做很多在原来APP里做不到事情,于此同时Virtual App的安全威胁也不言而喻。可以去看看这篇文章。VirtualApp技术黑产利用研究报告。
当然还有其他东西,可以去各大论坛进行深度挖掘。
我们这次的重点是放在Anti_Virtual App上。
1.内容
1.1 第一种思路和实现
1.2 第二种思路和实现
我也不知道用什么来命名,感觉要是把思路直接写在标题里之后不好展开。不啰嗦了正文开始。
0x01 第一种思路和实现
1.思路
1.1 思路是从哪来的?
我们要防止App在VirtualAPP上运行就要通过Virtual启动App时的一些特征来逆向分析,VirtualAPP是开源的我们也可以结合源码来进行分析。
1.2 思路挖掘
Android应用隔离是基于Linux系统的多用户机制实现的,即每个应用在安装时被分配了不同的Linux用户uid/gid。而在VirtualApp中,client应用(通过VirtualApp安装的应用)与host应用(即VirtualApp本身)是具有相同用户uid的。
这个是在Virtual资料里的介绍,这里有一个值得关注的地方就是,client应用和host应用具有相同的uid。
我们来进行一个测试。
这个是我们运行在正常环境下的。
用grep过滤一下。然后我们运行在虚拟机下用grep过滤一下。
有一个前提就是,Android 系统中的UID是在app安装的时候进行分配的,之后是不会进行更改的。而且为了可以进行沙箱和隔离,每一个APP分配到的UID是不同的,而且不同的UID仅仅拥有一个进程。这是Linux的多用户系统被阉割下成为了现在的状态,当然也提高了APP的安全性。相同的UID具有共享的特性。
就这个不同的点,我们进行测试的实现。
2. 实现
实现的方法直接使用NDK来进行开发,或者使用java也可以。
实现思路就是我在app里调用ps |grep,拿到返回行数,简单粗暴易懂,可能会有bug,针对一般情况。轻踩。
我们需要做的第一步就是,获取到APP的UID对应的UNAME。
我这里使用的是封装方法。
struct passwd *pwd; pwd = getpwuid(getuid()); char *find=pwd->pw_name;
这样可以直接拿到UNAME
然后我们使用字符串拼接,将命令结合,我是不是太啰嗦了。。。
char cmd[20]="ps | grep "; LOGD("%s",cmd); strcat(cmd,find); LOGD("%s",cmd);
使用popen进行命令的运行
int getEnd(char * cmd){ FILE *pp = popen(cmd, "r"); //建立管道 if (!pp) { LOGD("error"); } int i=0; char tmp[1024]; //设置一个合适的长度,以存储每一行输出 while (fgets(tmp, sizeof(tmp), pp) != NULL) { if (tmp[strlen(tmp) - 1] == 'n') { tmp[strlen(tmp) - 1] = '