diff --git a/README.md b/README.md index f88bcfd..954319f 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/app/build.gradle b/app/build.gradle index 6fe2593..e268542 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 23e47ec..9d5831d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,13 +29,13 @@ diff --git a/app/src/main/java/us/spotco/malwarescanner/Database.java b/app/src/main/java/us/spotco/malwarescanner/Database.java index 138f2b3..d2daad7 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Database.java +++ b/app/src/main/java/us/spotco/malwarescanner/Database.java @@ -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 signatureDatabases = new THashSet<>(); + public final static HashSet signatureDatabases = new HashSet<>(); + public final static String baseURL = "https://spotco.us/MalwareScannerSignatures/"; - public final static THashMap signaturesMD5 = new THashMap<>(); - public final static THashMap signaturesSHA1 = new THashMap<>(); - public final static THashMap signaturesSHA256 = new THashMap<>(); + public final static HashMap signaturesMD5 = new HashMap<>(); + public final static HashMap signaturesSHA1 = new HashMap<>(); + public final static HashMap 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 signatureDatabases) { + public static void updateDatabase(Context context, HashSet 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 signatureDatabases) { + public static void loadDatabase(Context context, boolean ignoreifLoaded, HashSet 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); diff --git a/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java b/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java index 8bcf6ec..2ff7f85 100644 --- a/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java +++ b/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java @@ -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 filesToScan = new THashSet<>(); + HashSet filesToScan = new HashSet<>(); try { filesToScan.add(new File(context.getPackageManager().getApplicationInfo(appID, PackageManager.GET_META_DATA).sourceDir)); } catch (Exception e) { diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java index ef333a2..d679750 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java @@ -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, Object, String> { private Context context = null; @@ -30,9 +29,9 @@ class MalwareScanner extends AsyncTask, Object, String> { private boolean userFacing = false; private NotificationManager notificationManager = null; private long scanTime = 0; - private final THashMap fileHashesMD5 = new THashMap<>(); - private final THashMap fileHashesSHA1 = new THashMap<>(); - private final THashMap fileHashesSHA256 = new THashMap<>(); + private final HashMap fileHashesMD5 = new HashMap<>(); + private final HashMap fileHashesSHA1 = new HashMap<>(); + private final HashMap fileHashesSHA256 = new HashMap<>(); public MalwareScanner(Activity activity, Context context, boolean userFacing) { this.context = context; @@ -114,7 +113,7 @@ class MalwareScanner extends AsyncTask, Object, String> { logResult((String) objects[0], (boolean) objects[1]); } - private void checkSignature(String hashType, THashMap signaturesToCheck, THashMap signatureDatabase) { + private void checkSignature(String hashType, HashMap signaturesToCheck, HashMap signatureDatabase) { if (signatureDatabase.size() > 0) { for (Map.Entry file : signaturesToCheck.entrySet()) { if (signatureDatabase.containsKey(file.getKey())) { diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java index 488353d..c460ac6 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java @@ -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 malwareMonitors = new THashSet<>(); + private final HashSet 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 filesToScan = new THashSet<>(); + HashSet filesToScan = new HashSet<>(); filesToScan.add(file); new MalwareScanner(null, getApplicationContext(), false).executeOnExecutor(threadPoolExecutor, filesToScan); } diff --git a/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java b/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java index f26054f..851e992 100644 --- a/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java +++ b/app/src/main/java/us/spotco/malwarescanner/RecursiveFileObserver.java @@ -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 mObservers = new THashSet<>(); + private final HashSet mObservers = new HashSet<>(); public RecursiveFileObserver(String path) { this.path = path; diff --git a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java index 40b41f4..2909bf6 100644 --- a/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java +++ b/app/src/main/java/us/spotco/malwarescanner/SignatureDatabase.java @@ -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() { diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java index 1a5f64e..7bc42c6 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Utils.java +++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java @@ -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 getFilesRecursive(File root) { - THashSet filesAll = new THashSet<>(); + public static HashSet getFilesRecursive(File root) { + HashSet filesAll = new HashSet<>(); File[] files = root.listFiles(); if (files != null && files.length > 0) { for (File f : files) { if (f.isDirectory()) { - THashSet filesTmp = getFilesRecursive(f); + HashSet filesTmp = getFilesRecursive(f); if (filesTmp != null) { filesAll.addAll(filesTmp); }