近日,国家食品药品监督管理局表示,在长春长生生物科技有限公司查获一批生产记录虚假的狂犬病疫苗,并对其相关违法行为进行立案调查。据媒体报道,包括长生生物、武汉生物、深圳泰康等在内的很多疫苗公司都是由同一三人控股,涉嫌欺诈的也不少。公司创始人刘说:我们90%的孩子都接种了这些公司的疫苗,这样的人至少应该被判无期徒刑,不得假释!
作者简介
很高兴在新的一周开始时再次见到你!
本文由普通程序员提交,分享检测开放软件的方法,希望对大家有所帮助!
普通程序员的博客地址:
https://www.jianshu.com/u/38b409cda5af
简介
最近有业务需求,要求app进行软件多开、hook框架、模拟器等本地安全测试。防止作弊。
反作弊一直是个老掉牙的问题,软件多开检测往往是反作弊的重要环节。在搜索数据的过程中,发现多开软件公司对反多开措施进行了针对性的升级,甚至连非常新的数据都杀不死。
所以站在前辈的肩膀上继续学习吧。
参考方案
参考方案来自以下两个帖子
安卓多开/拆分检测
https://blog . darkness 463 . top/2018/05/04/Android-Virtual-Check/
安卓虚拟机多开检测
https://www.jianshu.com/p/216d65d9971e
本文的方案简单总结为四点:
1.私有文件路径检测;
2.应用列表检测;
3.地图检测;
4.ps检测;
这里不贴代码,这四个方案的测试结果如下:
/proc/net/tcp6文件
最后,扫描tcp文件并格式化端口的关键代码
string TCP 6 = CommAnDutil . GetSingleInstance()。exec(" cat/proc/net/TCP 6 ");
if(TextUtils.isEmpty(tcp6))返回;
string[]line = TCP 6 . split(" n ");
ArrayList<。整数>portList = newArrayList & lt>。();
for( inti = 0,len = lines.lengthi <。leni++) {
int localhost = line[I]。indexOf(" 0100007F:");
//127 . 0 . 0 . 1的位置:
if(Localhost & lt;0)继续;
string SinglePort = line[I]。子串(localHost + 9,localHost+13);
//拦截端口
整数端口= Integer.parseInt(singlePort,16);
//十六进制到十进制
portList.add(端口);
}
步骤2:发起连接请求
接下来,启动一个线程连接到每个端口,并发送一个自定义消息。这个消息只需要使用app的包名(多开软件很大程度上会挂接getPackageName方法,所以简单按照多开软件)
尝试{
//发起连接并发送消息
socket socket = NewSocket(" 127 . 0 . 0 . 1 ",端口);
socket . setsotimeout(2000);
output stream output stream = socket . getoutput stream();
outputStream.write((secret + "n ")。getBytes(" utf-8 ");
output stream . flush();
socket . shut down output();
//获取输入流,这里不做处理,只打印。
InputStream InputStream = socket . getinputstream();
BufferedReader BufferedReader = new BufferedReader(new inputStream reader(inputStream));
字符串信息= null
while((info = bufferedreader . readline())!= null) {
Log.i(TAG," client thread:"+info);
}
bufferedreader . close();
inputstream . close();
socket . close();
} catch(ConnectException e) {
Log.i(TAG,port+" port denied ");
}
主动连接的过程完成,自己启动的app(可能是本体,也可能是克隆)接收到消息并进行处理。
第三步:成为一个接收者,等待连接
下一步是成为接收者,监听一个端口,等待可能的app连接(可能是本体或者克隆体)。
privatevoidstartServer(字符串机密){
random random = new random();
服务器套接字服务器套接字=空;
尝试{
server socket = newServerSocket();
server socket . bind(Newinetsocketaddress(" 127 . 0 . 0 . 1 ",
random . Nextint(55534)+10000));
//打开10000到65535之间的端口
while( true) {
socket socket = Serversocket . accept();
ReadThread ReadThread = new ReadThread(secret,socket);
//如果这个方案中使用了很多应用,或者每个连接都是线程化的。
readthread . start();
//ServerSocket . close();
}
} catch(BindException e) {
startServer(机密);//可能会永远循环
} catch(IOException e) {
e . printstacktrace();
}
}
为了避免在打开端口时打开已经打开的端口,BindExecption被主动捕获并迭代调用,这可能导致无限循环。如果害怕无限循环,可以添加一个类似于ConcurrentHashMap最差尝试的计数值。不过实际考的也没那么差。随机端口范围10000~65535。最多试两次。
每个处理线程做的就是匹配密文,对应一个克隆体或者本体发送的密文。这里,接收者主动运行一个空指针来杀死自己。待遇有点像三体黑暗森林法则,先暴露谁先死。
privateclasreadthreadextendsthread {
privateReadThread(字符串机密,套接字套接字){
InputStream inputStream = null
尝试{
inputStream = socket . getinputstream();
byte buffer[]= new byte[1024 * 4];
int temp = 0;
while((temp = InputStream . read(buffer))!= - 1) {
String result = newString(缓冲区,0,temp);
if(result.contains(secret)) {
//System . exit(0);
//process . killprocess(process . mypid());
NullPointTV . SetText(" ");
}
}
inputstream . close();
socket . close();
} catch(IOException e) {
e . printstacktrace();
}
}
}
*由于端口通信需要互联网许可,此库不会通过网络上传任何隐私。
测试结果
以前面提到的那些模型和多开放软件作为测试样本,测试结果基本上是kill。由于安卓机型繁多,真实的机器覆盖测试不完整,有空人去git问个问题;;
它可以在应用程序的主进程中调用一次。模拟器在演示中进行模拟器判断,因为会抢localhost。
本文中的方案已集成到
EasyProtectorLib
https://jcenter . bintray . com/com/lahm/library/easy-protector-release/
Github地址:
https://github.com/lamster2018/EasyProtector
参见中文文档:
https://www.jianshu.com/p/c37b1bdb4757
请使用方法virtualapkcheckutil . get single instance()。checkbyport listening(string secret);
待办事项
1.如果检测到有过度打开,应该提供回调让开发者自己处理;
2.同样,应该可以使用ContentProvider
1.《软件多开 一行代码帮你检测Android多开软件》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《软件多开 一行代码帮你检测Android多开软件》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/jiaoyu/1016051.html