mirror of
https://github.com/MaintainTeam/Hypatia.git
synced 2025-02-28 21:38:21 +03:00
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:
parent
71fd67e3fd
commit
fa9e4c0b15
10 changed files with 54 additions and 61 deletions
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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())) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue