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++);
}
}
}