多开理论基础
app多开常用于做一些不合法的事情,如高羊毛,黑灰产,甚至会对app的功能做破坏修改。
因此多开在实际app应用中是有一定危害性的,因此对多开环境的识别是很重要的,通过识别多开环境有利于让app更加安全。
多开实现原理解析
app多开实现原理很多种类,如采用多用户方式(mumu模拟器的多开器实现)、通过创建不同进程名称(多开分身、双开助手)进行运行。
我们知道在每一个的app都有属于自己的私有目录,一般是“/data/data/包名/”或“/data/user/用户号/包名”,多开方式也是基于这些去做处理的,那么我们就可以通过调用系统getFilesDir()方法可以读取到私有目录下的信息目录。
在多开环境下,获取到目录会变为“/data/data/多开包名/xxxxxxxx”或“/data/user/用户号/多开App的包名”。
基于以上的原理分析,就可以通过以下代码实现对多开环境的判断识别了。
代码实现:多开包名
//用于收集可以实现多开的app包名,已收集到最新市面上的大部分多开appprivateString[]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"//GOMultiple/Go双开};通过读取文件包的方式进行比对publicbooleancheckPrivateFilePath(Contextcontext){Stringpath=context.getFilesDir().getPath();for(Stringvtpkg:packagename){if(path.contains(vtpkg)){returntrue;}}returnfalse;}
代码实现:多用户
privateStringGetMulData(){//通过读取命令行方式实现。Stringfilter=exec("cat/proc/self/cgroup");if(null==filter||(filter.length()==0)){returnnull;}intuidStartIndex=filter.lastIndexOf("uid");intuidEndIndex=filter.lastIndexOf("/pid");if(0>uidStartIndex){returnnull;}if(0>=uidEndIndex){uidEndIndex=filter.length();}filter=filter.substring(uidStartIndex+4,uidEndIndex);try{StringstrUid=filter.replaceAll("\n","");if(isNumeriToUid(strUid)){intuid=Integer.valueOf(strUid);filter=String.format("u0_a%d",uid-10000);returnfilter;}}catch(Exceptione){returnnull;}returnnull;}
作者:小道安全&掘金著作权归作者所有。