package cn.edu.buaa.act.sdp.malwaredetector.activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.ProgressBar; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.security.spec.PKCS8EncodedKeySpec; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import cn.edu.buaa.act.sdp.malwaredetector.Constant; import cn.edu.buaa.act.sdp.malwaredetector.R; import cn.edu.buaa.act.sdp.malwaredetector.smali.BaksmaliImpl; public class AntiVirusActivity extends ActionBarActivity { private static final int BUFFER = 1024; private static final String SMALI_FOLDER = "/mnt/sdcard/MalwareDetector/smali/"; private List<String> apiCallList; private PackageManager pm; private ProgressBar mProgressBar; public void unZip(String fileName, String filePath) throws Exception { File f = new File(getPackageManager().getApplicationInfo(fileName, 0).sourceDir); ZipFile zipFile = new ZipFile(f); Enumeration emu = zipFile.entries(); while (emu.hasMoreElements()) { ZipEntry entry = (ZipEntry) emu.nextElement(); if (entry.isDirectory()) { new File(filePath + entry.getName()).mkdirs(); continue; } BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry)); File file = new File(filePath + entry.getName()); File parent = file.getParentFile(); if (parent != null && (!parent.exists())) { parent.mkdirs(); } FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER); byte[] buf = new byte[BUFFER]; int len = 0; while ((len = bis.read(buf, 0, BUFFER)) != -1) { fos.write(buf, 0, len); } bos.flush(); bos.close(); bis.close(); } zipFile.close(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_anti_virus); // mProgressBar = (ProgressBar) findViewById(R.id.progress); // scanVirus(); List<PackageInfo> apps = getPackageManager().getInstalledPackages(0); List<PackageInfo> list = new ArrayList<>(); for (PackageInfo pkg : apps) { if ((pkg.applicationInfo.flags & pkg.applicationInfo.FLAG_SYSTEM) == 0) { list.add(pkg); // 解压缩 if (list.size() == 1) { try { // unZip(list.get(0).applicationInfo.sourceDir, "/mnt/sdcard/MalwareDetector/unzip/"); // unZip(list.get(0).packageName, "/mnt/sdcard/MalwareDetector/unzip/"); } catch (Exception e) { e.printStackTrace(); } } } } // baksmali BaksmaliImpl imp = new BaksmaliImpl(); // imp.decompile("/mnt/sdcard/MalwareDetector/unzip/classes.dex", SMALI_FOLDER); generateApiCallList(); parseSmali(); Log.e("yao", "ok"); } private void generateApiCallList() { apiCallList = new ArrayList<>(); try { InputStreamReader inputReader = new InputStreamReader(getResources().getAssets().open("APIcalls.txt")); BufferedReader bufReader = new BufferedReader(inputReader); String line; while((line = bufReader.readLine()) != null) { apiCallList.add(line); } } catch (Exception e) { e.printStackTrace(); } } private void parseSmali() { getFiles(SMALI_FOLDER); } private void getFiles(String path) { File root = new File(path); File[] files = root.listFiles(); for (File file : files) { if (file.isDirectory()) { getFiles(file.getAbsolutePath()); } else { readFileByLine(file); } } } private void readFileByLine(File file) { try { BufferedReader reader = new BufferedReader(new FileReader(file)); String line; StringBuilder builder = new StringBuilder(); while ((line = reader.readLine()) != null) { // URLs Pattern pattern = Pattern.compile("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"); Matcher matcher = pattern.matcher(line); if(matcher.find()) { Log.e("yao", "url::" + matcher.group()); } // IPs pattern = Pattern.compile("(?:[\\d]{1,3})\\.(?:[\\d]{1,3})\\.(?:[\\d]{1,3})\\.(?:[\\d]{1,3})"); matcher = pattern.matcher(line); if(matcher.find()) { Log.e("yao", "url::" + matcher.group()); } builder.append(line); } // api calls for(String api : apiCallList) { api = api.split("\\|")[0]; if (builder.indexOf(api) >= 0) { Log.e("yao", "api::" + api); } } } catch (IOException e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_anti_virus, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * scan all apks in your phone */ private void scanVirus() { pm = getPackageManager(); List<PackageInfo> infos = pm.getInstalledPackages(0); mProgressBar.setMax(infos.size()); int progress = 0; for (PackageInfo info : infos) { String dataDir = info.applicationInfo.dataDir; Log.d(Constant.TAG, dataDir); String sourceDir = info.applicationInfo.sourceDir; Log.d(Constant.TAG, sourceDir); mProgressBar.setProgress(progress++); } } }