From 68f5fee17c0ac437956e929aebd4ff6847d46a4e Mon Sep 17 00:00:00 2001 From: Tad Date: Sun, 21 Oct 2018 22:33:59 -0400 Subject: [PATCH] Many changes - Add back EventReceiver - Add back missing database bits - Request permissions - More Settings work - Tor handling - Service handling - Reformat code - Misc tweaks --- .idea/misc.xml | 2 +- app/src/main/AndroidManifest.xml | 22 +++++++++- .../malwarescanner/DatabaseManager.java | 3 ++ .../spotco/malwarescanner/DownloaderTask.java | 5 +++ .../spotco/malwarescanner/EventReceiver.java | 44 ++++++++++++++++++- .../spotco/malwarescanner/MainActivity.java | 16 +++++++ .../malwarescanner/SettingsFragment.java | 42 +++++++++++++++--- .../us/spotco/malwarescanner/Signatures.java | 1 - .../java/us/spotco/malwarescanner/Utils.java | 21 ++++++++- app/src/main/res/values/strings.xml | 6 +++ app/src/main/res/xml/fragment_settings.xml | 5 +++ 11 files changed, 156 insertions(+), 11 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 47eabe0..6faa303 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fb4f6fa..af46c16 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -13,7 +14,9 @@ android:largeHeap="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + tools:ignore="GoogleAppIndexingWarning"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/us/spotco/malwarescanner/DatabaseManager.java b/app/src/main/java/us/spotco/malwarescanner/DatabaseManager.java index d97932e..165266d 100644 --- a/app/src/main/java/us/spotco/malwarescanner/DatabaseManager.java +++ b/app/src/main/java/us/spotco/malwarescanner/DatabaseManager.java @@ -85,6 +85,7 @@ public class DatabaseManager { new DownloaderTask().execute(db.getUrl(), databasePath + "/" + db.getName()); } } + loadAllAvailableDatabases(true); } public void loadAllAvailableDatabases(boolean forceReload) { @@ -96,6 +97,8 @@ public class DatabaseManager { loadDatabase(dbLocation); } } + Signatures.MD5.put("44d88612fea8a8f36de82e1278abb02f".substring(0, Utils.prefs.getInt("database_hash_length", 12)), "Eicar-Test-Signature"); + System.gc(); } } diff --git a/app/src/main/java/us/spotco/malwarescanner/DownloaderTask.java b/app/src/main/java/us/spotco/malwarescanner/DownloaderTask.java index f4e4ed7..8f5ed9f 100644 --- a/app/src/main/java/us/spotco/malwarescanner/DownloaderTask.java +++ b/app/src/main/java/us/spotco/malwarescanner/DownloaderTask.java @@ -66,4 +66,9 @@ public class DownloaderTask extends AsyncTask { } return null; } + + @Override + protected final void onProgressUpdate(String... progress) { + + } } \ No newline at end of file diff --git a/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java b/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java index ec9b1c1..b76a63f 100644 --- a/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java +++ b/app/src/main/java/us/spotco/malwarescanner/EventReceiver.java @@ -17,5 +17,45 @@ along with this program. If not, see . */ package us.spotco.malwarescanner; -public class EventReceiver { -} +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; + +import java.io.File; +import java.util.HashSet; + +public class EventReceiver extends BroadcastReceiver { + + @Override + public final void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { + Utils.considerStartService(context); + } + if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { + if (intent.getDataString().contains(context.getPackageName())) { + Utils.considerStartService(context); //We've been updated, restart service + } else { + //scanApp(context, intent.getDataString());//An app was updated, scan it //TODO FIX ME + } + } + if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) { + //scanApp(context, intent.getDataString());//An app was installed, scan it //TODO FIX ME + } + } + + private static void scanApp(Context context, String appID) { + if (Utils.isServiceRunning(MalwareScannerService.class, context)) { + HashSet filesToScan = new HashSet<>(); + try { + filesToScan.add(new File(context.getPackageManager().getApplicationInfo(appID, PackageManager.GET_META_DATA).sourceDir)); + } catch (Exception e) { + e.printStackTrace(); + } + if (filesToScan.size() > 0) { + //new MalwareScanner(null, context, false).executeOnExecutor(Utils.getThreadPoolExecutor(), filesToScan); //TODO UPDATE ME + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java index 16258e0..7778d90 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MainActivity.java +++ b/app/src/main/java/us/spotco/malwarescanner/MainActivity.java @@ -17,12 +17,16 @@ along with this program. If not, see . */ package us.spotco.malwarescanner; +import android.Manifest; +import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; +import android.support.v4.content.ContextCompat; import android.view.MenuItem; public class MainActivity extends FragmentActivity { @@ -50,8 +54,20 @@ public class MainActivity extends FragmentActivity { fragmentManager.beginTransaction().add(R.id.main_fragment, scannerFragment, "MalwareScanner").commit(); activeFragment = scannerFragment; + requestPermissions(); + new Utils(this); new DatabaseManager(this); + if(Utils.useTor()) { + Utils.requestStartOrbot(this); + } + Utils.considerStartService(this); + } + + private void requestPermissions() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); + } } private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener diff --git a/app/src/main/java/us/spotco/malwarescanner/SettingsFragment.java b/app/src/main/java/us/spotco/malwarescanner/SettingsFragment.java index d3b6722..4c940b6 100644 --- a/app/src/main/java/us/spotco/malwarescanner/SettingsFragment.java +++ b/app/src/main/java/us/spotco/malwarescanner/SettingsFragment.java @@ -18,18 +18,17 @@ along with this program. If not, see . package us.spotco.malwarescanner; +import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.preference.PreferenceFragmentCompat; +import android.widget.Toast; /** * A simple {@link Fragment} subclass. */ -public class SettingsFragment extends PreferenceFragmentCompat { - - public SettingsFragment() { - } - +public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { @@ -41,4 +40,37 @@ public class SettingsFragment extends PreferenceFragmentCompat { setPreferencesFromResource(R.xml.fragment_settings, rootKey); } + @Override + public void onResume() { + super.onResume(); + Utils.prefs.registerOnSharedPreferenceChangeListener(this); + + } + + @Override + public void onPause() { + Utils.prefs.unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { + if(key.equals("network_use_tor")) { + if(prefs.getBoolean("network_use_tor", false)) { + if (!Utils.isOrbotInstalled(getContext())) { + prefs.edit().putBoolean("ONION_ROUTING", false).apply(); + Toast.makeText(getContext(), R.string.toast_orbot_unavailable, Toast.LENGTH_SHORT).show(); + } + } + } + + if(key.equals("scanner_realtime_enabled")) { + if(prefs.getBoolean("scanner_realtime_enabled", false)) { + Utils.considerStartService(getContext()); + } else { + Intent realtimeScanner = new Intent(getContext(), MalwareScannerService.class); + getContext().stopService(realtimeScanner); + } + } + } } diff --git a/app/src/main/java/us/spotco/malwarescanner/Signatures.java b/app/src/main/java/us/spotco/malwarescanner/Signatures.java index 60b0f12..8545af4 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Signatures.java +++ b/app/src/main/java/us/spotco/malwarescanner/Signatures.java @@ -21,7 +21,6 @@ import java.util.HashMap; public class Signatures { - public final static HashMap MD5 = new HashMap<>(); public final static HashMap SHA1 = new HashMap<>(); public final static HashMap SHA256 = new HashMap<>(); diff --git a/app/src/main/java/us/spotco/malwarescanner/Utils.java b/app/src/main/java/us/spotco/malwarescanner/Utils.java index c2da4fe..e517f65 100644 --- a/app/src/main/java/us/spotco/malwarescanner/Utils.java +++ b/app/src/main/java/us/spotco/malwarescanner/Utils.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.os.Build; import java.io.File; import java.net.HttpURLConnection; @@ -91,6 +92,20 @@ public class Utils { return false; } + public static void considerStartService(Context context) { + if (!isServiceRunning(MalwareScannerService.class, context)) { + boolean autostart = prefs.getBoolean("scanner_realtime_enabled", false); + if (autostart) { + Intent realtimeScanner = new Intent(context, MalwareScannerService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(realtimeScanner); + } else { + context.startService(realtimeScanner); + } + } + } + } + //Credit: https://stackoverflow.com/a/6758962 public static boolean isPackageInstalled(Context context, String packageID) { PackageManager pm = context.getPackageManager(); @@ -146,10 +161,14 @@ public class Utils { return listening; } + public static boolean useTor() { + return prefs.getBoolean("network_use_tor", false); + } + public static HttpURLConnection getConnection(String url) { try { HttpURLConnection connection; - if (prefs.getBoolean("network_use_tor", false)) { + if (useTor()) { waitUntilOrbotIsAvailable(); Proxy orbot = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 9050)); connection = (HttpURLConnection) new URL(url).openConnection(orbot); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a1eec0..a8f2cb0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,8 +9,14 @@ Settings + + Orbot is required for this feature + + Realtime Scanner + Realtime Scanning + Monitor for threats in realtime using settings below Scan apps Check apps on install Watch Internal storage diff --git a/app/src/main/res/xml/fragment_settings.xml b/app/src/main/res/xml/fragment_settings.xml index bc497dc..9ebc9e4 100644 --- a/app/src/main/res/xml/fragment_settings.xml +++ b/app/src/main/res/xml/fragment_settings.xml @@ -3,6 +3,11 @@ tools:context="us.spotco.malwarescanner.SettingsFragment"> +