diff --git a/app/build.gradle b/app/build.gradle index d7d1edc..d525c7f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { applicationId "us.spotco.malwarescanner" minSdkVersion 21 targetSdkVersion 26 - versionCode 18 + versionCode 19 versionName "1.9" } buildTypes { diff --git a/app/src/main/java/us/spotco/malwarescanner/Database.java b/app/src/main/java/us/spotco/malwarescanner/Database.java index e3398f8..c7de911 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Database.java +++ b/app/src/main/java/us/spotco/malwarescanner/Database.java @@ -40,13 +40,14 @@ class Database { return signaturesMD5.size() + signaturesSHA1.size() + signaturesSHA256.size(); } - public static void updateDatabase(ArrayList signatureDatabases) { + public static void updateDatabase(Context context, ArrayList signatureDatabases) { + initDatabase(context); for (SignatureDatabase signatureDatabase : signatureDatabases) { new Downloader().execute(signatureDatabase.getUrl(), databasePath + "/" + signatureDatabase.getName()); } } - public static void initDatabase(Context context) { + private static void initDatabase(Context context) { databasePath = new File(context.getFilesDir() + "/signatures/"); databasePath.mkdir(); diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java index 91aec0e..30fb432 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java +++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java @@ -53,7 +53,6 @@ public class MainActivity extends AppCompatActivity { logView.append("Powered by ClamAV signatures\n"); logView.append("\nDisclaimer: This is an extremely basic signature scanner\n\n"); - final Database database = new Database(logView); malwareScanner = new MalwareScanner(this, this, true); prefs = getSharedPreferences(BuildConfig.APPLICATION_ID, Context.MODE_PRIVATE); @@ -73,26 +72,6 @@ public class MainActivity extends AppCompatActivity { requestPermissions(); } - private void startScanner() { - malwareScanner = new MalwareScanner(this, this, true); - Set filesToScan = new HashSet<>(); - if (scanSystem) { - filesToScan.addAll(Utils.getFilesRecursive(Environment.getRootDirectory())); - } - if (scanApps) { - for (ApplicationInfo packageInfo : getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA)) { - filesToScan.add(new File(packageInfo.sourceDir)); - } - } - if (scanInternal) { - filesToScan.addAll(Utils.getFilesRecursive(Environment.getExternalStorageDirectory())); - } - if (scanExternal) { - filesToScan.addAll(Utils.getFilesRecursive(new File("/storage"))); - } - malwareScanner.execute(filesToScan); - } - @Override public final boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); @@ -110,10 +89,7 @@ public class MainActivity extends AppCompatActivity { public final boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.mnuUpdateDatabase: - Database.updateDatabase(Database.signatureDatabases); - if (Database.isDatabaseLoaded()) { - Database.loadDatabase(getApplicationContext(), false, Database.signatureDatabases); - } + updateDatabase(); break; case R.id.toggleRealtime: Intent realtimeScanner = new Intent(getApplicationContext(), MalwareScannerService.class); @@ -146,4 +122,32 @@ public class MainActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } + private void startScanner() { + malwareScanner = new MalwareScanner(this, this, true); + Set filesToScan = new HashSet<>(); + if (scanSystem) { + filesToScan.addAll(Utils.getFilesRecursive(Environment.getRootDirectory())); + } + if (scanApps) { + for (ApplicationInfo packageInfo : getPackageManager().getInstalledApplications(PackageManager.GET_META_DATA)) { + filesToScan.add(new File(packageInfo.sourceDir)); + } + } + if (scanInternal) { + filesToScan.addAll(Utils.getFilesRecursive(Environment.getExternalStorageDirectory())); + } + if (scanExternal) { + filesToScan.addAll(Utils.getFilesRecursive(new File("/storage"))); + } + malwareScanner.execute(filesToScan); + } + + private void updateDatabase() { + new Database((TextView) findViewById(R.id.txtLogOutput)); + Database.updateDatabase(this, Database.signatureDatabases); + if (Database.isDatabaseLoaded()) { + Database.loadDatabase(this, false, Database.signatureDatabases); + } + } + } diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java index 9a26982..53fb220 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScanner.java @@ -75,27 +75,31 @@ class MalwareScanner extends AsyncTask, Object, String> { publishProgress(filesToScan[0].size() + " files pending scan\n", true); Database.loadDatabase(context, true, Database.signatureDatabases); - publishProgress("Loaded database with " + Database.getSignatureCount() + " signatures\n", true); + if(Database.getSignatureCount() >= 0) { + publishProgress("Loaded database with " + Database.getSignatureCount() + " signatures\n", true); - //Get file hashes - publishProgress("Hashing files...", true); - for (File file : filesToScan[0]) { - getFileHashes(file); + //Get file hashes + publishProgress("Hashing files...", true); + for (File file : filesToScan[0]) { + getFileHashes(file); + } + publishProgress("Calculated MD5/SHA-1/SHA-256 hashes for all files\n", true); + + //Check the hashes + checkSignature("MD5", fileHashesMD5, Database.signaturesMD5); + checkSignature("SHA-1", fileHashesSHA1, Database.signaturesSHA1); + checkSignature("SHA-256", fileHashesSHA256, Database.signaturesSHA256); + + //Post + fileHashesMD5.clear(); + fileHashesSHA1.clear(); + fileHashesSHA256.clear(); + System.gc(); + Log.d("Thiea", "Scan completed in " + (SystemClock.elapsedRealtime() - scanTime) + " ms!"); + publishProgress("Scan completed in " + ((SystemClock.elapsedRealtime() - scanTime) / 1000) + " seconds!\n\n\n\n", true); + } else { + publishProgress("No database available, not scanning...", true); } - publishProgress("Calculated MD5/SHA-1/SHA-256 hashes for all files\n", true); - - //Check the hashes - checkSignature("MD5", fileHashesMD5, Database.signaturesMD5); - checkSignature("SHA-1", fileHashesSHA1, Database.signaturesSHA1); - checkSignature("SHA-256", fileHashesSHA256, Database.signaturesSHA256); - - //Post - fileHashesMD5.clear(); - fileHashesSHA1.clear(); - fileHashesSHA256.clear(); - System.gc(); - Log.d("Thiea", "Scan completed in " + (SystemClock.elapsedRealtime() - scanTime) + " ms!"); - publishProgress("Scan completed in " + ((SystemClock.elapsedRealtime() - scanTime) / 1000) + " seconds!\n\n\n\n", true); return null; }