Many changes

- Drop Trove, minimal benefit with Strings
- Finalize renaming
- Commonize server base URL
- IntelliJ Inspect Code
- Formatting
- Bump version
This commit is contained in:
Tad 2018-01-20 01:50:37 -05:00
parent 71fd67e3fd
commit fa9e4c0b15
10 changed files with 54 additions and 61 deletions

View file

@ -46,6 +46,5 @@ Goals
Credits
-------
- Trove (GPLv3): A memory efficient replacement for Java's Collections
- RecursiveFileObserver.java (GPLv3): Daniel Gultsch, ownCloud Inc., Bartek Przybylski
- Icons (Apache-2.0): Google/Android/AOSP

View file

@ -6,8 +6,8 @@ android {
applicationId "us.spotco.malwarescanner"
minSdkVersion 16
targetSdkVersion 26
versionCode 28
versionName "2.3"
versionCode 29
versionName "2.4"
}
buildTypes {
debug {
@ -31,5 +31,4 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation 'net.sf.trove4j:trove4j:3.0.3'
}

View file

@ -29,13 +29,13 @@
<service
android:name=".MalwareScannerService"
android:label="Theia Realtime Malware Scanner"
android:label="Realtime Malware Scanner"
android:enabled="true"
android:exported="false"/>
<receiver
android:name=".EventReceiver"
android:label="Theia Event Handler"
android:label="Event Handler"
android:enabled="true"
android:exported="true">
<intent-filter>

View file

@ -11,20 +11,20 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.net.HttpURLConnection;
import java.net.URL;
import gnu.trove.map.hash.THashMap;
import gnu.trove.set.hash.THashSet;
import java.util.HashMap;
import java.util.HashSet;
class Database {
private static TextView log = null;
private static File databasePath = null;
public final static THashSet<SignatureDatabase> signatureDatabases = new THashSet<>();
public final static HashSet<SignatureDatabase> signatureDatabases = new HashSet<>();
public final static String baseURL = "https://spotco.us/MalwareScannerSignatures/";
public final static THashMap<String, String> signaturesMD5 = new THashMap<>();
public final static THashMap<String, String> signaturesSHA1 = new THashMap<>();
public final static THashMap<String, String> signaturesSHA256 = new THashMap<>();
public final static HashMap<String, String> signaturesMD5 = new HashMap<>();
public final static HashMap<String, String> signaturesSHA1 = new HashMap<>();
public final static HashMap<String, String> signaturesSHA256 = new HashMap<>();
public Database(TextView log) {
Database.log = log;
@ -42,7 +42,7 @@ class Database {
return signaturesMD5.size() + signaturesSHA1.size() + signaturesSHA256.size();
}
public static void updateDatabase(Context context, THashSet<SignatureDatabase> signatureDatabases) {
public static void updateDatabase(Context context, HashSet<SignatureDatabase> signatureDatabases) {
initDatabase(context);
for (SignatureDatabase signatureDatabase : signatureDatabases) {
new Downloader().execute(signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName());
@ -57,37 +57,37 @@ class Database {
SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE);
if (prefs.getBoolean("SIGNATURES_EXTENDED", false)) {
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/bofhland_malware_attach.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/crdfam.clamav.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/doppelstern.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/hackingteam.hsb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/malware.expert.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/malwarehash.hsb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/porcupine.hsb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/rfxn.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/rogue.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/spamattach.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/spamimg.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow.attachments.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow_bad_cw.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow_extended_malware.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/winnow_malware.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "bofhland_malware_attach.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "crdfam.clamav.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "doppelstern.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "hackingteam.hsb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "malware.expert.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "malwarehash.hsb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "porcupine.hsb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "rfxn.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "rogue.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "spamattach.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "spamimg.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "winnow.attachments.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "winnow_bad_cw.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "winnow_extended_malware.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "winnow_malware.hdb"));
}
if (prefs.getBoolean("SIGNATURES_CLAMAV-MAIN", false)) {
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/main.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/main.hsb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "main.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "main.hsb"));
}
if (prefs.getBoolean("SIGNATURES_CLAMAV-DAILY", false)) {
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/daily.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/daily.hsb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "daily.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "daily.hsb"));
}
if (prefs.getBoolean("SIGNATURES_CLAMAV-ANDROID", true)) {
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/Android.hdb"));
signatureDatabases.add(new SignatureDatabase("https://spotco.us/Theia/Android.hsb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "Android.hdb"));
signatureDatabases.add(new SignatureDatabase(baseURL + "Android.hsb"));
}
}
public static void loadDatabase(Context context, boolean ignoreifLoaded, THashSet<SignatureDatabase> signatureDatabases) {
public static void loadDatabase(Context context, boolean ignoreifLoaded, HashSet<SignatureDatabase> signatureDatabases) {
if (!isDatabaseLoaded() || !ignoreifLoaded && isDatabaseLoaded()) {
initDatabase(context);
signaturesMD5.clear();
@ -139,7 +139,7 @@ class Database {
protected String doInBackground(String... strings) {
String url = strings[0];
File out = new File(strings[1]);
publishProgress("Downloading " + url);
publishProgress("Downloading " + url.replaceAll(baseURL, ""));
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setConnectTimeout(45000);

View file

@ -6,8 +6,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import java.io.File;
import gnu.trove.set.hash.THashSet;
import java.util.HashSet;
public class EventReceiver extends BroadcastReceiver {
@ -30,7 +29,7 @@ public class EventReceiver extends BroadcastReceiver {
private static void scanApp(Context context, String appID) {
if (Utils.isServiceRunning(MalwareScannerService.class, context)) {
THashSet<File> filesToScan = new THashSet<>();
HashSet<File> filesToScan = new HashSet<>();
try {
filesToScan.add(new File(context.getPackageManager().getApplicationInfo(appID, PackageManager.GET_META_DATA).sourceDir));
} catch (Exception e) {

View file

@ -17,12 +17,11 @@ import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import gnu.trove.map.hash.THashMap;
class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
private Context context = null;
@ -30,9 +29,9 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
private boolean userFacing = false;
private NotificationManager notificationManager = null;
private long scanTime = 0;
private final THashMap<String, File> fileHashesMD5 = new THashMap<>();
private final THashMap<String, File> fileHashesSHA1 = new THashMap<>();
private final THashMap<String, File> fileHashesSHA256 = new THashMap<>();
private final HashMap<String, File> fileHashesMD5 = new HashMap<>();
private final HashMap<String, File> fileHashesSHA1 = new HashMap<>();
private final HashMap<String, File> fileHashesSHA256 = new HashMap<>();
public MalwareScanner(Activity activity, Context context, boolean userFacing) {
this.context = context;
@ -114,7 +113,7 @@ class MalwareScanner extends AsyncTask<Set<File>, Object, String> {
logResult((String) objects[0], (boolean) objects[1]);
}
private void checkSignature(String hashType, THashMap<String, File> signaturesToCheck, THashMap<String, String> signatureDatabase) {
private void checkSignature(String hashType, HashMap<String, File> signaturesToCheck, HashMap<String, String> signatureDatabase) {
if (signatureDatabase.size() > 0) {
for (Map.Entry<String, File> file : signaturesToCheck.entrySet()) {
if (signatureDatabase.containsKey(file.getKey())) {

View file

@ -11,14 +11,13 @@ import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import java.io.File;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import gnu.trove.set.hash.THashSet;
public class MalwareScannerService extends Service {
private THashSet<RecursiveFileObserver> malwareMonitors = new THashSet<>();
private final HashSet<RecursiveFileObserver> malwareMonitors = new HashSet<>();
private ThreadPoolExecutor threadPoolExecutor = null;
private NotificationCompat.Builder foregroundNotification = null;
private NotificationManager notificationManager = null;
@ -55,7 +54,7 @@ public class MalwareScannerService extends Service {
return START_STICKY;
}
private final void addMalwareMonitor(String monitorPath) {
private void addMalwareMonitor(String monitorPath) {
malwareMonitors.add(new RecursiveFileObserver(monitorPath) {
@Override
public void onEvent(int event, String path) {
@ -64,7 +63,7 @@ public class MalwareScannerService extends Service {
case FileObserver.CLOSE_WRITE:
File file = new File(path);
if (file.exists() && /*file.length() > 0 &&*/ file.length() <= Utils.MAX_SCAN_SIZE_REALTIME) {
THashSet<File> filesToScan = new THashSet<>();
HashSet<File> filesToScan = new HashSet<>();
filesToScan.add(file);
new MalwareScanner(null, getApplicationContext(), false).executeOnExecutor(threadPoolExecutor, filesToScan);
}

View file

@ -3,20 +3,19 @@ package us.spotco.malwarescanner;
import android.os.FileObserver;
import java.io.File;
import java.util.HashSet;
import java.util.Stack;
import gnu.trove.set.hash.THashSet;
/**
* Copyright (C) 2012 Bartek Przybylski
* Copyright (C) 2015 ownCloud Inc.
* Copyright (C) 2016 Daniel Gultsch
* Taken from siacs/Conversations and tweaked a bit
*/
public abstract class RecursiveFileObserver {
abstract class RecursiveFileObserver {
private final String path;
private final THashSet<SingleFileObserver> mObservers = new THashSet<>();
private final HashSet<SingleFileObserver> mObservers = new HashSet<>();
public RecursiveFileObserver(String path) {
this.path = path;

View file

@ -7,7 +7,7 @@ class SignatureDatabase {
public SignatureDatabase(String url) {
this.url = url;
this.name = url.replaceAll("https://spotco.us/Theia/", "");
this.name = url.replaceAll(Database.baseURL, "");
}
public final String getUrl() {

View file

@ -6,11 +6,10 @@ import android.content.Intent;
import android.content.SharedPreferences;
import java.io.File;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import gnu.trove.set.hash.THashSet;
class Utils {
public final static int MAX_SCAN_SIZE = (1000 * 1000) * 80; //80MB
@ -35,14 +34,14 @@ class Utils {
return maxTheads;
}
public static THashSet<File> getFilesRecursive(File root) {
THashSet<File> filesAll = new THashSet<>();
public static HashSet<File> getFilesRecursive(File root) {
HashSet<File> filesAll = new HashSet<>();
File[] files = root.listFiles();
if (files != null && files.length > 0) {
for (File f : files) {
if (f.isDirectory()) {
THashSet<File> filesTmp = getFilesRecursive(f);
HashSet<File> filesTmp = getFilesRecursive(f);
if (filesTmp != null) {
filesAll.addAll(filesTmp);
}