近日,國家食品藥品監(jiān)督管理局表示,在長春長生生物科技有限公司查獲一批生產(chǎn)記錄虛假的狂犬病疫苗,并對(duì)其相關(guān)違法行為進(jìn)行立案調(diào)查。據(jù)媒體報(bào)道,包括長生生物、武漢生物、深圳泰康等在內(nèi)的很多疫苗公司都是由同一三人控股,涉嫌欺詐的也不少。公司創(chuàng)始人劉說:我們90%的孩子都接種了這些公司的疫苗,這樣的人至少應(yīng)該被判無期徒刑,不得假釋!
作者簡介
很高興在新的一周開始時(shí)再次見到你!
本文由普通程序員提交,分享檢測開放軟件的方法,希望對(duì)大家有所幫助!
普通程序員的博客地址:
https://www.jianshu.com/u/38b409cda5af
簡介
最近有業(yè)務(wù)需求,要求app進(jìn)行軟件多開、hook框架、模擬器等本地安全測試。防止作弊。
反作弊一直是個(gè)老掉牙的問題,軟件多開檢測往往是反作弊的重要環(huán)節(jié)。在搜索數(shù)據(jù)的過程中,發(fā)現(xiàn)多開軟件公司對(duì)反多開措施進(jìn)行了針對(duì)性的升級(jí),甚至連非常新的數(shù)據(jù)都?xì)⒉凰馈?/p>
所以站在前輩的肩膀上繼續(xù)學(xué)習(xí)吧。
參考方案
參考方案來自以下兩個(gè)帖子
安卓多開/拆分檢測
https://blog . darkness 463 . top/2018/05/04/Android-Virtual-Check/
安卓虛擬機(jī)多開檢測
https://www.jianshu.com/p/216d65d9971e
本文的方案簡單總結(jié)為四點(diǎn):
1.私有文件路徑檢測;
2.應(yīng)用列表檢測;
3.地圖檢測;
4.ps檢測;
這里不貼代碼,這四個(gè)方案的測試結(jié)果如下:
/proc/net/tcp6文件
最后,掃描tcp文件并格式化端口的關(guān)鍵代碼
string TCP 6 = CommAnDutil . GetSingleInstance()。exec(" cat/proc/net/TCP 6 ");
if(TextUtils.isEmpty(tcp6))返回;
string[]line = TCP 6 . split(" n ");
ArrayList<。整數(shù)>portList = newArrayList & lt>。();
for( inti = 0,len = lines.lengthi <。leni++) {
int localhost = line[I]。indexOf(" 0100007F:");
//127 . 0 . 0 . 1的位置:
if(Localhost & lt;0)繼續(xù);
string SinglePort = line[I]。子串(localHost + 9,localHost+13);
//攔截端口
整數(shù)端口= Integer.parseInt(singlePort,16);
//十六進(jìn)制到十進(jìn)制
portList.add(端口);
}
步驟2:發(fā)起連接請(qǐng)求
接下來,啟動(dòng)一個(gè)線程連接到每個(gè)端口,并發(fā)送一個(gè)自定義消息。這個(gè)消息只需要使用app的包名(多開軟件很大程度上會(huì)掛接getPackageName方法,所以簡單按照多開軟件)
嘗試{
//發(fā)起連接并發(fā)送消息
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 ");
}
主動(dòng)連接的過程完成,自己啟動(dòng)的app(可能是本體,也可能是克隆)接收到消息并進(jìn)行處理。
第三步:成為一個(gè)接收者,等待連接
下一步是成為接收者,監(jiān)聽一個(gè)端口,等待可能的app連接(可能是本體或者克隆體)。
privatevoidstartServer(字符串機(jī)密){
random random = new random();
服務(wù)器套接字服務(wù)器套接字=空;
嘗試{
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);
//如果這個(gè)方案中使用了很多應(yīng)用,或者每個(gè)連接都是線程化的。
readthread . start();
//ServerSocket . close();
}
} catch(BindException e) {
startServer(機(jī)密);//可能會(huì)永遠(yuǎn)循環(huán)
} catch(IOException e) {
e . printstacktrace();
}
}
為了避免在打開端口時(shí)打開已經(jīng)打開的端口,BindExecption被主動(dòng)捕獲并迭代調(diào)用,這可能導(dǎo)致無限循環(huán)。如果害怕無限循環(huán),可以添加一個(gè)類似于ConcurrentHashMap最差嘗試的計(jì)數(shù)值。不過實(shí)際考的也沒那么差。隨機(jī)端口范圍10000~65535。最多試兩次。
每個(gè)處理線程做的就是匹配密文,對(duì)應(yīng)一個(gè)克隆體或者本體發(fā)送的密文。這里,接收者主動(dòng)運(yùn)行一個(gè)空指針來殺死自己。待遇有點(diǎn)像三體黑暗森林法則,先暴露誰先死。
privateclasreadthreadextendsthread {
privateReadThread(字符串機(jī)密,套接字套接字){
InputStream inputStream = null
嘗試{
inputStream = socket . getinputstream();
byte buffer[]= new byte[1024 * 4];
int temp = 0;
while((temp = InputStream . read(buffer))!= - 1) {
String result = newString(緩沖區(qū),0,temp);
if(result.contains(secret)) {
//System . exit(0);
//process . killprocess(process . mypid());
NullPointTV . SetText(" ");
}
}
inputstream . close();
socket . close();
} catch(IOException e) {
e . printstacktrace();
}
}
}
*由于端口通信需要互聯(lián)網(wǎng)許可,此庫不會(huì)通過網(wǎng)絡(luò)上傳任何隱私。
測試結(jié)果
以前面提到的那些模型和多開放軟件作為測試樣本,測試結(jié)果基本上是kill。由于安卓機(jī)型繁多,真實(shí)的機(jī)器覆蓋測試不完整,有空人去git問個(gè)問題;;
它可以在應(yīng)用程序的主進(jìn)程中調(diào)用一次。模擬器在演示中進(jìn)行模擬器判斷,因?yàn)闀?huì)搶localhost。
本文中的方案已集成到
EasyProtectorLib
https://jcenter . bintray . com/com/lahm/library/easy-protector-release/
Github地址:
https://github.com/lamster2018/EasyProtector
參見中文文檔:
https://www.jianshu.com/p/c37b1bdb4757
請(qǐng)使用方法virtualapkcheckutil . get single instance()。checkbyport listening(string secret);
待辦事項(xiàng)
1.如果檢測到有過度打開,應(yīng)該提供回調(diào)讓開發(fā)者自己處理;
2.同樣,應(yīng)該可以使用ContentProvider
1.《軟件多開 一行代碼幫你檢測Android多開軟件》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。
2.《軟件多開 一行代碼幫你檢測Android多開軟件》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/jiaoyu/1016051.html