android多开器解析与检测实现方法示例

作者:小道安全 时间:2022-04-01 11:43:15 

目录
  • 多开理论基础

  • 多开实现原理解析

  • 代码实现:多开包名

  • 代码实现:多用户

  • 总结

多开理论基础

app多开常用于做一些不合法的事情,如高羊毛,黑灰产,甚至会对app的功能做破坏修改。因此多开在实际app应用中是有一定危害性的,因此对多开环境的识别是很重要的,通过识别多开环境有利于让app更加安全。

目前市面上的多开App的原理类似,都是以新进程运行被多开的App,并hook各类系统函数,使被多开的App认为自己是一个正常的App在运行。

从形式上来说多开App有2种形式,一种是从多开App中直接加载被多开的App,如平行空间、VirtualApp等,另一种是让用户新安装一个App,但这个App本质上就是一个壳,用来加载被多开的App,其原理和前一种是一样的,市面上多开分身这款App是用的这种形式,用户每分身一个App需新安装一个包名为dkmodel.xxx.xxx的App。

多开实现原理解析

app多开实现原理很多种类,如采用多用户方式(mumu模拟器的多开器实现)、通过创建不同进程名称(多开分身、双开助手)进行运行。

我们知道在每一个的app都有属于自己的私有目录,一般是“/data/data/包名/”或“/data/user/用户号/包名”,多开方式也是基于这些去做处理的,那么我们就可以通过调用系统getFilesDir()方法可以读取到私有目录下的信息目录。在多开环境下,获取到目录会变为“/data/data/多开包名/xxxxxxxx”或“/data/user/用户号/多开App的包名”。
基于以上的原理分析,就可以通过以下代码实现对多开环境的判断识别了。

代码实现:多开包名


//用于收集可以实现多开的app包名,已收集到最新市面上的大部分多开app
private String[] packagename = {
       "com.bly.dkplat",//多开分身本身的包名
       "com.by.chaos",//chaos引擎
       "com.lbe.parallel",//平行空间
       "com.excelliance.dualaid",//双开助手
       "com.lody.virtual",//VirtualXposed,VirtualApp
       "com.qihoo.magic",//360分身大师
       "com.dual.dualgenius", //DualGenius/双开精灵
       "com.jiubang.commerce.gomultiple" //GO Multiple/Go双开
};

通过读取文件包的方式进行比对
public  boolean checkPrivateFilePath(Context context)
{
   String path = context.getFilesDir().getPath();
   for(String vtpkg: packagename)
   {
       if(path.contains(vtpkg))
       {
           return true;
       }
   }

return false;
}

通过读取文件包的方式进行比对


public  boolean checkPrivateFilePath(Context context)
{
   String path = context.getFilesDir().getPath();
   for(String vtpkg: packagename)
   {
       if(path.contains(vtpkg))
       {
           return true;
       }
   }

return false;
}

代码实现:多用户


private  String GetMulData()
{
   //通过读取命令行方式实现。
   String filter = exec("cat /proc/self/cgroup");
   if(null == filter || (filter.length() == 0))
   {
       return null;
   }

int uidStartIndex = filter.lastIndexOf("uid");
   int uidEndIndex = filter.lastIndexOf("/pid");
   if(0 > uidStartIndex)
   {
       return null;
   }
   if( 0 >= uidEndIndex)
   {
       uidEndIndex = filter.length();
   }

filter = filter.substring(uidStartIndex + 4, uidEndIndex);
   try {
       String strUid = filter.replaceAll("\n", "");
       if(isNumeriToUid(strUid))
       {
           int  uid = Integer.valueOf(strUid);
           filter = String.format("u0_a%d", uid -10000);
           return filter;
       }

}catch (Exception e)
   {
       return null;
   }
   return  null;
}

来源:https://juejin.cn/post/7000285004810944543

标签:android,多开器,检测
0
投稿

猜你喜欢

  • C#开发中的垃圾回收机制简析

    2022-08-06 14:10:56
  • Android Intent的几种用法详细解析

    2023-08-23 20:01:01
  • Java switch关键字原理及用法详解

    2023-04-16 23:29:49
  • SpringBoot实现简单文件上传功能

    2021-07-22 21:52:49
  • Spring常用注解汇总

    2022-12-19 16:26:03
  • 简单记录C# 条件编译

    2023-10-20 05:49:07
  • SpringBoot如何读取xml配置bean(@ImportResource)

    2021-08-03 22:33:44
  • Java 调用天气Webservice详解及实例代码

    2021-10-09 21:59:03
  • Android中ADB命令用法大结局

    2022-12-18 10:36:28
  • IntelliJ IDEA的代码搁置功能实现

    2022-03-28 07:32:52
  • windows定时器配置执行java jar文件的方法详解

    2023-04-17 16:40:21
  • java easyUI实现自定义网格视图实例代码

    2022-05-16 23:52:54
  • Android实现自动匹配关键字并且标红功能

    2023-05-29 06:19:28
  • C#引用类型转换的常见方式总结

    2022-03-02 16:53:58
  • springboot中request和response的加解密实现代码

    2023-05-27 16:46:27
  • Android输入法弹出时覆盖输入框问题的解决方法

    2023-02-06 06:36:52
  • ConcurrentMap.putIfAbsent(key,value)用法实例

    2023-03-14 06:45:43
  • C++中的String的常用函数用法

    2023-03-26 17:52:45
  • Java对象类型的判断详解

    2023-07-26 09:55:07
  • SpringBoot注解梳理(小结)

    2023-11-10 13:27:19
  • asp之家 软件编程 m.aspxhome.com