diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..72f9cc18f2 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,39 @@ +DEVICE: + + +OS version: + + +**cSploit version:** + + +**busybox** *(installed or not):* + + +**Rooted with supersu?** + + +**logcat** *(filter it!):* +[How-to guide](https://forum.xda-developers.com/showthread.php?t=1726238) + +------------------------------------------------------------------------------------------------------------------------------ + +**Daemon specific questions** + +Go version: + + +OS: + + +Using Docker (incase of unofficial build.) + +Actions performed: + + +Logs: +------------------------------------------------------------------------------------------------------------------------------ + +**Issue:** +*Remember to search for issues alike before creating new one!* + diff --git a/LICENSE b/LICENSE index e55b3d471b..af14354692 100644 --- a/LICENSE +++ b/LICENSE @@ -2,7 +2,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 -Copyright (C) 2007 Free Software Foundation, Inc. +Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble @@ -207,7 +207,7 @@ To do so, attach the following notices to the program. It is safest to attach th GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -220,6 +220,6 @@ If the program does terminal interaction, make it output a short notice like thi The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ?about box?. -You should also get your employer (if you work as a programmer) or school, if any, to sign a ?copyright disclaimer? for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . +You should also get your employer (if you work as a programmer) or school, if any, to sign a ?copyright disclaimer? for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . -The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/README.md b/README.md index cb29e343b1..a6c7ce4105 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ +# cSploit is now considered EOL and is not being updated by the developers. Current version might not be functional on newer Android versions. We appreciate everyone who contributed to cSploit over the years. + + + # cSploit: Android network pentesting suite - + -[cSploit](http://www.csploit.org) is an open source (GPLed) Android network analysis and penetration suite which aims to be +[cSploit](http://www.csploit.org) is a [free/libre](https://gnu.org/philosophy/free-sw.html) and open source (GPLed) Android network analysis and penetration suite which aims to be **the most complete and advanced professional toolkit** for IT security experts/geeks to perform network security assessments on a mobile device. See more at [www.cSploit.org](http://www.csploit.org). -## Features: +## Features * Map your local network * Fingerprint hosts' operating systems and open ports @@ -17,10 +21,10 @@ See more at [www.cSploit.org](http://www.csploit.org). * Search hosts for **known vulnerabilities** via integrated Metasploit daemon * Adjust exploit settings, launch, and create shell consoles on exploited systems * More coming -* Forge tcp/udp packets +* Forge TCP/UDP packets * Perform man in the middle attacks (MITM) including: * Image, text, and video replacement-- replace your own content on unencrypted web pages - * javascript injection-- add your own javascript to unencrypted web pages. + * JavaScript injection-- add your own javascript to unencrypted web pages. * **password sniffing** ( with common protocols dissection ) * Capture pcap network traffic files * Real time **traffic manipulation** to replace images/text/inject into web pages @@ -31,7 +35,7 @@ See more at [www.cSploit.org](http://www.csploit.org). ## Tutorials: - + * [Use cSploit to get root shell on Metasploitable2](https://github.com/cSploit/android/wiki/%5BTutorial%5D-Use-cSploit-to-get-root-shell-on-Metasploitable2) * [Use cSploit for simple Man-in-the-Middle (MITM security demos](https://github.com/cSploit/android/wiki/%5BTutorial%5D-Use-cSploit-for-simple-Man-In-The-Middle-(MITM)-security-demos) @@ -41,33 +45,38 @@ Also see the [wiki](https://github.com/cSploit/android/wiki) for instructions on ## Requirements -* A **ROOTED** device running Android 2.3 (Gingerbread) or newer -* The device must have a BusyBox **full install**, this means with **every** utility installed ( not the partial installation ). If you do not have busybox already, you can get it [here](https://play.google.com/store/apps/details?id=stericson.busybox) or [here](https://play.google.com/store/apps/details?id=com.jrummy.busybox.installer) (note cSploit does not endorse any busybox installer. These are just two we found). +* A **ROOTED** Android version 2.3 (Gingerbread) or a newer version +* The Android OS must have a [BusyBox](http://www.busybox.net/about.html) **full installation** with **every** utility installed (not the partial installation). If you do not have busybox already, you can get it [here](https://play.google.com/store/apps/details?id=stericson.busybox) or [here](https://play.google.com/store/apps/details?id=com.jrummy.busybox.installer) (note cSploit does not endorse any busybox installer, these are just two we found). +* You must install SuperSU (it will work __only__ if you have it) ## Downloads -The latest release and pre-release versions are available on github: - -https://github.com/cSploit/android/releases +The latest release and pre-release versions are [available on GitHub](https://github.com/cSploit/android/releases). Or to save a click, [this link](https://github.com/cSploit/android/releases/latest) should always point to the most recent release. Additionally, you can get a fresh-from-the-source nightly at [www.cSploit.org/downloads](http://www.csploit.org/downloads). These nightly builds are generated more frequently than the releases. And while they may have the very latest features, they may also have the latest bugs, so be careful running them! +Moreover, the app is available in [the official F-Droid repo](https://f-droid.org/repository/browse/?fdid=org.csploit.android). + ## How to contribute -All contributions are welcome, from code to documentation to graphics to design suggestions to bug reports. Please use github to its fullest-- contribute Pull Requests, contribute tutorials or other wiki content-- whatever you have to offer, we can use it! +All contributions are welcome, from code to documentation to graphics to design suggestions to bug reports. Please use GitHub to its fullest-- contribute Pull Requests, contribute tutorials or other wiki content-- whatever you have to offer, we can use it! ## License -This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +This program is free software: you can redistribute it and/or modify it under the terms of the [GNU General Public License](https://www.gnu.org/licenses/gpl) as published by [the Free Software Foundation](https://www.fsf.org/), either version 3 of the License, or (at your option) any later version. ## Copyright Copyleft Margaritelli of Simone aka evilsocket and then fused with zANTI2 continued by @tux-mind and additional contributors. +## Support us + +[![Click here to lend your support to: cSploit, an open source penetration testing suite and make a donation at pledgie.com !](https://pledgie.com/campaigns/30393.png?skin_name=chrome)](https://pledgie.com/campaigns/30393) + [![Click here to lend your support to: cSploit and make a donation at www.paypal.com](https://www.paypalobjects.com/en_GB/i/btn/btn_donate_LG.gif?skin_name=chrome)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=FTKXDCBEDMW9G&lc=GB&item_name=cSploit¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHosted) ## Disclaimer -***Note: cSploit is intended to be used for legal security purposes only, and you should only use it to protect networks/hosts you own or have permission to test. Any other use is not the responsibility of the developer(s). Be sure that you understand and are complying with the cSploit licenses and laws in your area. In other words, don't be stupid, don't be an asshole, and use this tool responsibly and legally.*** \ No newline at end of file +***Note: cSploit is intended to be used for legal security purposes only, and you should only use it to protect networks/hosts you own or have permission to test. Any other use is not the responsibility of the developer(s). Be sure that you understand and are complying with the cSploit licenses and laws in your area. In other words, don't be stupid, don't be an asshole, and use this tool responsibly and legally.*** diff --git a/build.gradle b/build.gradle index c0bd27756b..e97f625189 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { + google() jcenter() - mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.4.0-beta6' + classpath 'com.android.tools.build:gradle:3.3.0-alpha12' } } allprojects { repositories { + google() jcenter() - mavenCentral() } } diff --git a/cSploit/.gitignore b/cSploit/.gitignore index 75f32e75b2..d337a7a18f 100644 --- a/cSploit/.gitignore +++ b/cSploit/.gitignore @@ -1,7 +1,6 @@ obj libs dist -src/main/jniLibs *.so *.jks *.tar.* diff --git a/cSploit/build.gradle b/cSploit/build.gradle index ffa986128a..41ac0b3288 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -1,47 +1,46 @@ buildscript { repositories { + google() jcenter() - mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.4.0-beta6' + classpath 'com.android.tools.build:gradle:3.3.0-alpha12' } } -def getDate() { - return Calendar.getInstance().getTimeInMillis(); -} - allprojects { repositories { + google() jcenter() - mavenCentral() } } apply plugin: 'com.android.application' dependencies { - compile 'com.android.support:support-v4:23.0.1' - compile 'com.android.support:appcompat-v7:23.0.1' - compile 'com.android.support:design:23.0.1' - compile 'com.android.support:preference-v7:23.0.1' - compile 'org.apache.commons:commons-compress:1.10' - compile 'commons-net:commons-net:3.3' - compile 'com.github.zafarkhaja:java-semver:0.9.0' - compile 'org.unbescape:unbescape:1.1.1.RELEASE' - compile 'org.msgpack:msgpack:0.6.12' - compile 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3' - compile 'org.tukaani:xz:1.5' - compile 'ch.acra:acra:4.6.2' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'androidx.preference:preference:1.0.0' + implementation 'androidx.multidex:multidex:2.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'org.apache.commons:commons-compress:1.18' + implementation 'commons-net:commons-net:3.6' + implementation 'com.github.zafarkhaja:java-semver:0.9.0' + implementation 'org.unbescape:unbescape:1.1.6.RELEASE' + implementation 'org.msgpack:msgpack:0.6.12' + implementation 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3' + implementation 'org.tukaani:xz:1.8' + implementation 'ch.acra:acra-http:5.2.0' + implementation 'ch.acra:acra-notification:5.2.0' + testImplementation 'junit:junit:4.12' } android { - compileSdkVersion 23 - buildToolsVersion '23.0.1' + compileSdkVersion 28 + buildToolsVersion '28.0.3' compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } packagingOptions { @@ -50,10 +49,10 @@ android { } defaultConfig { - minSdkVersion 9 - targetSdkVersion 22 + minSdkVersion 14 + targetSdkVersion 28 versionCode 4 - versionName "1.6.2" + versionName "1.7.0-unstable" if(System.getenv("NIGHTLY_BUILD")) { versionName += "+" + System.getenv("NIGHTLY_BUILD_COMMIT").substring(0, 7) } @@ -80,8 +79,8 @@ android { buildTypes { debug { - buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + getDate() + "L)" - buildConfigField "String", "BUILD_NAME", "\"" + System.getenv("USER") + "\""; + buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + Calendar.getInstance().getTimeInMillis() + "L)" + buildConfigField "String", "BUILD_NAME", "\"" + System.getenv("USER") + "\"" minifyEnabled false shrinkResources false debuggable true @@ -90,8 +89,8 @@ android { multiDexEnabled true } release { - buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + getDate() + "L)" - buildConfigField "String", "BUILD_NAME", "\"" + System.getenv("USER") + "\""; + buildConfigField "java.util.Date", "BUILD_TIME", "new java.util.Date(" + Calendar.getInstance().getTimeInMillis() + "L)" + buildConfigField "String", "BUILD_NAME", "\"" + System.getenv("USER") + "\"" if (System.getenv("KEYSTORE_FILE") != null) { signingConfig signingConfigs.release } @@ -99,18 +98,4 @@ android { return true } } - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - jniLibs.srcDir 'src/org/csploit/android/jniLibs' - } - - instrumentTest.setRoot('tests') - } } diff --git a/cSploit/jni b/cSploit/jni index 5d58371006..02a6b6a46e 160000 --- a/cSploit/jni +++ b/cSploit/jni @@ -1 +1 @@ -Subproject commit 5d58371006ad73c6d3ebf766cdfcf774822fd511 +Subproject commit 02a6b6a46eca27051e4d6558af1d83da56afb79d diff --git a/cSploit/AndroidManifest.xml b/cSploit/src/main/AndroidManifest.xml similarity index 91% rename from cSploit/AndroidManifest.xml rename to cSploit/src/main/AndroidManifest.xml index 84618a1962..e835cfaa72 100644 --- a/cSploit/AndroidManifest.xml +++ b/cSploit/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -7,21 +8,27 @@ - - + + + android:theme="@style/AppTheme" + android:resizeableActivity="true"> + + + + + - - + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.content.SharedPreferences; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; + +public class ActionActivity extends AppCompatActivity { + + ActionFragment f; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SharedPreferences themePrefs = getSharedPreferences("THEME", 0); + if (themePrefs.getBoolean("isDark", false)) + setTheme(R.style.DarkTheme); + else + setTheme(R.style.AppTheme); + setContentView(R.layout.main); + if (findViewById(R.id.mainframe) != null) { + if (savedInstanceState != null) { + return; + } + f = new ActionFragment(); + getSupportFragmentManager().beginTransaction() + .add(R.id.mainframe, f).commit(); + } + } + + @Override + public void onBackPressed() { + f.onBackPressed(); + } +} \ No newline at end of file diff --git a/cSploit/src/main/java/org/csploit/android/ActionFragment.java b/cSploit/src/main/java/org/csploit/android/ActionFragment.java new file mode 100644 index 0000000000..e6a8cf08dc --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/ActionFragment.java @@ -0,0 +1,153 @@ +package org.csploit.android; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import org.csploit.android.core.Plugin; +import org.csploit.android.core.System; +import org.csploit.android.gui.dialogs.FinishDialog; +import org.csploit.android.net.Target; + +import java.util.ArrayList; + +public class ActionFragment extends Fragment { + + private ArrayList mAvailable = null; + private ListView theList; + private Target mTarget; + + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + return inflater.inflate(R.layout.actions_layout, container, false); + } + + @Override + public void onViewCreated(View v, Bundle savedInstanceState) { + SharedPreferences themePrefs = getActivity().getSharedPreferences("THEME", 0); + Boolean isDark = themePrefs.getBoolean("isDark", false); + if (isDark) { + getActivity().setTheme(R.style.DarkTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window_dark)); + } + else { + getActivity().setTheme(R.style.AppTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window)); + } + mTarget = org.csploit.android.core.System.getCurrentTarget(); + + if (mTarget != null) { + getActivity().setTitle("cSploit > " + mTarget); + ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); + theList = (ListView) getActivity().findViewById(R.id.android_list); + mAvailable = System.getPluginsForTarget(); + ActionsAdapter mActionsAdapter = new ActionsAdapter(); + theList.setAdapter(mActionsAdapter); + theList.setOnItemClickListener(new ListView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + if (System.checkNetworking(getActivity())) { + Plugin plugin = mAvailable.get(position); + System.setCurrentPlugin(plugin); + + if (plugin.hasLayoutToShow()) { + Toast.makeText(getActivity(), getString(R.string.selected) + getString(plugin.getName()), Toast.LENGTH_SHORT).show(); + + startActivity(new Intent( + getActivity(), + plugin.getClass() + )); + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + } else + plugin.onActionClick(getActivity().getApplicationContext()); + } + } + }); + } else { + new FinishDialog(getString(R.string.warning), getString(R.string.something_went_wrong), getActivity()).show(); + } + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + + getActivity().onBackPressed(); + + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + public void onBackPressed() { + getActivity().finish(); + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + } + + public class ActionsAdapter extends ArrayAdapter { + public ActionsAdapter() { + super(getActivity(), R.layout.actions_list_item, mAvailable); + } + + @SuppressLint("NewApi") + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + ActionHolder holder; + + if (row == null) { + LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater.inflate(R.layout.actions_list_item, parent, false); + if (getActivity().getSharedPreferences("THEME", 0).getBoolean("isDark", false)) + row.setBackgroundResource(R.drawable.card_background_dark); + holder = new ActionHolder(); + + holder.icon = (ImageView) (row != null ? row.findViewById(R.id.actionIcon) : null); + holder.name = (TextView) (row != null ? row.findViewById(R.id.actionName) : null); + holder.description = (TextView) (row != null ? row.findViewById(R.id.actionDescription) : null); + if (row != null) row.setTag(holder); + + } else holder = (ActionHolder) row.getTag(); + + Plugin action = mAvailable.get(position); + + holder.icon.setImageResource(action.getIconResourceId()); + holder.name.setText(getString(action.getName())); + holder.description.setText(getString(action.getDescription())); + + return row; + } + + public class ActionHolder { + ImageView icon; + TextView name; + TextView description; + } + } + +} \ No newline at end of file diff --git a/cSploit/src/org/csploit/android/CSploitApplication.java b/cSploit/src/main/java/org/csploit/android/CSploitApplication.java similarity index 65% rename from cSploit/src/org/csploit/android/CSploitApplication.java rename to cSploit/src/main/java/org/csploit/android/CSploitApplication.java index f356a7256d..1bfddc1ce7 100644 --- a/cSploit/src/org/csploit/android/CSploitApplication.java +++ b/cSploit/src/main/java/org/csploit/android/CSploitApplication.java @@ -19,11 +19,18 @@ package org.csploit.android; import android.app.Application; +import android.content.Context; import android.content.SharedPreferences; +import androidx.multidex.MultiDex; import org.acra.ACRA; -import org.acra.ReportingInteractionMode; -import org.acra.annotation.ReportsCrashes; +import org.acra.annotation.AcraCore; +import org.acra.annotation.AcraHttpSender; +import org.acra.annotation.AcraNotification; +import org.acra.config.CoreConfigurationBuilder; +import org.acra.config.HttpSenderConfigurationBuilder; +import org.acra.config.NotificationConfigurationBuilder; +import org.acra.data.StringFormat; import org.acra.sender.HttpSender; import org.csploit.android.core.System; import org.csploit.android.plugins.ExploitFinder; @@ -39,19 +46,24 @@ import java.net.NoRouteToHostException; -@ReportsCrashes( +@AcraHttpSender( httpMethod = HttpSender.Method.PUT, - reportType = HttpSender.Type.JSON, - formUri = "http://csploit.iriscouch.com/acra-csploit/_design/acra-storage/_update/report", - formUriBasicAuthLogin = "android", - formUriBasicAuthPassword = "DEADBEEF", - mode = ReportingInteractionMode.DIALOG, - resDialogText = R.string.crash_dialog_text, - resDialogIcon = R.drawable.dsploit_icon, - resDialogTitle = R.string.crash_dialog_title, - resDialogCommentPrompt = R.string.crash_dialog_comment + uri = "http://csploit.iriscouch.com/acra-csploit/_design/acra-storage/_update/report", + basicAuthLogin = "android", + basicAuthPassword = "DEADBEEF" ) +@AcraNotification ( + resChannelName = R.string.csploitChannelId, + resText = R.string.crash_dialog_text, + resIcon = R.drawable.dsploit_icon, + resTitle = R.string.crash_dialog_title, + resCommentPrompt = R.string.crash_dialog_comment +) + +@AcraCore(applicationLogFile = "/cSploitd.log") + public class CSploitApplication extends Application { + @Override public void onCreate() { SharedPreferences themePrefs = getSharedPreferences("THEME", 0); @@ -75,7 +87,11 @@ public void onCreate() { System.errorLogging(e); } - ACRA.setConfig(ACRA.getConfig().setApplicationLogFile(System.getCorePath() + "/cSploitd.log")); + CoreConfigurationBuilder builder = new CoreConfigurationBuilder(this); + builder.setBuildConfigClass(BuildConfig.class).setReportFormat(StringFormat.JSON); + builder.getPluginConfigurationBuilder(HttpSenderConfigurationBuilder.class); + builder.getPluginConfigurationBuilder(NotificationConfigurationBuilder.class); + ACRA.init(this, builder); // load system modules even if the initialization failed System.registerPlugin(new RouterPwn()); @@ -88,4 +104,11 @@ public void onCreate() { System.registerPlugin(new MITM()); System.registerPlugin(new PacketForger()); } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + ACRA.init(this); + } } diff --git a/cSploit/src/main/java/org/csploit/android/MainActivity.java b/cSploit/src/main/java/org/csploit/android/MainActivity.java new file mode 100644 index 0000000000..2584817084 --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/MainActivity.java @@ -0,0 +1,100 @@ + +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.Manifest; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Bundle; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AppCompatActivity; +import android.widget.Toast; + +public class MainActivity extends AppCompatActivity { + + MainFragment f; + final static int MY_PERMISSIONS_WANTED = 1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + NotificationChannel mChannel = new NotificationChannel(getString(R.string.csploitChannelId), + getString(R.string.cSploitChannelDescription), NotificationManager.IMPORTANCE_DEFAULT); + NotificationManager mNotificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + if (mNotificationManager != null) { + mNotificationManager.createNotificationChannel(mChannel); + } + } + SharedPreferences themePrefs = getSharedPreferences("THEME", 0); + if (themePrefs.getBoolean("isDark", false)) + setTheme(R.style.DarkTheme); + else + setTheme(R.style.AppTheme); + setContentView(R.layout.main); + if (findViewById(R.id.mainframe) != null) { + if (savedInstanceState != null) { + return; + } + f = new MainFragment(); + getSupportFragmentManager().beginTransaction() + .add(R.id.mainframe, f).commit(); + } + verifyPerms(); + } + + public void verifyPerms() { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, + Manifest.permission.READ_PHONE_STATE) + != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, + Manifest.permission.WAKE_LOCK) + != PackageManager.PERMISSION_GRANTED) + { + ActivityCompat.requestPermissions(this, + new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, + Manifest.permission.WAKE_LOCK}, + MY_PERMISSIONS_WANTED); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case MY_PERMISSIONS_WANTED: { + // If request is cancelled, the result arrays are empty. + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, R.string.permissions_succeed, Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(this, R.string.permissions_fail, Toast.LENGTH_LONG).show(); + finish(); + } + } + } + } +} \ No newline at end of file diff --git a/cSploit/src/main/java/org/csploit/android/MainFragment.java b/cSploit/src/main/java/org/csploit/android/MainFragment.java new file mode 100644 index 0000000000..6f65344e45 --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/MainFragment.java @@ -0,0 +1,1338 @@ +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.graphics.Typeface; +import android.net.ConnectivityManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.view.ActionMode; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import org.csploit.android.core.Child; +import org.csploit.android.core.Client; +import org.csploit.android.core.CrashReporter; +import org.csploit.android.core.Logger; +import org.csploit.android.core.ManagedReceiver; +import org.csploit.android.core.MultiAttackService; +import org.csploit.android.core.Plugin; +import org.csploit.android.core.System; +import org.csploit.android.events.Event; +import org.csploit.android.gui.dialogs.AboutDialog; +import org.csploit.android.gui.dialogs.ChoiceDialog; +import org.csploit.android.gui.dialogs.ConfirmDialog; +import org.csploit.android.gui.dialogs.ConfirmDialog.ConfirmDialogListener; +import org.csploit.android.gui.dialogs.ErrorDialog; +import org.csploit.android.gui.dialogs.FatalDialog; +import org.csploit.android.gui.dialogs.InputDialog; +import org.csploit.android.gui.dialogs.InputDialog.InputDialogListener; +import org.csploit.android.gui.dialogs.ListChoiceDialog; +import org.csploit.android.gui.dialogs.MultipleChoiceDialog; +import org.csploit.android.gui.dialogs.SpinnerDialog; +import org.csploit.android.gui.dialogs.SpinnerDialog.SpinnerDialogListener; +import org.csploit.android.helpers.ThreadHelper; +import org.csploit.android.net.Network; +import org.csploit.android.net.Target; +import org.csploit.android.plugins.ExploitFinder; +import org.csploit.android.plugins.Inspector; +import org.csploit.android.plugins.LoginCracker; +import org.csploit.android.plugins.PacketForger; +import org.csploit.android.plugins.PortScanner; +import org.csploit.android.plugins.RouterPwn; +import org.csploit.android.plugins.Sessions; +import org.csploit.android.plugins.Traceroute; +import org.csploit.android.plugins.mitm.MITM; +import org.csploit.android.services.Services; +import org.csploit.android.services.UpdateChecker; +import org.csploit.android.services.UpdateService; +import org.csploit.android.services.receivers.MsfRpcdServiceReceiver; +import org.csploit.android.services.receivers.NetworkRadarReceiver; +import org.csploit.android.update.CoreUpdate; +import org.csploit.android.update.MsfUpdate; +import org.csploit.android.update.RubyUpdate; +import org.csploit.android.update.Update; + +import java.io.IOException; +import java.net.NoRouteToHostException; +import java.util.ArrayList; +import java.util.List; +import java.util.Observable; +import java.util.Observer; +import java.util.Timer; +import java.util.TimerTask; + +import static org.csploit.android.services.UpdateChecker.UPDATE_AVAILABLE; +import static org.csploit.android.services.UpdateChecker.UPDATE_CHECKING; +import static org.csploit.android.services.UpdateChecker.UPDATE_NOT_AVAILABLE; + +@SuppressLint("NewApi") +public class MainFragment extends Fragment { + private String EMPTY_LIST_MESSAGE = ""; + private static final int WIFI_CONNECTION_REQUEST = 1012; + private boolean isAnyNetInterfaceAvailable = false; + private TargetAdapter mTargetAdapter = null; + private NetworkRadarReceiver mRadarReceiver = new NetworkRadarReceiver(); + private UpdateReceiver mUpdateReceiver = new UpdateReceiver(); + private WipeReceiver mWipeReceiver = new WipeReceiver(); + private MsfRpcdServiceReceiver mMsfReceiver = new MsfRpcdServiceReceiver(); + private ConnectivityReceiver mConnectivityReceiver = new ConnectivityReceiver(); + private Menu mMenu = null; + private TextView mEmptyTextView = null; + private Toast mToast = null; + private TextView mTextView = null; + private long mLastBackPressTime = 0; + private ActionMode mActionMode = null; + private ListView lv; + private boolean isRootMissing = false; + private String[] mIfaces = null; + private boolean mIsCoreInstalled = false; + private boolean mIsDaemonBeating = false; + private boolean mIsConnectivityAvailable = false; + private boolean mIsUpdateDownloading = false; + private boolean mHaveAnyWifiInterface = true; // TODO: check is device have a wifi interface + private boolean mOfflineMode = false; + + @Override + public void onActivityResult(int requestCode, int resultCode, + Intent intent) { + if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == AppCompatActivity.RESULT_OK + && intent.hasExtra(WifiScannerFragment.CONNECTED)) { + init(); + } + } + + private void onInitializationError(final String message) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + new FatalDialog(getString(R.string.initialization_error), + message, message.contains(">"), + getActivity()).show(); + } + }); + } + + private void onCoreUpdated() { + System.onCoreInstalled(); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + init(); + startAllServices(); + notifyMenuChanged(); + } + }); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + return inflater.inflate(R.layout.target_layout, container, false); + } + + @Override + public void onViewCreated(View v, Bundle savedInstanceState) { + SharedPreferences themePrefs = getActivity().getSharedPreferences("THEME", 0); + Boolean isDark = themePrefs.getBoolean("isDark", false); + if (isDark) { + getActivity().setTheme(R.style.DarkTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window_dark)); + } else { + getActivity().setTheme(R.style.AppTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window)); + } + mEmptyTextView = (TextView) v.findViewById(R.id.emptyTextView); + lv = (ListView) v.findViewById(R.id.android_list); + mTextView = (TextView) v.findViewById(R.id.textView); + + lv.setOnItemClickListener(new ListView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + if (mActionMode != null) { + mTargetAdapter.toggleSelection(position); + return; + } + + Target target = (Target) mTargetAdapter.getItem(position); + System.setCurrentTarget(target); + + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + + startActivityForResult(new Intent(getActivity(), + ActionActivity.class), WIFI_CONNECTION_REQUEST); + + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + } + }); + + Toast.makeText(getActivity(), + getString(R.string.selected_) + System.getCurrentTarget(), + Toast.LENGTH_SHORT).show(); + + } + }); + lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + Target t = (Target) mTargetAdapter.getItem(position); + if (t.getType() == Target.Type.NETWORK) { + if (mActionMode == null) + targetAliasPrompt(t); + return true; + } + if (mActionMode == null) { + mTargetAdapter.clearSelection(); + mActionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(mActionModeCallback); + } + mTargetAdapter.toggleSelection(position); + return true; + } + }); + mTargetAdapter = new TargetAdapter(); + + lv.setEmptyView(v.findViewById(android.R.id.empty)); + lv.setAdapter(mTargetAdapter); + + System.setTargetListObserver(mTargetAdapter); + + mRadarReceiver.register(getActivity()); + mUpdateReceiver.register(getActivity()); + mWipeReceiver.register(getActivity()); + mMsfReceiver.register(getActivity()); + mConnectivityReceiver.register(getActivity()); + + init(); + startAllServices(); + } + + private void startAllServices() { + startNetworkRadar(); + startUpdateChecker(); + startRPCServer(); + } + + private void notifyMenuChanged() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + getActivity().invalidateOptionsMenu(); + else + configureMenu(); + } + + /** + * Performs the firsts actions when the app starts. + * called also when the user connects to a wifi from the app, and when the core is updated. + */ + public void init() { + loadInterfaces(); + isAnyNetInterfaceAvailable = (mIfaces.length > 0); + mIsConnectivityAvailable = isConnectivityAvailable(); + + mIsCoreInstalled = System.isCoreInstalled(); + mIsDaemonBeating = System.isCoreInitialized(); + + // check minimum requirements for system initialization + + if (!mIsCoreInstalled) { + EMPTY_LIST_MESSAGE = mIsConnectivityAvailable ? + getString(R.string.missing_core_update) : + getString(R.string.no_connectivity); + return; + } else if (!mIsDaemonBeating) { + try { + System.initCore(); + mIsDaemonBeating = true; + + if (Client.hadCrashed()) { + Logger.warning("Client has previously crashed, building a crash report."); + CrashReporter.notifyNativeLibraryCrash(); + onInitializationError(getString(R.string.JNI_crash_detected)); + return; + } + } catch (UnsatisfiedLinkError e) { + onInitializationError("hi developer, you missed to build JNI stuff, thanks for playing with me :)"); + return; + } catch (System.SuException e) { + onInitializationError(getString(R.string.only_4_root)); + return; + } catch (System.DaemonException e) { + Logger.error(e.getMessage()); + } + + if (!mIsDaemonBeating) { + if (mIsConnectivityAvailable) { + EMPTY_LIST_MESSAGE = getString(R.string.heart_attack_update); + } else { + onInitializationError(getString(R.string.heart_attack)); + } + return; + } + } + + // if all is initialized, configure the network + initSystem(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.main, menu); + + mMenu = menu; + configureMenu(); + super.onCreateOptionsMenu(menu, inflater); + getActivity().onCreateOptionsMenu(menu); + } + + private boolean isConnectivityAvailable() { + return Network.isConnectivityAvailable(getActivity()) || Network.isWifiConnected(getActivity()); + } + + public void configureMenu() { + if (mMenu == null) + return; + mMenu.findItem(R.id.add).setVisible(isAnyNetInterfaceAvailable); + mMenu.findItem(R.id.scan).setVisible(mHaveAnyWifiInterface); + mMenu.findItem(R.id.wifi_ifaces).setEnabled(canChangeInterface()); + mMenu.findItem(R.id.new_session).setEnabled(isAnyNetInterfaceAvailable); + mMenu.findItem(R.id.save_session).setEnabled(isAnyNetInterfaceAvailable); + mMenu.findItem(R.id.restore_session).setEnabled(isAnyNetInterfaceAvailable); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + MenuItem item = menu.findItem(R.id.ss_monitor); + + Services.getNetworkRadar().buildMenuItem(item); + + item = menu.findItem(R.id.ss_msfrpcd); + + Services.getMsfRpcdService().buildMenuItem(item); + + mMenu = menu; + getActivity().onPrepareOptionsMenu(menu); + } + + private boolean initSystem() { + // retry + try { + System.init(getActivity().getApplicationContext()); + } catch (Exception e) { + boolean isFatal = !(e instanceof NoRouteToHostException); + + if (isFatal) { + System.errorLogging(e); + onInitializationError(System.getLastError()); + } + + return !isFatal; + } + + registerPlugins(); + return true; + } + + private void registerPlugins() { + if (!System.getPlugins().isEmpty()) + return; + + System.registerPlugin(new RouterPwn()); + System.registerPlugin(new Traceroute()); + System.registerPlugin(new PortScanner()); + System.registerPlugin(new Inspector()); + System.registerPlugin(new ExploitFinder()); + System.registerPlugin(new LoginCracker()); + System.registerPlugin(new Sessions()); + System.registerPlugin(new MITM()); + System.registerPlugin(new PacketForger()); + } + + private void loadInterfaces() { + boolean menuChanged; + List interfaces = Network.getAvailableInterfaces(); + int size = interfaces.size(); + + if (mIfaces != null) { + menuChanged = mIfaces.length != size; + menuChanged &= mIfaces.length <= 1 || size <= 1; + } else { + menuChanged = true; + } + + mIfaces = new String[size]; + interfaces.toArray(mIfaces); + isAnyNetInterfaceAvailable = mIfaces.length > 0; + + if (menuChanged) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + notifyMenuChanged(); + } + }); + } + } + + private boolean canChangeInterface() { + return mIfaces.length > 1 || (mOfflineMode && isAnyNetInterfaceAvailable); + } + + private boolean haveInterface(String ifname) { + for (String s : mIfaces) { + if (s.equals(ifname)) + return true; + } + return false; + } + + private void onNetworkInterfaceChanged() { + String toastMessage = null; + + stopNetworkRadar(); + + if (!System.reloadNetworkMapping()) { + String ifname = System.getIfname(); + + ifname = ifname == null ? getString(R.string.any_interface) : ifname; + + toastMessage = String.format(getString(R.string.error_initializing_interface), ifname); + } else { + startNetworkRadar(); + registerPlugins(); + } + + final String msg = toastMessage; + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (msg != null) { + Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show(); + } + notifyMenuChanged(); + } + }); + } + + private void onConnectionLost() { + if (mOfflineMode) + return; + + mOfflineMode = true; + + stopNetworkRadar(); + System.markNetworkAsDisconnected(); + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + new ConfirmDialog(getString(R.string.connection_lost), + getString(R.string.connection_lost_prompt), getActivity(), + new ConfirmDialogListener() { + @Override + public void onConfirm() { + mOfflineMode = false; + System.setIfname(null); + onNetworkInterfaceChanged(); + } + + @Override + public void onCancel() { + } + }).show(); + } + }); + } + + private void onConnectionResumed() { + if (!mOfflineMode) + return; + mOfflineMode = false; + System.markInitialNetworkTargetsAsConnected(); + startNetworkRadar(); + } + + /** + * Displays a dialog for choose a network interface + * + * @param forceDialog forces to show the dialog even if there's only one interface + */ + private void displayNetworkInterfaces(final boolean forceDialog) { + // reload the interfaces list if we've invoked the dialog from the menu + loadInterfaces(); + boolean autoload = !forceDialog && mIfaces.length == 1; + + if (autoload) { + System.setIfname(mIfaces[0]); + onNetworkInterfaceChanged(); + } else if (isAnyNetInterfaceAvailable) { + String title = getString(R.string.iface_dialog_title); + + new ListChoiceDialog(title, mIfaces, getActivity(), new ChoiceDialog.ChoiceDialogListener() { + @Override + public void onChoice(int index) { + System.setIfname(mIfaces[index]); + onNetworkInterfaceChanged(); + } + }).show(); + } else { + new ErrorDialog(getString(android.R.string.dialog_alert_title), + getString(R.string.iface_error_no_available), getActivity()).show(); + } + } + + //FIXME: This method is never called. Is this a bug? + private void displayNetworkInterfaces() { + displayNetworkInterfaces(false); + } + + private void targetAliasPrompt(final Target target) { + + new InputDialog(getString(R.string.target_alias), + getString(R.string.set_alias), + target.hasAlias() ? target.getAlias() : "", true, + false, getActivity(), new InputDialogListener() { + @Override + public void onInputEntered(String input) { + target.setAlias(input); + mTargetAdapter.notifyDataSetChanged(); + } + }).show(); + } + + private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.main_multi, menu); + return true; + } + + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + int i = mTargetAdapter.getSelectedCount(); + mode.setTitle(i + " " + getString((i > 1 ? R.string.targets_selected : R.string.target_selected))); + MenuItem item = menu.findItem(R.id.multi_action); + if (item != null) + item.setIcon((i > 1 ? android.R.drawable.ic_dialog_dialer : android.R.drawable.ic_menu_edit)); + return false; + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + ArrayList commonPlugins = null; + + switch (item.getItemId()) { + case R.id.multi_action: + final int[] selected = mTargetAdapter.getSelectedPositions(); + if (selected.length > 1) { + Target target = (Target) mTargetAdapter.getItem(selected[0]); + commonPlugins = System.getPluginsForTarget(target); + for (int i = 1; i < selected.length; i++) { + target = (Target) mTargetAdapter.getItem(selected[i]); + ArrayList targetPlugins = System.getPluginsForTarget(target); + ArrayList removeThem = new ArrayList(); + for (Plugin p : commonPlugins) { + if (!targetPlugins.contains(p)) + removeThem.add(p); + } + for (Plugin p : removeThem) { + commonPlugins.remove(p); + } + } + if (commonPlugins.size() > 0) { + final int[] actions = new int[commonPlugins.size()]; + for (int i = 0; i < actions.length; i++) + actions[i] = commonPlugins.get(i).getName(); + + (new MultipleChoiceDialog(R.string.choose_method, actions, getActivity(), new MultipleChoiceDialog.MultipleChoiceDialogListener() { + @Override + public void onChoice(int[] choices) { + Intent intent = new Intent(getActivity(), MultiAttackService.class); + int[] selectedActions = new int[choices.length]; + + for (int i = 0; i < selectedActions.length; i++) + selectedActions[i] = actions[choices[i]]; + + intent.putExtra(MultiAttackService.MULTI_TARGETS, selected); + intent.putExtra(MultiAttackService.MULTI_ACTIONS, selectedActions); + + getActivity().startService(intent); + } + })).show(); + } else { + (new ErrorDialog(getString(R.string.error), "no common actions found", getActivity())).show(); + } + } else { + targetAliasPrompt((Target) mTargetAdapter.getItem(selected[0])); + } + mode.finish(); // Action picked, so close the CAB + return true; + default: + return false; + } + } + + // called when the user exits the action mode + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + mTargetAdapter.clearSelection(); + } + }; + + public void startUpdateChecker() { + if (!isConnectivityAvailable() || mIsUpdateDownloading) + return; + if (System.getSettings().getBoolean("PREF_CHECK_UPDATES", true)) { + new UpdateChecker(getActivity()).start(); + mIsUpdateDownloading = true; + } else { + getActivity().sendBroadcast(new Intent(UPDATE_NOT_AVAILABLE)); + mIsUpdateDownloading = false; + } + } + + public void startNetworkRadar() { + if (!isAnyNetInterfaceAvailable || !mIsDaemonBeating) { + return; + } + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + Services.getNetworkRadar().start(); + } + }); + } + + public void stopNetworkRadar() { + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + Services.getNetworkRadar().stop(); + } + }); + } + + /** + * start MSF RPC Daemon + */ + public void startRPCServer() { + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + if (Services.getMsfRpcdService().isAvailable()) + Services.getMsfRpcdService().start(); + } + }); + } + + /** + * stop MSF RPC Daemon + */ + public void StopRPCServer() { + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + Services.getMsfRpcdService().stop(); + } + }); + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + switch (item.getItemId()) { + + case R.id.add: + new InputDialog(getString(R.string.add_custom_target), + getString(R.string.enter_url), getActivity(), + new InputDialogListener() { + @Override + public void onInputEntered(String input) { + final Target target = Target.getFromString(input); + if (target != null) { + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + System.addOrderedTarget(target); + } + }); + } else + new ErrorDialog(getString(R.string.error), + getString(R.string.invalid_target), + getActivity()).show(); + } + }).show(); + return true; + + case R.id.scan: + startNetworkRadar(); + return true; + + case R.id.wifi_ifaces: + displayNetworkInterfaces(true); + return true; + + case R.id.wifi_scan: + stopNetworkRadar(); + + mRadarReceiver.unregister(); + mUpdateReceiver.unregister(); + + startActivityForResult(new Intent(getActivity(), + WifiScannerActivity.class), WIFI_CONNECTION_REQUEST); + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + return true; + + case R.id.new_session: + new ConfirmDialog(getString(R.string.warning), + getString(R.string.warning_new_session), getActivity(), + new ConfirmDialogListener() { + @Override + public void onConfirm() { + try { + System.reset(); + + Toast.makeText( + getActivity(), + getString(R.string.new_session_started), + Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + new FatalDialog(getString(R.string.error), e + .toString(), getActivity()).show(); + } + } + + @Override + public void onCancel() { + } + + }).show(); + + return true; + + case R.id.save_session: + new InputDialog(getString(R.string.save_session), + getString(R.string.enter_session_name), + System.getSessionName(), true, false, getActivity(), + new InputDialogListener() { + @Override + public void onInputEntered(String input) { + String name = input.trim().replace("/", "") + .replace("..", ""); + + if (!name.isEmpty()) { + try { + String filename = System.saveSession(name); + + Toast.makeText( + getActivity(), + getString(R.string.session_saved_to) + + filename + " .", + Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + new ErrorDialog(getString(R.string.error), + e.toString(), getActivity()) + .show(); + } + } else + new ErrorDialog(getString(R.string.error), + getString(R.string.invalid_session), + getActivity()).show(); + } + }).show(); + return true; + + case R.id.restore_session: + final ArrayList sessions = System + .getAvailableSessionFiles(); + + if (sessions != null && sessions.size() > 0) { + new SpinnerDialog(getString(R.string.select_session), + getString(R.string.select_session_file), + sessions.toArray(new String[sessions.size()]), + getActivity(), new SpinnerDialogListener() { + @Override + public void onItemSelected(int index) { + String session = sessions.get(index); + + try { + System.loadSession(session); + } catch (Exception e) { + e.printStackTrace(); + new ErrorDialog(getString(R.string.error), + e.getMessage(), getActivity()) + .show(); + } + } + }).show(); + } else + new ErrorDialog(getString(R.string.error), + getString(R.string.no_session_found), getActivity()) + .show(); + return true; + + case R.id.settings: + startActivity(new Intent(getActivity(), SettingsActivity.class)); + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + return true; + + case R.id.ss_monitor: + new Thread(new Runnable() { + @Override + public void run() { + Services.getNetworkRadar().onMenuClick(getActivity(), item); + } + }).start(); + return true; + + case R.id.ss_msfrpcd: + new Thread(new Runnable() { + @Override + public void run() { + Services.getMsfRpcdService().onMenuClick(getActivity(), item); + } + }).start(); + return true; + + case R.id.submit_issue: + String uri = getString(R.string.github_new_issue_url); + Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); + startActivity(browser); + // for fat-tire: + // String.format(getString(R.string.issue_message), getString(R.string.github_issues_url), getString(R.string.github_new_issue_url)); + return true; + + case R.id.about: + new AboutDialog(getActivity()).show(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + public void onBackPressed() { + if (mLastBackPressTime < java.lang.System.currentTimeMillis() - 4000) { + mToast = Toast.makeText(getActivity(), getString(R.string.press_back), + Toast.LENGTH_SHORT); + mToast.show(); + mLastBackPressTime = java.lang.System.currentTimeMillis(); + } else { + if (mToast != null) + mToast.cancel(); + + new ConfirmDialog(getString(R.string.exit), + getString(R.string.close_confirm), getActivity(), + new ConfirmDialogListener() { + @Override + public void onConfirm() { + getActivity().finish(); + } + + @Override + public void onCancel() { + } + }).show(); + + mLastBackPressTime = 0; + } + } + + @Override + public void onDestroy() { + stopNetworkRadar(); + StopRPCServer(); + + mRadarReceiver.unregister(); + mUpdateReceiver.unregister(); + mWipeReceiver.unregister(); + mMsfReceiver.unregister(); + mConnectivityReceiver.unregister(); + + // make sure no zombie process is running before destroying the activity + System.clean(true); + + super.onDestroy(); + } + + public class TargetAdapter extends BaseAdapter implements Runnable, Observer { + + private List list = System.getTargets(); + private boolean isDark = getActivity().getSharedPreferences("THEME", 0).getBoolean("isDark", false); + + @Override + public int getCount() { + return list.size(); + } + + @Override + public Object getItem(int position) { + return list.get(position); + } + + @Override + public long getItemId(int position) { + return R.layout.target_list_item; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + TargetHolder holder; + + if (row == null) { + LayoutInflater inflater = (LayoutInflater) getActivity() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater.inflate(R.layout.target_list_item, parent, false); + + if (isDark) + row.setBackgroundResource(R.drawable.card_background_dark); + + holder = new TargetHolder(); + holder.itemImage = (ImageView) (row != null ? row + .findViewById(R.id.itemIcon) : null); + holder.itemTitle = (TextView) (row != null ? row + .findViewById(R.id.itemTitle) : null); + holder.itemDescription = (TextView) (row != null ? row + .findViewById(R.id.itemDescription) : null); + holder.portCount = (TextView) (row != null ? row + .findViewById(R.id.portCount) : null); + holder.portCountLayout = (LinearLayout) (row != null ? row + .findViewById(R.id.portCountLayout) : null); + if (isDark) + holder.portCountLayout.setBackgroundResource(R.drawable.rounded_square_grey); + if (row != null) + row.setTag(holder); + } else + holder = (TargetHolder) row.getTag(); + + final Target target = list.get(position); + + if (target.hasAlias()) { + holder.itemTitle.setText(Html.fromHtml("" + + target.getAlias() + " ( " + + target.getDisplayAddress() + " )")); + } else { + holder.itemTitle.setText(target.toString()); + } + holder.itemTitle.setTextColor(ContextCompat.getColor(getActivity().getApplicationContext(), (target.isConnected() ? R.color.app_color : R.color.gray_text))); + + holder.itemTitle.setTypeface(null, Typeface.NORMAL); + holder.itemImage.setImageResource(target.getDrawableResourceId()); + holder.itemDescription.setText(target.getDescription()); + + int openedPorts = target.getOpenPorts().size(); + + holder.portCount.setText(String.format("%d", openedPorts)); + holder.portCountLayout.setVisibility(openedPorts < 1 ? View.GONE : View.VISIBLE); + return row; + } + + public void clearSelection() { + synchronized (this) { + for (Target t : list) + t.setSelected(false); + } + notifyDataSetChanged(); + if (mActionMode != null) + mActionMode.finish(); + } + + public void toggleSelection(int position) { + synchronized (this) { + Target t = list.get(position); + t.setSelected(!t.isSelected()); + } + notifyDataSetChanged(); + if (mActionMode != null) { + if (getSelectedCount() > 0) + mActionMode.invalidate(); + else + mActionMode.finish(); + } + } + + public int getSelectedCount() { + int i = 0; + synchronized (this) { + for (Target t : list) + if (t.isSelected()) + i++; + } + return i; + } + + public ArrayList getSelected() { + ArrayList result = new ArrayList(); + synchronized (this) { + for (Target t : list) + if (t.isSelected()) + result.add(t); + } + return result; + } + + public int[] getSelectedPositions() { + int[] res; + int j = 0; + + synchronized (this) { + res = new int[getSelectedCount()]; + for (int i = 0; i < list.size(); i++) + if (list.get(i).isSelected()) + res[j++] = i; + } + return res; + } + + @Override + public void update(Observable observable, Object data) { + final Target target = (Target) data; + + if (target == null) { + // update the whole list + getActivity().runOnUiThread(this); + return; + } + + // update only a row, if it's displayed + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (lv == null) + return; + synchronized (this) { + int start = lv.getFirstVisiblePosition(); + int end = Math.min(lv.getLastVisiblePosition(), list.size()); + for (int i = start; i <= end; i++) + if (target == list.get(i)) { + View view = lv.getChildAt(i - start); + getView(i, view, lv); + break; + } + } + } + }); + + } + + @Override + public void run() { + synchronized (this) { + list = System.getTargets(); + } + notifyDataSetChanged(); + } + + class TargetHolder { + ImageView itemImage; + TextView itemTitle; + TextView itemDescription; + TextView portCount; + LinearLayout portCountLayout; + } + } + + private class WipeReceiver extends ManagedReceiver { + private IntentFilter mFilter = null; + + public WipeReceiver() { + mFilter = new IntentFilter(); + + mFilter.addAction(SettingsFragment.SETTINGS_WIPE_START); + } + + public IntentFilter getFilter() { + return mFilter; + } + + @Override + public void onReceive(Context context, Intent intent) { + + if (intent.getAction().equals(SettingsFragment.SETTINGS_WIPE_START)) { + try { + String path; + + if (intent.hasExtra(SettingsFragment.SETTINGS_WIPE_DIR)) { + path = intent.getStringExtra(SettingsFragment.SETTINGS_WIPE_DIR); + } else { + path = System.getRubyPath() + "' '" + System.getMsfPath(); + } + + StopRPCServer(); + System.getTools().raw.async("rm -rf '" + path + "'", new Child.EventReceiver() { + @Override + public void onEnd(int exitCode) { + getActivity().sendBroadcast(new Intent(SettingsFragment.SETTINGS_WIPE_DONE)); + } + + @Override + public void onDeath(int signal) { + getActivity().sendBroadcast(new Intent(SettingsFragment.SETTINGS_WIPE_DONE)); + } + + @Override + public void onEvent(Event e) { + } + }); + } catch (Exception e) { + System.errorLogging(e); + } + } + } + } + + private class UpdateReceiver extends ManagedReceiver { + private IntentFilter mFilter = null; + + public UpdateReceiver() { + mFilter = new IntentFilter(); + + mFilter.addAction(UPDATE_CHECKING); + mFilter.addAction(UPDATE_AVAILABLE); + mFilter.addAction(UPDATE_NOT_AVAILABLE); + mFilter.addAction(UpdateService.ERROR); + mFilter.addAction(UpdateService.DONE); + } + + public IntentFilter getFilter() { + return mFilter; + } + + private void onUpdateAvailable(final Update update, final boolean mandatory) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + new ConfirmDialog(getString(R.string.update_available), + update.prompt, getActivity(), new ConfirmDialogListener() { + @Override + public void onConfirm() { + StopRPCServer(); + Intent i = new Intent(getActivity(), UpdateService.class); + i.setAction(UpdateService.START); + i.putExtra(UpdateService.UPDATE, update); + + getActivity().startService(i); + mIsUpdateDownloading = true; + } + + @Override + public void onCancel() { + mIsUpdateDownloading = false; + if (!mandatory) { + return; + } + + onInitializationError(getString(R.string.mandatory_update)); + } + } + ).show(); + } + }); + } + + private void onUpdateAvailable(Update update) { + onUpdateAvailable(update, (update instanceof CoreUpdate) && !System.isCoreInstalled()); + } + + private void onUpdateDone(Update update) { + + mIsUpdateDownloading = false; + + System.reloadTools(); + + if ((update instanceof MsfUpdate) || (update instanceof RubyUpdate)) { + startRPCServer(); + } + + if (update instanceof CoreUpdate) { + onCoreUpdated(); + } + + // restart update checker after a successful update + startUpdateChecker(); + } + + private void onUpdateError(final Update update, final int message) { + + mIsUpdateDownloading = false; + + if (update instanceof CoreUpdate) { + onInitializationError(getString(message)); + return; + } + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + new ErrorDialog(getString(R.string.error), + getString(message), getActivity()).show(); + } + }); + + System.reloadTools(); + } + + @SuppressWarnings("ConstantConditions") + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Update update = null; + + if (intent.hasExtra(UpdateService.UPDATE)) { + update = (Update) intent.getSerializableExtra(UpdateService.UPDATE); + } + + switch (action) { + case UPDATE_CHECKING: + if (mEmptyTextView != null) + mEmptyTextView.setText(EMPTY_LIST_MESSAGE.replace( + "#STATUS#", getString(R.string.checking))); + break; + case UPDATE_NOT_AVAILABLE: + if (mEmptyTextView != null) + mEmptyTextView.setText(EMPTY_LIST_MESSAGE.replace( + "#STATUS#", getString(R.string.no_updates_available))); + + if (!System.isCoreInstalled()) { + onInitializationError(getString(R.string.no_core_found)); + } + break; + case UPDATE_AVAILABLE: + onUpdateAvailable(update); + break; + case UpdateService.DONE: + onUpdateDone(update); + break; + case UpdateService.ERROR: + int message = intent.getIntExtra(UpdateService.MESSAGE, R.string.error_occured); + onUpdateError(update, message); + break; + } + } + } + + private class ConnectivityReceiver extends ManagedReceiver { + private static final int CHECK_DELAY = 2000; + + private final IntentFilter mFilter; + private TimerTask mTask = null; + + public ConnectivityReceiver() { + mFilter = new IntentFilter(); + mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + } + + @Override + public IntentFilter getFilter() { + return mFilter; + } + + private String ifacesToString() { + StringBuilder sb = new StringBuilder(); + for (String iface : mIfaces) { + if (sb.length() > 0) { + sb.append(", "); + } + sb.append(iface); + } + return sb.toString(); + } + + @Override + public void onReceive(Context context, Intent intent) { + synchronized (getActivity()) { + if (mTask != null) { + mTask.cancel(); + } + mTask = new TimerTask() { + @Override + public void run() { + check(); + } + }; + new Timer().schedule(mTask, CHECK_DELAY); + } + } + + @Override + public void unregister() { + super.unregister(); + synchronized (getActivity()) { + if (mTask != null) { + mTask.cancel(); + } + } + } + + private void check() { + synchronized (getActivity()) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + loadInterfaces(); + + String current = System.getIfname(); + + Logger.debug(String.format("current='%s', ifaces=[%s], haveInterface=%s, isAnyNetInterfaceAvailable=%s", + current != null ? current : "(null)", + ifacesToString(), haveInterface(current), isAnyNetInterfaceAvailable)); + + if (haveInterface(current)) { + onConnectionResumed(); + } else if (current != null) { + onConnectionLost(); + } else if (isAnyNetInterfaceAvailable) { + onNetworkInterfaceChanged(); + } + + } + }); + + mTask = null; + } + } + } +} \ No newline at end of file diff --git a/cSploit/src/main/java/org/csploit/android/SettingsActivity.java b/cSploit/src/main/java/org/csploit/android/SettingsActivity.java new file mode 100644 index 0000000000..36bcb32363 --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/SettingsActivity.java @@ -0,0 +1,51 @@ +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.content.SharedPreferences; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; + +public class SettingsActivity extends AppCompatActivity { + + SettingsFragment f; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SharedPreferences themePrefs = getSharedPreferences("THEME", 0); + if (themePrefs.getBoolean("isDark", false)) + setTheme(R.style.DarkTheme); + else + setTheme(R.style.AppTheme); + setContentView(R.layout.main); + if (findViewById(R.id.mainframe) != null) { + if (savedInstanceState != null) { + return; + } + f = new SettingsFragment(); + getSupportFragmentManager().beginTransaction() + .add(R.id.mainframe, f).commit(); + } + } + + public void onBackPressed() { + f.onBackPressed(); + } +} diff --git a/cSploit/src/main/java/org/csploit/android/SettingsFragment.java b/cSploit/src/main/java/org/csploit/android/SettingsFragment.java new file mode 100644 index 0000000000..ec8008accf --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/SettingsFragment.java @@ -0,0 +1,606 @@ +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.widget.Toast; + +import org.csploit.android.core.ChildManager; +import org.csploit.android.core.ExecChecker; +import org.csploit.android.core.Logger; +import org.csploit.android.core.System; +import org.csploit.android.gui.DirectoryPicker; +import org.csploit.android.gui.dialogs.ChoiceDialog; +import org.csploit.android.gui.dialogs.ConfirmDialog; +import org.csploit.android.net.GitHubParser; +import org.csploit.android.services.Services; +import org.csploit.android.tools.Raw; +import org.json.JSONException; + +import java.io.File; +import java.io.IOException; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.preference.EditTextPreference; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceFragmentCompat; +import androidx.preference.TwoStatePreference; + +public class SettingsFragment extends Fragment { + + + public static final int SETTINGS_DONE = 1285; + public static final String SETTINGS_WIPE_START = "SettingsActivity.WIPE_START"; + public static final String SETTINGS_WIPE_DIR = "SettingsActivity.data.WIPE_DIR"; + public static final String SETTINGS_WIPE_DONE = "SettingsActivity.WIPE_DONE"; + public static final String SETTINGS_MSF_CHANGED = "SettingsActivity.MSF_CHANGED"; + public static final String SETTINGS_MSF_BRANCHES_AVAILABLE = "SettingsActivity.MSF_MSF_BRANCHES_AVAILABLE"; + + @SuppressWarnings("ConstantConditions") + @Override + public void onCreate(Bundle savedInstanceState) { + SharedPreferences themePrefs = getActivity().getSharedPreferences("THEME", 0); + if (themePrefs.getBoolean("isDark", false)) + getActivity().setTheme(R.style.PrefsThemeDark); + else + getActivity().setTheme(R.style.PrefsTheme); + super.onCreate(savedInstanceState); + getActivity().getSupportFragmentManager().beginTransaction() + .replace(android.R.id.content, new PrefsFrag()) + .commit(); + } + + + public static class PrefsFrag extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { + + + private Preference mSavePath = null; + private Preference mWipeMSF = null; + private Preference mRubyDir = null; + private Preference mMsfDir = null; + private EditTextPreference mSnifferSampleTime = null; + private EditTextPreference mProxyPort = null; + private EditTextPreference mServerPort = null; + private EditTextPreference mRedirectorPort = null; + private EditTextPreference mMsfPort = null; + private EditTextPreference mHttpBufferSize = null; + private EditTextPreference mPasswordFilename = null; + private TwoStatePreference mThemeChooser = null; + private TwoStatePreference mMsfEnabled = null; + private ListPreference mMsfBranch = null; + private int mMsfSize = 0; + private BroadcastReceiver mReceiver = null; + private Thread mBranchesWaiter = null; + + @Override + public void onViewCreated(View v, Bundle savedInstanceState) { + super.onViewCreated(v, savedInstanceState); + SharedPreferences themePrefs = getActivity().getSharedPreferences("THEME", 0); + Boolean isDark = themePrefs.getBoolean("isDark", false); + if (isDark) { + getActivity().setTheme(R.style.PrefsThemeDark); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window_dark)); + } else { + getActivity().setTheme(R.style.PrefsTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window)); + } + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + SharedPreferences themePrefs = getActivity().getBaseContext().getSharedPreferences("THEME", 0); + if (themePrefs.getBoolean("isDark", false)) + getContext().setTheme(R.style.PrefsThemeDark); + else + getActivity().setTheme(R.style.PrefsTheme); + super.onCreate(savedInstanceState); + + mSavePath = getPreferenceScreen().findPreference("PREF_SAVE_PATH"); + mWipeMSF = getPreferenceScreen().findPreference("PREF_MSF_WIPE"); + mRubyDir = getPreferenceScreen().findPreference("RUBY_DIR"); + mMsfDir = getPreferenceScreen().findPreference("MSF_DIR"); + mMsfPort = (EditTextPreference) getPreferenceScreen().findPreference("MSF_RPC_PORT"); + mSnifferSampleTime = (EditTextPreference) getPreferenceScreen().findPreference("PREF_SNIFFER_SAMPLE_TIME"); + mProxyPort = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTP_PROXY_PORT"); + mServerPort = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTP_SERVER_PORT"); + mRedirectorPort = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTPS_REDIRECTOR_PORT"); + mHttpBufferSize = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTP_MAX_BUFFER_SIZE"); + mPasswordFilename = (EditTextPreference) getPreferenceScreen().findPreference("PREF_PASSWORD_FILENAME"); + mThemeChooser = (TwoStatePreference) getPreferenceScreen().findPreference("PREF_DARK_THEME"); + mMsfBranch = (ListPreference) getPreferenceScreen().findPreference("MSF_BRANCH"); + mMsfEnabled = (TwoStatePreference) getPreferenceScreen().findPreference("MSF_ENABLED"); + + mThemeChooser.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + SharedPreferences themePrefs = getActivity().getBaseContext().getSharedPreferences("THEME", 0); + themePrefs.edit().putBoolean("isDark", (Boolean) newValue).apply(); + Toast.makeText(getActivity().getBaseContext(), getString(R.string.please_restart), Toast.LENGTH_LONG).show(); + return true; + } + }); + + mSavePath.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startDirectoryPicker(preference); + return true; + } + }); + + if (mMsfEnabled.isEnabled()) + onMsfEnabled(); + } + + @Override + public void onCreatePreferences(Bundle bundle, String s) { + addPreferencesFromResource(R.xml.preferences); + } + + private void wipe_prompt() { + String message = getString(R.string.pref_msfwipe_message); + if (mMsfSize > 0) { + message += "\n" + String.format(getString(R.string.pref_msfwipe_size), mMsfSize); + } + new ConfirmDialog(getString(R.string.warning), message, getActivity(), new ConfirmDialog.ConfirmDialogListener() { + @Override + public void onConfirm() { + getActivity().sendBroadcast(new Intent(SETTINGS_WIPE_START)); + } + + @Override + public void onCancel() { + + } + }).show(); + } + + private void wipe_prompt_older(final File oldDir) { + new ConfirmDialog(getString(R.string.warning), getString(R.string.delete_previous_location), getActivity(), new ConfirmDialog.ConfirmDialogListener() { + @Override + public void onConfirm() { + Intent i = new Intent(SETTINGS_WIPE_START); + i.putExtra(SETTINGS_WIPE_DIR, oldDir.getAbsolutePath()); + getActivity().sendBroadcast(i); + } + + @Override + public void onCancel() { + + } + }).show(); + } + + private void measureMsfSize() { + try { + System.getTools().raw.async(String.format("du -xsm '%s' '%s'", System.getRubyPath(), System.getMsfPath()), + new Raw.RawReceiver() { + private int size = 0; + + @SuppressWarnings("StatementWithEmptyBody") + @Override + public void onNewLine(String line) { + if (line.isEmpty()) + return; + try { + int start, end; + for (start = 0; start < line.length() && java.lang.Character.isSpaceChar(line.charAt(start)); start++) + ; + for (end = start + 1; end < line.length() && java.lang.Character.isDigit(line.charAt(end)); end++) + ; + size += Integer.parseInt(line.substring(start, end)); + } catch (Exception e) { + System.errorLogging(e); + } + } + + @Override + public void onEnd(int exitCode) { + if (exitCode == 0) + mMsfSize = size; + } + }); + } catch (ChildManager.ChildNotStartedException e) { + Logger.error(e.getMessage()); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (requestCode == DirectoryPicker.PICK_DIRECTORY && resultCode != AppCompatActivity.RESULT_CANCELED) { + Bundle extras = intent.getExtras(); + String path; + String key; + File folder; + String oldPath = null; + + if (extras == null) { + Logger.debug("null extra: " + intent); + return; + } + + path = (String) extras.get(DirectoryPicker.CHOSEN_DIRECTORY); + key = (String) extras.get(DirectoryPicker.AFFECTED_PREF); + + if (path == null || key == null) { + Logger.debug("null path or key: " + intent); + return; + } + + folder = new File(path); + ExecChecker checker = null; + + + if (key.equals("RUBY_DIR")) { + oldPath = System.getRubyPath(); + checker = ExecChecker.ruby(); + } else if (key.equals("MSF_DIR")) { + oldPath = System.getMsfPath(); + checker = ExecChecker.msf(); + } + + if (!folder.exists()) + Toast.makeText(getActivity(), getString(R.string.pref_folder) + " " + path + " " + getString(R.string.pref_err_exists), Toast.LENGTH_SHORT).show(); + + else if (!folder.canWrite()) + Toast.makeText(getActivity(), getString(R.string.pref_folder) + " " + path + " " + getString(R.string.pref_err_writable), Toast.LENGTH_SHORT).show(); + + else if (checker != null && !checker.canExecuteInDir(path)) + Toast.makeText(getActivity(), getString(R.string.pref_folder) + " " + path + " " + getString(R.string.pref_err_executable), Toast.LENGTH_LONG).show(); + + else { + //noinspection ConstantConditions + getPreferenceManager().getSharedPreferences().edit().putString(key, path).apply(); + if (oldPath != null && !oldPath.equals(path)) { + File current = new File(oldPath); + + if (current.exists() && current.isDirectory() && current.listFiles().length > 2) { + wipe_prompt_older(current); + } + } + } + } + } + + private void startDirectoryPicker(Preference preference) { + Intent i = new Intent(getActivity(), DirectoryPicker.class); + i.putExtra(DirectoryPicker.AFFECTED_PREF, preference.getKey()); + startActivityForResult(i, DirectoryPicker.PICK_DIRECTORY); + } + + @SuppressWarnings("ConstantConditions") + @Override + public void onResume() { + super.onResume(); + getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + } + + @SuppressWarnings("ConstantConditions") + @Override + public void onPause() { + super.onPause(); + getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + } + + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + String message = null; + + if (key.equals("PREF_SNIFFER_SAMPLE_TIME")) { + double sampleTime; + + try { + sampleTime = Double.parseDouble(mSnifferSampleTime.getText()); + if (sampleTime < 0.4 || sampleTime > 1.0) { + message = getString(R.string.pref_err_sample_time); + sampleTime = 1.0; + } + } catch (Throwable t) { + message = getString(R.string.pref_err_invalid_number); + sampleTime = 1.0; + } + + mSnifferSampleTime.setText(Double.toString(sampleTime)); + } else if (key.endsWith("_PORT")) { + int port; + + try { + port = Integer.parseInt(mProxyPort.getText()); + if (port < 1024 || port > 65536) { + message = getString(R.string.pref_err_port_range); + port = 0; + } else if (!System.isPortAvailable(port)) { + message = getString(R.string.pref_err_busy_port); + port = 0; + } + } catch (Throwable t) { + message = getString(R.string.pref_err_invalid_number); + port = 0; + } + + if (key.equals("PREF_HTTP_PROXY_PORT")) { + System.HTTP_PROXY_PORT = port; + } else if (key.equals("PREF_HTTP_SERVER_PORT")) { + System.HTTP_SERVER_PORT = port; + } else if (key.equals("PREF_HTTPS_REDIRECTOR_PORT")) { + System.HTTPS_REDIR_PORT = port; + } else if (key.equals("MSF_RPC_PORT")) { + System.MSF_RPC_PORT = port; + } + + if (port == 0) { + // reset to default value + port = getDefaultPortForKey(key); + + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString(key, Integer.toString(port)); + editor.apply(); + } + } else if (key.equals("PREF_HTTP_MAX_BUFFER_SIZE")) { + int maxBufferSize; + + try { + maxBufferSize = Integer.parseInt(mHttpBufferSize.getText()); + if (maxBufferSize < 1024 || maxBufferSize > 104857600) { + message = getString(R.string.pref_err_buffer_size); + maxBufferSize = 10485760; + } + } catch (Throwable t) { + message = getString(R.string.pref_err_invalid_number); + maxBufferSize = 10485760; + } + + mHttpBufferSize.setText(Integer.toString(maxBufferSize)); + } else if (key.equals("PREF_PASSWORD_FILENAME")) { + String passFileName; + + try { + passFileName = mPasswordFilename.getText(); + if (!passFileName.matches("[^/?*:;{}\\]+]")) { + message = getString(R.string.invalid_filename); + passFileName = "csploit-password-sniff.log"; + } + } catch (Throwable t) { + message = getString(R.string.invalid_filename); + passFileName = "csploit-password-sniff.log"; + } + + mPasswordFilename.setText(passFileName); + } else if (key.equals("MSF_ENABLED")) { + if (mMsfEnabled.isChecked()) + onMsfEnabled(); + } else if (key.equals("PREF_AUTO_PORTSCAN")) { + Services.getNetworkRadar().onAutoScanChanged(); + } + + if (message != null) + Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); + + System.onSettingChanged(key); + } + + private int getDefaultPortForKey(String key) { + switch (key) { + case "PREF_HTTP_PROXY_PORT": + return 8080; + case "PREF_HTTP_SERVER_PORT": + return 8081; + case "PREF_HTTPS_REDIRECTOR_PORT": + return 8082; + case "MSF_RPC_PORT": + return 55553; + default: + return 0; + } + } + + private void onMsfEnabled() { + // use mReceiver as "already did that" + if (mReceiver != null) + return; + + // start measureMsfSize ASAP + onMsfPathChanged(); + + Preference.OnPreferenceClickListener directoryPickerWithDefaultPath = new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + + final String currentValue; + final String defaultValue; + final String key = preference.getKey(); + + switch (key) { + case "RUBY_DIR": + currentValue = System.getRubyPath(); + defaultValue = System.getDefaultRubyPath(); + break; + case "MSF_DIR": + currentValue = System.getMsfPath(); + defaultValue = System.getDefaultMsfPath(); + break; + default: + return true; + } + + if (!currentValue.equals(defaultValue)) { + final Preference fPref = preference; + (new ChoiceDialog( + getActivity(), + getString(R.string.choose_an_option), + new String[]{getString(R.string.restore_default_path), getString(R.string.choose_a_custom_path)}, + new ChoiceDialog.ChoiceDialogListener() { + @Override + public void onChoice(int choice) { + if (choice == 0) { + // create default directory if it does not exists + File f = new File(defaultValue); + if (!f.exists()) + f.mkdirs(); + // simulate directory picker + Intent i = new Intent(); + i.putExtra(DirectoryPicker.AFFECTED_PREF, key); + i.putExtra(DirectoryPicker.CHOSEN_DIRECTORY, defaultValue); + onActivityResult(DirectoryPicker.PICK_DIRECTORY, AppCompatActivity.RESULT_OK, i); + } else { + startDirectoryPicker(fPref); + } + } + } + )).show(); + } else { + startDirectoryPicker(preference); + } + return true; + } + }; + + mRubyDir.setDefaultValue(System.getDefaultRubyPath()); + mRubyDir.setOnPreferenceClickListener(directoryPickerWithDefaultPath); + + mMsfDir.setDefaultValue(System.getDefaultMsfPath()); + mMsfDir.setOnPreferenceClickListener(directoryPickerWithDefaultPath); + + mWipeMSF.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + wipe_prompt(); + return true; + } + }); + + getMsfBranches(); + + mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(SETTINGS_WIPE_DONE)) { + onMsfPathChanged(); + } else if (intent.getAction().equals(SETTINGS_MSF_BRANCHES_AVAILABLE)) { + onMsfBranchesAvailable(); + } + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(SETTINGS_WIPE_DONE); + filter.addAction(SETTINGS_MSF_BRANCHES_AVAILABLE); + getActivity().registerReceiver(mReceiver, filter); + } + + private void getMsfBranches() { + if (mBranchesWaiter != null) { // run it once per settings activity + if (mBranchesWaiter.getState() == Thread.State.TERMINATED) + try { + mBranchesWaiter.join(); + } catch (InterruptedException e) { + Logger.error(e.getMessage()); + } + return; + } + + mMsfBranch.setEnabled(false); + mBranchesWaiter = new Thread(new Runnable() { + @Override + public void run() { + try { + GitHubParser.getMsfRepo().getBranches(); + getActivity().sendBroadcast(new Intent(SETTINGS_MSF_BRANCHES_AVAILABLE)); + } catch (JSONException e) { + System.errorLogging(e); + } catch (IOException e) { + Logger.error(e.getMessage()); + } + } + }); + mBranchesWaiter.start(); + } + + private void onMsfPathChanged() { + measureMsfSize(); + boolean haveMsf = false; + File dir; + File[] content; + + if ((dir = new File(System.getRubyPath())).isDirectory() || + (dir = new File(System.getMsfPath())).isDirectory()) { + content = dir.listFiles(); + haveMsf = content != null && content.length > 2; + } + + mWipeMSF.setEnabled(haveMsf); + } + + private void onMsfBranchesAvailable() { + String[] branches; + boolean hasRelease = false; + + try { + branches = GitHubParser.getMsfRepo().getBranches(); + mMsfBranch.setEntryValues(branches); + mMsfBranch.setEntries(branches); + for (int i = 0; !hasRelease && i < branches.length; i++) { + hasRelease = branches[i].equals("release"); + } + mMsfBranch.setDefaultValue((hasRelease ? "release" : "master")); + mMsfBranch.setEnabled(true); + } catch (JSONException e) { + System.errorLogging(e); + } catch (IOException e) { + Logger.error(e.getMessage()); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + getActivity().onBackPressed(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + public void onDestroy() { + if (mReceiver != null) { + getActivity().unregisterReceiver(mReceiver); + mReceiver = null; + } + super.onDestroy(); + } + } + + public void onBackPressed() { + getActivity().finish(); + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + } +} diff --git a/cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java b/cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java new file mode 100644 index 0000000000..6275e98cbf --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java @@ -0,0 +1,51 @@ +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.content.SharedPreferences; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; + +public class WifiScannerActivity extends AppCompatActivity { + + WifiScannerFragment f; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SharedPreferences themePrefs = getSharedPreferences("THEME", 0); + if (themePrefs.getBoolean("isDark", false)) + setTheme(R.style.DarkTheme); + else + setTheme(R.style.AppTheme); + setContentView(R.layout.main); + if (findViewById(R.id.mainframe) != null) { + if (savedInstanceState != null) { + return; + } + f = new WifiScannerFragment(); + getSupportFragmentManager().beginTransaction() + .add(R.id.mainframe, f).commit(); + } + } + + public void onBackPressed() { + f.onBackPressed(); + } +} \ No newline at end of file diff --git a/cSploit/src/main/java/org/csploit/android/WifiScannerFragment.java b/cSploit/src/main/java/org/csploit/android/WifiScannerFragment.java new file mode 100644 index 0000000000..51d6efcf6b --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/WifiScannerFragment.java @@ -0,0 +1,671 @@ +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.graphics.Typeface; +import android.net.wifi.ScanResult; +import android.net.wifi.SupplicantState; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import androidx.fragment.app.ListFragment; +import androidx.core.content.ContextCompat; +import androidx.core.view.MenuItemCompat; +import androidx.appcompat.app.AppCompatActivity; +import android.text.ClipboardManager; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import org.csploit.android.core.ManagedReceiver; +import org.csploit.android.core.System; +import org.csploit.android.gui.dialogs.ErrorDialog; +import org.csploit.android.gui.dialogs.InputDialog; +import org.csploit.android.gui.dialogs.InputDialog.InputDialogListener; +import org.csploit.android.gui.dialogs.WifiCrackDialog; +import org.csploit.android.gui.dialogs.WifiCrackDialog.WifiCrackDialogListener; +import org.csploit.android.wifi.Keygen; +import org.csploit.android.wifi.NetworkManager; +import org.csploit.android.wifi.WirelessMatcher; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static android.net.wifi.WifiManager.EXTRA_NEW_STATE; +import static android.net.wifi.WifiManager.SCAN_RESULTS_AVAILABLE_ACTION; +import static android.net.wifi.WifiManager.SUPPLICANT_STATE_CHANGED_ACTION; + +@SuppressWarnings("deprecation") +public class WifiScannerFragment extends ListFragment +{ + public static final String CONNECTED = "WifiScannerActivity.CONNECTED"; + private WifiManager mWifiManager = null; + private WirelessMatcher mWifiMatcher = null; + private TextView mStatusText = null; + private ScanReceiver mScanReceiver = null; + private ConnectionReceiver mConnectionReceiver = null; + private ScanAdapter mAdapter = null; + private boolean mConnected = false; + private boolean mScanning = false; + private Menu mMenu = null; + private ScanResult mCurrentAp = null; + private List mKeyList = null; + private String mCurrentKey = null; + private int mCurrentNetworkId = -1; + private ClipboardManager mClipboard = null; + private WifiConfiguration mPreviousConfig = null; + + private void onEnd() { + List configurations = mWifiManager.getConfiguredNetworks(); + boolean restore = false; + + if(configurations != null) { + for(WifiConfiguration config : configurations){ + mWifiManager.enableNetwork(config.networkId, false); + restore = restore || (mPreviousConfig != null && mPreviousConfig.SSID.equals(config.SSID) && + ( mCurrentKey == null || !mCurrentKey.equals(mPreviousConfig.preSharedKey) ) ); + } + } + + if(restore && !mConnected) { + restorePreviousConfig(); + } + } + + private void restorePreviousConfig() { + WifiConfiguration config = NetworkManager.getWifiConfiguration(mWifiManager, mPreviousConfig); + + if(config != null) { + mWifiManager.removeNetwork(config.networkId); + } + + if(mWifiManager.addNetwork(mPreviousConfig) != -1) { + mWifiManager.saveConfiguration(); + } + + mPreviousConfig = null; + } + + public void onSuccessfulConnection(){ + if(mCurrentKey != null){ + mStatusText.setText(Html.fromHtml(getString(R.string.connected_to) + mCurrentAp.SSID + getString(R.string.connected_to2) + mCurrentKey + getString(R.string.connected_to3))); + Toast.makeText(getActivity(), getString(R.string.wifi_key_copied), Toast.LENGTH_SHORT).show(); + mClipboard.setText(mCurrentKey); + } else + mStatusText.setText(Html.fromHtml(getString(R.string.connected_to) + mCurrentAp.SSID + " !")); + + mConnectionReceiver.unregister(); + mConnected = true; + + onEnd(); + } + + public void onFailedConnection(){ + mWifiManager.removeNetwork(mCurrentNetworkId); + + if(!mKeyList.isEmpty()) { + nextConnectionAttempt(); + return; + } + + mStatusText.setText(Html.fromHtml(getString(R.string.connection_to) + mCurrentAp.SSID + getString(R.string.connection_to2))); + + List configurations = mWifiManager.getConfiguredNetworks(); + if(configurations != null){ + for(WifiConfiguration config : configurations){ + mWifiManager.enableNetwork(config.networkId, false); + } + } + + mConnectionReceiver.unregister(); + onEnd(); + } + + @Override + public void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + SharedPreferences themePrefs = getActivity().getSharedPreferences("THEME", 0); + Boolean isDark = themePrefs.getBoolean("isDark", false); + if (isDark) + getActivity().setTheme(R.style.DarkTheme); + else + getActivity().setTheme(R.style.AppTheme); + setHasOptionsMenu(true); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + setHasOptionsMenu(true); + return inflater.inflate(R.layout.wifi_scanner, container, false); + } + + @Override + public void onViewCreated(View v, Bundle savedInstanceState) { + SharedPreferences themePrefs = getActivity().getSharedPreferences("THEME", 0); + Boolean isDark = themePrefs.getBoolean("isDark", false); + if (isDark) { + getActivity().setTheme(R.style.DarkTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window_dark)); + } + else { + getActivity().setTheme(R.style.AppTheme); + v.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.background_window)); + } + mWifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); + mClipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); + mWifiMatcher = new WirelessMatcher(getResources().openRawResource(R.raw.alice)); + mScanReceiver = new ScanReceiver(); + mConnectionReceiver = new ConnectionReceiver(); + mStatusText = (TextView) v.findViewById(R.id.scanStatusText); + mAdapter = new ScanAdapter(); + mKeyList = new ArrayList<>(); + + getListView().setAdapter(mAdapter); + + mStatusText.setText( getString(R.string.wifi_initializing) ); + + if(!mWifiManager.isWifiEnabled()){ + mStatusText.setText( getString(R.string.wifi_activating_iface) ); + mWifiManager.setWifiEnabled(true); + mStatusText.setText(getString(R.string.wifi_activated)); + } + + mScanReceiver.register(getActivity()); + + if(mMenu != null) { + MenuItem menuScan = mMenu.findItem(R.id.scan); + MenuItemCompat.setActionView(menuScan, new ProgressBar(getActivity())); + } + + mStatusText.setText( getString(R.string.wifi_scanning) ); + mScanning = true; + + mWifiManager.startScan(); + } + + private int performConnection(final ScanResult ap, final String key){ + mWifiManager.disconnect(); + + mCurrentKey = key; + mCurrentAp = ap; + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (key != null) + mStatusText.setText(Html.fromHtml(getString(R.string.wifi_attempting_to) + " " + ap.SSID + " " + getString(R.string.wifi_with_key) + " " + key + " ...")); + else + mStatusText.setText(Html.fromHtml(getString(R.string.wifi_connecting_to) + " " + ap.SSID + " ...")); + } + }); + + WifiConfiguration config = new WifiConfiguration(); + int network = -1; + + config.SSID = "\"" + ap.SSID + "\""; + config.BSSID = ap.BSSID; + + /* + * Configure security. + */ + if(ap.capabilities.contains("WEP")){ + config.wepKeys[0] = "\"" + key + "\""; + config.wepTxKeyIndex = 0; + config.status = WifiConfiguration.Status.ENABLED; + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); + } else if(ap.capabilities.contains("WPA")) + config.preSharedKey = "\"" + key + "\""; + + else + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + + network = mWifiManager.addNetwork(config); + if(network != -1){ + if(mWifiManager.saveConfiguration()){ + config = NetworkManager.getWifiConfiguration(mWifiManager, config); + + // Make it the highest priority. + network = config.networkId; + + int old_priority = config.priority, + max_priority = NetworkManager.getMaxPriority(mWifiManager) + 1; + + if(max_priority > 9999){ + NetworkManager.shiftPriorityAndSave(mWifiManager); + config = NetworkManager.getWifiConfiguration(mWifiManager, config); + } + + // Set highest priority to this configured network + config.priority = max_priority; + network = mWifiManager.updateNetwork(config); + + if(network != -1){ + // Do not disable others + if(mWifiManager.enableNetwork(network, false)){ + if(mWifiManager.saveConfiguration()){ + // We have to retrieve the WifiConfiguration after save. + config = NetworkManager.getWifiConfiguration(mWifiManager, config); + if(config != null){ + // Disable others, but do not save. + // Just to force the WifiManager to connect to it. + if(mWifiManager.enableNetwork(config.networkId, true)){ + return mWifiManager.reassociate() ? config.networkId : -1; + } + } + } else + config.priority = old_priority; + } else + config.priority = old_priority; + } + } + } + + return network; + } + + private void nextConnectionAttempt(){ + if(mKeyList.size() > 0){ + mCurrentKey = mKeyList.get(0); + + mKeyList.remove(0); + + mCurrentNetworkId = performConnection(mCurrentAp, mCurrentKey); + if(mCurrentNetworkId != -1) + mConnectionReceiver.register(getActivity()); + + else + mConnectionReceiver.unregister(); + } else + mConnectionReceiver.unregister(); + } + + private void performCracking(final Keygen keygen, final ScanResult ap){ + + final ProgressDialog dialog = ProgressDialog.show(getActivity(), "", getString(R.string.generating_keys), true, false); + + new Thread(new Runnable(){ + @Override + public void run(){ + dialog.show(); + + try{ + List keys = keygen.getKeys(); + + if(keys == null || keys.size() == 0){ + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + new ErrorDialog(getString(R.string.error), keygen.getErrorMessage().isEmpty() ? getString(R.string.wifi_error_keys) : keygen.getErrorMessage(), getActivity()).show(); + } + }); + } + else{ + mCurrentAp = ap; + mKeyList = keys; + + nextConnectionAttempt(); + } + } + catch(Exception e){ + System.errorLogging(e); + } finally{ + dialog.dismiss(); + } + } + }).start(); + } + + @Override + public void onListItemClick(ListView l, View v, int position, long id){ + super.onListItemClick(l, v, position, id); + + final ScanResult result = mAdapter.getItem(position); + if(result != null){ + final Keygen keygen = mWifiMatcher.getKeygen(result); + + mPreviousConfig = NetworkManager.getWifiConfiguration(mWifiManager, result); + + if(mPreviousConfig != null ) { + mWifiManager.removeNetwork(mPreviousConfig.networkId); + } + + if(keygen != null && (result.capabilities.contains("WEP") || result.capabilities.contains("WPA"))){ + mKeyList.clear(); + new WifiCrackDialog + ( + result.SSID, + getResources().getString(R.string.enter_key_or_crack), + getActivity(), + new WifiCrackDialogListener(){ + @Override + public void onManualConnect(String key){ + mCurrentNetworkId = performConnection(result, key); + if(mCurrentNetworkId != -1) + mConnectionReceiver.register(getActivity()); + + else + mConnectionReceiver.unregister(); + } + + @Override + public void onCrack(){ + performCracking(keygen, result); + } + } + ).show(); + } else{ + if(result.capabilities.contains("WEP") || result.capabilities.contains("WPA")){ + new InputDialog(result.SSID, getString(R.string.enter_wifi_key), null, true, true, getActivity(), new InputDialogListener(){ + @Override + public void onInputEntered(String input){ + mCurrentNetworkId = performConnection(result, input); + if(mCurrentNetworkId != -1) + mConnectionReceiver.register(getActivity()); + else + mConnectionReceiver.unregister(); + } + }).show(); + } else + performConnection(result, null); + } + } + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater mi){ + mMenu = menu; + mi.inflate(R.menu.wifi_scanner, menu); + + if(mScanning) { + MenuItem menuScan = mMenu.findItem(R.id.scan); + MenuItemCompat.setActionView(menuScan, new ProgressBar(getActivity())); + } + super.onCreateOptionsMenu(menu, mi); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item){ + if(item.getItemId() == R.id.scan){ + if(mMenu != null){ + MenuItem menuScan = mMenu.findItem(R.id.scan); + MenuItemCompat.setActionView(menuScan, new ProgressBar(getActivity())); + } + + mWifiManager.startScan(); + + mStatusText.setText(getString(R.string.scanning)); + mScanning = true; + + return true; + } + if(item.getItemId() == android.R.id.home){ + onBackPressed(); + return true; + } else + return super.onOptionsItemSelected(item); + } + + public void onBackPressed(){ + mScanReceiver.unregister(); + mConnectionReceiver.unregister(); + + Bundle bundle = new Bundle(); + bundle.putBoolean(CONNECTED, mConnected); + + Intent intent = new Intent(); + intent.putExtras(bundle); + + getActivity().setResult(AppCompatActivity.RESULT_OK, intent); + getActivity().finish(); + getActivity().overridePendingTransition(R.anim.fadeout, R.anim.fadein); + } + + public class ScanAdapter extends ArrayAdapter{ + private ArrayList mResults = null; + + public ScanAdapter(){ + super(getActivity(), R.layout.wifi_scanner_list_item); + + mResults = new ArrayList(); + } + + public void addResult(ScanResult result){ + for(ScanResult res : mResults){ + if(res.BSSID.equals(result.BSSID)) + return; + } + + mResults.add(result); + + Collections.sort(mResults, new Comparator(){ + @Override + public int compare(ScanResult lhs, ScanResult rhs){ + if(lhs.level > rhs.level) + return -1; + + else if(rhs.level > lhs.level) + return 1; + + else + return 0; + } + }); + } + + public void reset(){ + mResults.clear(); + notifyDataSetChanged(); + } + + @Override + public int getCount(){ + return mResults.size(); + } + + @Override + public ScanResult getItem(int position){ + return mResults.get(position); + } + + public int getWifiIcon(ScanResult wifi){ + int level = Math.abs(wifi.level); + + if(wifi.capabilities.contains("WPA") || wifi.capabilities.contains("WEP")){ + if(level <= 76) + return R.drawable.ic_wifi_lock_signal_4; + + else if(level <= 87) + return R.drawable.ic_wifi_lock_signal_3; + + else if(level <= 98) + return R.drawable.ic_wifi_lock_signal_2; + + else + return R.drawable.ic_wifi_lock_signal_1; + } else{ + if(level <= 76) + return R.drawable.ic_wifi_signal_4; + + else if(level <= 87) + return R.drawable.ic_wifi_signal_3; + + else if(level <= 98) + return R.drawable.ic_wifi_signal_2; + + else + return R.drawable.ic_wifi_signal_1; + } + } + + @Override + public View getView(int position, View convertView, ViewGroup parent){ + View row = convertView; + ResultHolder holder = null; + + if(row == null){ + LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater.inflate(R.layout.wifi_scanner_list_item, parent, false); + + holder = new ResultHolder(); + + holder.supported = (ImageView) (row != null ? row.findViewById(R.id.supported) : null); + holder.powerIcon = (ImageView) (row != null ? row.findViewById(R.id.powerIcon) : null); + holder.ssid = (TextView) (row != null ? row.findViewById(R.id.ssid) : null); + holder.bssid = (TextView) (row != null ? row.findViewById(R.id.bssid) : null); + + if(row != null) + row.setTag(holder); + + } else{ + holder = (ResultHolder) row.getTag(); + } + + ScanResult result = mResults.get(position); + + holder.powerIcon.setImageResource(getWifiIcon(result)); + holder.ssid.setTypeface(null, Typeface.BOLD); + holder.ssid.setText(result.SSID); + + String protection = "Open"; + boolean isOpen = true; + + List capabilities = Arrays.asList(result.capabilities.split("[\\-\\[\\]]")); + + if(capabilities.contains("WEP")){ + isOpen = false; + protection = "WEP"; + } else if(capabilities.contains("WPA2")){ + isOpen = false; + protection = "WPA2"; + } else if(capabilities.contains("WPA")){ + isOpen = false; + protection = "WPA"; + } + + if(capabilities.contains("PSK")) + protection += " PSK"; + + if(capabilities.contains("WPS")) + protection += " ( WPS )"; + + holder.bssid.setText(Html.fromHtml( + result.BSSID.toUpperCase() + " " + protection + " ( " + (Math.round((result.frequency / 1000.0) * 10.0) / 10.0) + " Ghz )") + ); + + if(mWifiMatcher.getKeygen(result) != null || isOpen) + holder.supported.setImageResource(R.drawable.ic_possible); + + else + holder.supported.setImageResource(R.drawable.ic_impossible); + + + return row; + } + + class ResultHolder{ + ImageView supported; + ImageView powerIcon; + TextView ssid; + TextView bssid; + } + } + + private class ScanReceiver extends ManagedReceiver{ + private IntentFilter mFilter = null; + + public ScanReceiver(){ + mFilter = new IntentFilter(SCAN_RESULTS_AVAILABLE_ACTION); + } + + public IntentFilter getFilter(){ + return mFilter; + } + + @SuppressWarnings("ConstantConditions") + @Override + public void onReceive(Context context, Intent intent){ + if(intent.getAction().equals(SCAN_RESULTS_AVAILABLE_ACTION)){ + if(mScanning){ + mAdapter.reset(); + + if(mMenu != null){ + MenuItem menuScan = mMenu.findItem(R.id.scan); + MenuItemCompat.setActionView(menuScan, null); + } + + List results = mWifiManager.getScanResults(); + + for(ScanResult result : results){ + mAdapter.addResult(result); + } + + mScanning = false; + mStatusText.setText(getString(R.string.wifi_scan_finished)); + } + + mAdapter.notifyDataSetChanged(); + } + } + } + + private class ConnectionReceiver extends ManagedReceiver{ + private IntentFilter mFilter = null; + + public ConnectionReceiver(){ + mFilter = new IntentFilter(SUPPLICANT_STATE_CHANGED_ACTION); + } + + public IntentFilter getFilter(){ + return mFilter; + } + + @Override + public void onReceive(Context context, Intent intent){ + SupplicantState state = intent.getParcelableExtra(EXTRA_NEW_STATE); + + if(state != null){ + if(state.equals(SupplicantState.COMPLETED)){ + onSuccessfulConnection(); + } else if(state.equals(SupplicantState.DISCONNECTED)){ + onFailedConnection(); + } + } + } + } +} diff --git a/cSploit/src/org/csploit/android/core/Child.java b/cSploit/src/main/java/org/csploit/android/core/Child.java similarity index 100% rename from cSploit/src/org/csploit/android/core/Child.java rename to cSploit/src/main/java/org/csploit/android/core/Child.java diff --git a/cSploit/src/org/csploit/android/core/ChildManager.java b/cSploit/src/main/java/org/csploit/android/core/ChildManager.java similarity index 100% rename from cSploit/src/org/csploit/android/core/ChildManager.java rename to cSploit/src/main/java/org/csploit/android/core/ChildManager.java diff --git a/cSploit/src/org/csploit/android/core/Client.java b/cSploit/src/main/java/org/csploit/android/core/Client.java similarity index 100% rename from cSploit/src/org/csploit/android/core/Client.java rename to cSploit/src/main/java/org/csploit/android/core/Client.java diff --git a/cSploit/src/org/csploit/android/core/CrashReporter.java b/cSploit/src/main/java/org/csploit/android/core/CrashReporter.java similarity index 100% rename from cSploit/src/org/csploit/android/core/CrashReporter.java rename to cSploit/src/main/java/org/csploit/android/core/CrashReporter.java diff --git a/cSploit/src/org/csploit/android/core/ExecChecker.java b/cSploit/src/main/java/org/csploit/android/core/ExecChecker.java similarity index 99% rename from cSploit/src/org/csploit/android/core/ExecChecker.java rename to cSploit/src/main/java/org/csploit/android/core/ExecChecker.java index 1c9b19bf22..efe029ac76 100644 --- a/cSploit/src/org/csploit/android/core/ExecChecker.java +++ b/cSploit/src/main/java/org/csploit/android/core/ExecChecker.java @@ -36,7 +36,7 @@ private static class FuseBind { @Override public boolean equals(Object o) { - if(o.getClass() != FuseBind.class) + if(o == null || o.getClass() != FuseBind.class) return false; FuseBind b = (FuseBind)o; @@ -57,6 +57,8 @@ public boolean equals(Object o) { } } + + /** * test if root can execute stuff inside a directory * @param dir the directory to check diff --git a/cSploit/src/org/csploit/android/core/KnownIssues.java b/cSploit/src/main/java/org/csploit/android/core/KnownIssues.java similarity index 87% rename from cSploit/src/org/csploit/android/core/KnownIssues.java rename to cSploit/src/main/java/org/csploit/android/core/KnownIssues.java index 1c034a63a1..66f027e0e5 100644 --- a/cSploit/src/org/csploit/android/core/KnownIssues.java +++ b/cSploit/src/main/java/org/csploit/android/core/KnownIssues.java @@ -31,8 +31,9 @@ public void check() { public void fromFile(String file) { String line = null; + BufferedReader reader = null; try { - BufferedReader reader = new BufferedReader(new FileReader(file)); + reader = new BufferedReader(new FileReader(file)); while((line = reader.readLine()) != null) { line = line.trim(); @@ -54,6 +55,14 @@ public void fromFile(String file) { Logger.warning(String.format("unable to read from '%s': %s", file, e.getMessage())); } catch (NumberFormatException e) { Logger.error(String.format("unable to parse '%s' as number.", line)); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + // Nothing else matters + } + } } } diff --git a/cSploit/src/org/csploit/android/core/Logger.java b/cSploit/src/main/java/org/csploit/android/core/Logger.java similarity index 100% rename from cSploit/src/org/csploit/android/core/Logger.java rename to cSploit/src/main/java/org/csploit/android/core/Logger.java diff --git a/cSploit/src/org/csploit/android/core/ManagedReceiver.java b/cSploit/src/main/java/org/csploit/android/core/ManagedReceiver.java similarity index 100% rename from cSploit/src/org/csploit/android/core/ManagedReceiver.java rename to cSploit/src/main/java/org/csploit/android/core/ManagedReceiver.java diff --git a/cSploit/src/org/csploit/android/core/MultiAttackService.java b/cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java similarity index 95% rename from cSploit/src/org/csploit/android/core/MultiAttackService.java rename to cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java index 8956a8c6de..ee7d1a1054 100644 --- a/cSploit/src/org/csploit/android/core/MultiAttackService.java +++ b/cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java @@ -7,7 +7,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.support.v4.app.NotificationCompat; +import androidx.core.app.NotificationCompat; import org.csploit.android.R; import org.csploit.android.net.Network; @@ -17,6 +17,7 @@ import org.csploit.android.tools.NMap; import java.util.List; +import java.util.Locale; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -84,8 +85,9 @@ public void run() { synchronized (MultiAttackService.this) { completedTargets++; - mBuilder.setContentInfo(String.format("%d/%d", - completedTargets, totalTargets)); + mBuilder.setContentInfo(String.format(Locale.getDefault(), "%d/%d", + completedTargets, totalTargets)) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } @@ -199,7 +201,7 @@ private void setupNotification() { // get notification manager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // get notification builder - mBuilder = new NotificationCompat.Builder(this); + mBuilder = new NotificationCompat.Builder(this, getBaseContext().getString(R.string.csploitChannelId)); // create a broadcast receiver to get actions // performed on the notification by the user mReceiver = new BroadcastReceiver() { @@ -237,7 +239,8 @@ private void finishNotification() { mBuilder.setContentIntent(PendingIntent.getActivity(this, CLICK_CODE, mContentIntent, 0)) .setProgress(0,0,false) .setAutoCancel(true) - .setDeleteIntent(PendingIntent.getActivity(this, 0, new Intent(), 0)); + .setDeleteIntent(PendingIntent.getActivity(this, 0, new Intent(), 0)) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } if(mReceiver!=null) diff --git a/cSploit/src/org/csploit/android/core/Plugin.java b/cSploit/src/main/java/org/csploit/android/core/Plugin.java similarity index 93% rename from cSploit/src/org/csploit/android/core/Plugin.java rename to cSploit/src/main/java/org/csploit/android/core/Plugin.java index 8e411e307d..d044fde5a5 100644 --- a/cSploit/src/org/csploit/android/core/Plugin.java +++ b/cSploit/src/main/java/org/csploit/android/core/Plugin.java @@ -20,15 +20,15 @@ import android.content.Context; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.MenuItem; import org.csploit.android.R; import org.csploit.android.net.Target; -import org.csploit.android.net.Target.Exploit; -import org.csploit.android.net.Target.Port; import org.csploit.android.net.metasploit.RPCClient; +import java.util.Arrays; + public abstract class Plugin extends AppCompatActivity { public static final int NO_LAYOUT = -1; @@ -43,7 +43,7 @@ public Plugin(int nameStringId, int descStringId, Target.Type[] allowedTargetTyp mNameStringId = nameStringId; mDescriptionStringId = descStringId; - mAllowedTargetTypes = allowedTargetTypes; + mAllowedTargetTypes = Arrays.copyOf(allowedTargetTypes, allowedTargetTypes.length); mLayoutId = layoutId; mIconId = iconResourceId; } @@ -61,7 +61,7 @@ public int getDescription(){ } public Target.Type[] getAllowedTargetTypes(){ - return mAllowedTargetTypes; + return Arrays.copyOf(mAllowedTargetTypes, mAllowedTargetTypes.length); } public int getIconResourceId(){ diff --git a/cSploit/src/org/csploit/android/core/Profiler.java b/cSploit/src/main/java/org/csploit/android/core/Profiler.java similarity index 100% rename from cSploit/src/org/csploit/android/core/Profiler.java rename to cSploit/src/main/java/org/csploit/android/core/Profiler.java diff --git a/cSploit/src/org/csploit/android/core/SettingReceiver.java b/cSploit/src/main/java/org/csploit/android/core/SettingReceiver.java similarity index 100% rename from cSploit/src/org/csploit/android/core/SettingReceiver.java rename to cSploit/src/main/java/org/csploit/android/core/SettingReceiver.java diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java similarity index 67% rename from cSploit/src/org/csploit/android/core/System.java rename to cSploit/src/main/java/org/csploit/android/core/System.java index 2c144bb62d..b5d22efe4f 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -18,7 +18,6 @@ */ package org.csploit.android.core; -import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.content.Context; @@ -34,13 +33,14 @@ import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.preference.PreferenceManager; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AppCompatActivity; import android.util.SparseIntArray; -import org.acra.ACRA; -import org.acra.ACRAConfiguration; import org.apache.commons.compress.utils.IOUtils; import org.csploit.android.R; -import org.csploit.android.WifiScannerActivity; +import org.csploit.android.WifiScannerFragment; import org.csploit.android.gui.dialogs.FatalDialog; import org.csploit.android.helpers.NetworkHelper; import org.csploit.android.helpers.ThreadHelper; @@ -87,13 +87,14 @@ import java.util.List; import java.util.Map; import java.util.Observer; +import java.util.SortedSet; +import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -public class System -{ +public class System { public static final String SESSION_MAGIC = "cSploitSession"; private static final String ERROR_LOG_FILENAME = "csploit-debug-error.log"; @@ -108,10 +109,10 @@ public class System private static boolean mInitialized = false; private static String mLastError = ""; private static Context mContext = null; - private static WifiLock mWifiLock = null; - private static WakeLock mWakeLock = null; + private static volatile WifiLock mWifiLock = null; + private static volatile WakeLock mWakeLock = null; private static Network mNetwork = null; - private static final List mTargets = new ArrayList<>(); + private static final SortedSet mTargets = new TreeSet<>(); private static Target mCurrentTarget = null; private static Map mServices = null; private static Map mPorts = null; @@ -124,10 +125,11 @@ public class System // toolbox singleton private static ToolBox mTools = null; - private static HTTPSRedirector mRedirector = null; - private static Proxy mProxy = null; - private static Server mServer = null; + private static volatile HTTPSRedirector mRedirector = null; + private static volatile Proxy mProxy = null; + private static volatile Server mServer = null; + private static String mIfname = null; private static String mStoragePath = null; private static String mSessionName = null; @@ -135,10 +137,10 @@ public class System private static Object mCustomData = null; - private static RPCClient mMsfRpc = null; - private static Exploit mExploit = null; - private static Payload mPayload = null; - private static Session mMsfSession = null; + private static RPCClient mMsfRpc = null; + private static Exploit mExploit = null; + private static Payload mPayload = null; + private static Session mMsfSession = null; private static boolean mCoreInitialized = false; @@ -148,9 +150,9 @@ public class System private final static LinkedList mSettingReceivers = new LinkedList(); - public static void init(Context context) throws Exception{ + public static void init(Context context) throws Exception { mContext = context; - try{ + try { Logger.debug("initializing System..."); mStoragePath = getSettings().getString("PREF_SAVE_PATH", Environment.getExternalStorageDirectory().toString()); mSessionName = "csploit-session-" + java.lang.System.currentTimeMillis(); @@ -163,54 +165,63 @@ public static void init(Context context) throws Exception{ // if we are here, network initialization didn't throw any error, lock wifi WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); - if(mWifiLock == null) + if (mWifiLock == null) mWifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, "wifiLock"); - if(!mWifiLock.isHeld()) + if (!mWifiLock.isHeld()) mWifiLock.acquire(); // wake lock if enabled - if(getSettings().getBoolean("PREF_WAKE_LOCK", true)){ + if (getSettings().getBoolean("PREF_WAKE_LOCK", true)) { PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - if(mWakeLock == null) + if (mWakeLock == null) mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "wakeLock"); - if(!mWakeLock.isHeld()) + if (!mWakeLock.isHeld()) mWakeLock.acquire(); } // set ports - try{ - HTTP_PROXY_PORT = Integer.parseInt(getSettings().getString("PREF_HTTP_PROXY_PORT", "8080")); + try { + HTTP_PROXY_PORT = Integer.parseInt(getSettings().getString("PREF_HTTP_PROXY_PORT", "8080")); HTTP_SERVER_PORT = Integer.parseInt(getSettings().getString("PREF_HTTP_SERVER_PORT", "8081")); HTTPS_REDIR_PORT = Integer.parseInt(getSettings().getString("PREF_HTTPS_REDIRECTOR_PORT", "8082")); - MSF_RPC_PORT = Integer.parseInt(getSettings().getString("MSF_RPC_PORT", "55553")); - } catch(NumberFormatException e){ + MSF_RPC_PORT = Integer.parseInt(getSettings().getString("MSF_RPC_PORT", "55553")); + } catch (NumberFormatException e) { HTTP_PROXY_PORT = 8080; HTTP_SERVER_PORT = 8081; HTTPS_REDIR_PORT = 8082; MSF_RPC_PORT = 55553; } + // initialize network data at the end uncaughtReloadNetworkMapping(); - ThreadHelper.getSharedExecutor().execute(new Runnable() { - @Override - public void run() { - preloadServices(); - preloadVendors(); - } - }); - } - catch(Exception e){ - if(!(e instanceof NoRouteToHostException)) + if(isCoreInstalled()) + beginLoadServicesAndVendors(); + } catch (Exception e) { + if (!(e instanceof NoRouteToHostException)) errorLogging(e); throw e; } } + private static void beginLoadServicesAndVendors() { + ThreadHelper.getSharedExecutor().execute(new Runnable() { + @Override + public void run() { + preloadVendors(); + preloadServices(); + } + }); + } + + public static void onCoreInstalled() { + beginLoadServicesAndVendors(); + } + public static void reloadTools() { getTools().reload(); } @@ -240,18 +251,18 @@ private static void startCoreDaemon() throws SuException, DaemonException { String cmd; cmd = String.format("{ echo 'ACCESS GRANTED' >&2; cd '%s' && exec ./start_daemon.sh ;} || exit 1\n", - System.getCorePath()); + System.getCorePath()); writer.write(cmd.getBytes()); writer.flush(); ret = shell.waitFor(); - if(ret != 0) { + if (ret != 0) { reader = new BufferedReader(new InputStreamReader(shell.getErrorStream())); - while((line = reader.readLine()) != null) { - if(line.equals("ACCESS GRANTED")) { + while ((line = reader.readLine()) != null) { + if (line.equals("ACCESS GRANTED")) { access_granted = true; Logger.debug("'ACCESS GRANTED' found"); } else @@ -260,33 +271,39 @@ private static void startCoreDaemon() throws SuException, DaemonException { } else access_granted = true; - } catch ( IOException e) { + } catch (IOException e) { // command "su" not found or cannot write to it's stdin Logger.error(e.getMessage()); } catch (InterruptedException e) { // interrupted while waiting for shell exit value Logger.error(e.getMessage()); } finally { - if(writer != null) - try { writer.close(); } catch (IOException ignored) {} - if(reader != null) - try { reader.close(); } catch (IOException ignored) {} + if (writer != null) + try { + writer.close(); + } catch (IOException ignored) { + } + if (reader != null) + try { + reader.close(); + } catch (IOException ignored) { + } } mKnownIssues.fromFile(String.format("%s/issues", getCorePath())); - if(!access_granted) + if (!access_granted) throw new SuException(); - if(ret != 0) { + if (ret != 0) { File log = new File(System.getCorePath(), "cSploitd.log"); DaemonException daemonException = new DaemonException("core daemon returned " + ret); - if(log.exists() && log.canRead()) { + /* if (log.exists() && log.canRead()) { ACRAConfiguration conf = ACRA.getConfig(); conf.setApplicationLogFile(log.getAbsolutePath()); ACRA.setConfig(conf); ACRA.getErrorReporter().handleException(daemonException, false); - } + }*/ throw daemonException; } } @@ -294,11 +311,11 @@ private static void startCoreDaemon() throws SuException, DaemonException { /** * shutdown the core daemon */ - public static void shutdownCoreDaemon(){ - if(!Client.isConnected() && !Client.Connect(getCorePath() + "/cSploitd.sock")) { + public static void shutdownCoreDaemon() { + if (!Client.isConnected() && !Client.Connect(getCorePath() + "/cSploitd.sock")) { return; // daemon is not running } - if(!Client.isAuthenticated() && !Client.Login("android", "DEADBEEF")) { + if (!Client.isAuthenticated() && !Client.Login("android", "DEADBEEF")) { Logger.error("cannot login to daemon"); } Client.Shutdown(); @@ -310,13 +327,13 @@ public static void shutdownCoreDaemon(){ public static void initCore() throws DaemonException, SuException { - if(mCoreInitialized) + if (mCoreInitialized) return; String socket_path = getCorePath() + "/cSploitd.sock"; - if(!Client.isConnected()) { - if(!Client.Connect(socket_path)) { + if (!Client.isConnected()) { + if (!Client.Connect(socket_path)) { startCoreDaemon(); if (!Client.Connect(socket_path)) throw new DaemonException("cannot connect to core daemon"); @@ -337,34 +354,44 @@ public static void initCore() throws DaemonException, SuException { mCoreInitialized = true; Services.getNetworkRadar().onAutoScanChanged(); + getNetwork().onCoreAttached(); + } + + public static void setIfname(String ifname) { + mIfname = ifname; + } + + public static String getIfname() { + return mIfname; } - public static void reloadNetworkMapping(){ - try{ + public static boolean reloadNetworkMapping() { + try { uncaughtReloadNetworkMapping(); - } - catch(NoRouteToHostException nrthe){ + return true; + } catch (NoRouteToHostException nrthe) { // swallow bitch - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } + return false; } private static void uncaughtReloadNetworkMapping() throws UnknownHostException, SocketException { - mNetwork = new Network(mContext); + mNetwork = new Network(mContext, mIfname); + mIfname = mNetwork.getInterface().getName(); reset(); mInitialized = true; } - public static boolean checkNetworking(final Activity current){ - if(!Network.isWifiConnected(mContext)){ + public static boolean checkNetworking(final FragmentActivity current) { + if (!mNetwork.isConnected()) { Intent intent = new Intent(); - intent.putExtra(WifiScannerActivity.CONNECTED, false); - current.setResult(Activity.RESULT_OK, intent); + intent.putExtra(WifiScannerFragment.CONNECTED, false); + current.setResult(AppCompatActivity.RESULT_OK, intent); String title = current.getString(R.string.error); String message = current.getString(R.string.wifi_went_down); @@ -383,7 +410,8 @@ public synchronized static void setTargetListObserver(Observer targetListObserve /** * notify that a specific target of the list has been changed - * @param target the changed target + * + * @param target the changed target */ public static void notifyTargetListChanged(Target target) { Observer o; @@ -391,7 +419,7 @@ public static void notifyTargetListChanged(Target target) { o = targetListObserver; } - if(o==null) + if (o == null) return; o.update(null, target); @@ -404,27 +432,27 @@ public static void notifyTargetListChanged() { notifyTargetListChanged(null); } - public static void setLastError(String error){ + public static void setLastError(String error) { mLastError = error; } - public static String getLastError(){ + public static String getLastError() { return mLastError; } - public static synchronized void errorLogging(Throwable e){ + public static synchronized void errorLogging(Throwable e) { String message = "Unknown error.", - trace = "Unknown trace.", - filename = (new File(Environment.getExternalStorageDirectory().toString(), ERROR_LOG_FILENAME)).getAbsolutePath(); + trace = "Unknown trace.", + filename = (new File(Environment.getExternalStorageDirectory().toString(), ERROR_LOG_FILENAME)).getAbsolutePath(); - if(e != null){ - if(e.getMessage() != null && !e.getMessage().isEmpty()) + if (e != null) { + if (e.getMessage() != null && !e.getMessage().isEmpty()) message = e.getMessage(); - else if(e.toString() != null) + else if (e.toString() != null) message = e.toString(); - if(message.equals(mLastError)) + if (message.equals(mLastError)) return; Writer sWriter = new StringWriter(); @@ -434,16 +462,15 @@ else if(e.toString() != null) trace = sWriter.toString(); - if(mContext != null && getSettings().getBoolean("PREF_DEBUG_ERROR_LOGGING", false)){ - try{ + if (mContext != null && getSettings().getBoolean("PREF_DEBUG_ERROR_LOGGING", false)) { + try { FileWriter fWriter = new FileWriter(filename, true); BufferedWriter bWriter = new BufferedWriter(fWriter); bWriter.write(trace); bWriter.close(); - } - catch(IOException ioe){ + } catch (IOException ioe) { Logger.error(ioe.toString()); } } @@ -454,24 +481,22 @@ else if(e.toString() != null) Logger.error(trace); } - public static String getPlatform() - { + public static String getPlatform() { int api = Build.VERSION.SDK_INT; String abi = Build.CPU_ABI; return String.format("android%d.%s", api, abi); } - public static String getCompatiblePlatform() - { + public static String getCompatiblePlatform() { int api = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN ? - Build.VERSION_CODES.JELLY_BEAN : Build.VERSION_CODES.GINGERBREAD); + Build.VERSION_CODES.JELLY_BEAN : Build.VERSION_CODES.GINGERBREAD); String abi = Build.CPU_ABI; return String.format("android%d.%s", api, abi); } - public static boolean isARM(){ + public static boolean isARM() { String abi = Build.CPU_ABI; Logger.debug("Build.CPU_ABI = " + abi); @@ -479,15 +504,15 @@ public static boolean isARM(){ return Build.CPU_ABI.toLowerCase().startsWith("armeabi"); } - public static synchronized void setCustomData(Object data){ + public static synchronized void setCustomData(Object data) { mCustomData = data; } - public static Object getCustomData(){ + public static Object getCustomData() { return mCustomData; } - public static InputStream getRawResource(int id){ + public static InputStream getRawResource(int id) { return mContext.getResources().openRawResource(id); } @@ -512,7 +537,7 @@ public static String getToolsPath() { } public static String getCorePath() { - return mContext.getFilesDir().getAbsolutePath(); + return mContext.getFilesDir().getAbsolutePath(); } public static void registerSettingListener(SettingReceiver receiver) { @@ -527,8 +552,8 @@ public static void registerSettingListener(SettingReceiver receiver) { public static void onSettingChanged(String key) { synchronized (mSettingReceivers) { - for(SettingReceiver r : mSettingReceivers) { - if(r.getFilter().contains(key)) + for (SettingReceiver r : mSettingReceivers) { + if (r.getFilter().contains(key)) r.onSettingChanged(key); } } @@ -540,13 +565,13 @@ public static void unregisterSettingListener(SettingReceiver receiver) { } } - public static void preloadServices(){ + public static void preloadServices() { if (!mServices.isEmpty()) return; FileReader fr = null; BufferedReader reader = null; - try{ + try { // preload network service and ports map fr = new FileReader(mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-services"); @@ -576,58 +601,71 @@ public static void preloadServices(){ } } - private static void preloadVendors(){ - if(mVendors == null){ - try{ + private static synchronized void preloadVendors() { + if (mVendors == null) { + FileInputStream fstream = null; + DataInputStream in = null; + BufferedReader reader = null; + try { mVendors = new HashMap<>(); - @SuppressWarnings("ConstantConditions") - FileInputStream fstream = new FileInputStream(mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-mac-prefixes"); - DataInputStream in = new DataInputStream(fstream); - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + fstream = new FileInputStream( + mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-mac-prefixes"); + + in = new DataInputStream(fstream); + reader = new BufferedReader(new InputStreamReader(in)); String line; - while((line = reader.readLine()) != null){ + while ((line = reader.readLine()) != null) { line = line.trim(); - if(!line.startsWith("#") && !line.isEmpty()){ + if (!line.startsWith("#") && !line.isEmpty()) { String[] tokens = line.split(" ", 2); - if(tokens.length == 2) + if (tokens.length == 2) mVendors.put(NetworkHelper.getOUICode(tokens[0]), tokens[1]); } } in.close(); - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); + } finally { + try { + if (fstream != null) fstream.close(); + if (in != null) in.close(); + if (reader != null) reader.close(); + } catch (IOException e) { + // Nothing else matters + } + + + } } } - public static String getSessionName(){ + public static String getSessionName() { return mSessionName; } - public static String getStoragePath(){ + public static String getStoragePath() { return mStoragePath; } - public static SharedPreferences getSettings(){ + public static SharedPreferences getSettings() { return PreferenceManager.getDefaultSharedPreferences(mContext); } - public static String getAppVersionName(){ - if(mApkVersion !=null) + public static String getAppVersionName() { + if (mApkVersion != null) return mApkVersion; - try{ + try { PackageManager manager = mContext.getPackageManager(); PackageInfo info = manager != null ? manager.getPackageInfo(mContext.getPackageName(), 0) : null; - if(info != null) + if (info != null) return (mApkVersion = info.versionName); - } - catch(NameNotFoundException e){ + } catch (NameNotFoundException e) { errorLogging(e); } @@ -636,13 +674,14 @@ public static String getAppVersionName(){ /** * reade the first line of a file + * * @param filePath path of the file to read from * @return the first line of the file or {@code null} if an error occurs */ private static String readFirstLine(String filePath) { BufferedReader reader = null; - if(filePath==null) + if (filePath == null) return null; try { @@ -652,7 +691,7 @@ private static String readFirstLine(String filePath) { Logger.debug(e.getMessage()); } finally { try { - if(reader!=null) + if (reader != null) reader.close(); } catch (IOException e) { //ignored @@ -663,6 +702,7 @@ private static String readFirstLine(String filePath) { /** * get currently installed core version + * * @return the version of the core, null if not present. */ public static String getCoreVersion() { @@ -671,6 +711,7 @@ public static String getCoreVersion() { /** * get version of installed ruby + * * @return the installed version of ruby */ public static String getLocalRubyVersion() { @@ -679,36 +720,37 @@ public static String getLocalRubyVersion() { /** * get version of installed MetaSploit Framework + * * @return the version of installed MetaSploit Framework */ public static String getLocalMsfVersion() { return readFirstLine(getMsfPath() + "/VERSION"); } - public static boolean isServiceRunning(String name){ + public static boolean isServiceRunning(String name) { ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); //noinspection ConstantConditions - for(RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)){ - if(name.equals(service.service.getClassName())) + for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (name.equals(service.service.getClassName())) return true; } return false; } - public static boolean isPortAvailable(int port){ + public static boolean isPortAvailable(int port) { boolean available = true; int available_code = mOpenPorts.get(port); - if(available_code != 0) + if (available_code != 0) return available_code != 1; - try{ + try { // attempt 3 times since proxy and server could be still releasing // their ports - for(int i = 0; i < 3; i++){ + for (int i = 0; i < 3; i++) { Socket channel = new Socket(); InetSocketAddress address = new InetSocketAddress(InetAddress.getByName(mNetwork.getLocalAddressAsString()), port); @@ -718,13 +760,12 @@ public static boolean isPortAvailable(int port){ channel.close(); - if(available) + if (available) break; Thread.sleep(200); } - } - catch(Exception e){ + } catch (Exception e) { available = true; } @@ -733,16 +774,16 @@ public static boolean isPortAvailable(int port){ return available; } - public static ArrayList getAvailableSessionFiles(){ + public static ArrayList getAvailableSessionFiles() { ArrayList files = new ArrayList(); File storage = new File(mStoragePath); - if(storage.exists()){ + if (storage.exists()) { String[] children = storage.list(); - if(children != null && children.length > 0){ - for(String child : children){ - if(child.endsWith(".dss")) + if (children != null && children.length > 0) { + for (String child : children) { + if (child.endsWith(".dss")) files.add(child); } } @@ -751,10 +792,10 @@ public static ArrayList getAvailableSessionFiles(){ return files; } - public static String saveSession(String sessionName) throws IOException{ + public static String saveSession(String sessionName) throws IOException { StringBuilder builder = new StringBuilder(); String filename = mStoragePath + '/' + sessionName + ".dss", - session; + session; builder.append(SESSION_MAGIC + "\n"); @@ -781,16 +822,16 @@ public static String saveSession(String sessionName) throws IOException{ return filename; } - public static ArrayList getAvailableHijackerSessionFiles(){ + public static ArrayList getAvailableHijackerSessionFiles() { ArrayList files = new ArrayList(); File storage = new File(mStoragePath); - if(storage.exists()){ + if (storage.exists()) { String[] children = storage.list(); - if(children != null && children.length > 0){ - for(String child : children){ - if(child.endsWith(".dhs")) + if (children != null && children.length > 0) { + for (String child : children) { + if (child.endsWith(".dhs")) files.add(child); } } @@ -799,53 +840,46 @@ public static ArrayList getAvailableHijackerSessionFiles(){ return files; } - public static void loadSession(String filename) throws Exception{ + public static void loadSession(String filename) throws Exception { File file = new File(mStoragePath + '/' + filename); - if(file.exists() && file.length() > 0){ + if (file.exists() && file.length() > 0) { BufferedReader reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file)))); String line; // begin decoding procedure - try{ + try { line = reader.readLine(); - if(line == null || !line.equals(SESSION_MAGIC)) + if (line == null || !line.equals(SESSION_MAGIC)) throw new Exception("Not a cSploit session file."); reset(); // read targets int targets = Integer.parseInt(reader.readLine()); - for(int i = 0; i < targets; i++){ - Target target = new Target(reader); - - if(!hasTarget(target)){ - System.addOrderedTarget(target); - } else{ - synchronized (mTargets) { - for (int j = 0; j < mTargets.size(); j++) { - if (mTargets.get(j) != null && mTargets.get(j).equals(target)) { - mTargets.set(j, target); - break; - } - } - } + + synchronized (mTargets) { + for (int i = 0; i < targets; i++) { + Target target = new Target(reader); + mTargets.add(target); } } reader.close(); - } catch(Exception e){ + } catch (Exception e) { reset(); reader.close(); throw e; + } finally { + notifyTargetListChanged(); } } else throw new Exception(filename + " does not exists or is empty."); } public synchronized static ToolBox getTools() { - if(mTools == null) { + if (mTools == null) { mTools = new ToolBox(); mTools.reload(); } @@ -856,8 +890,8 @@ public static RPCClient getMsfRpc() { return mMsfRpc; } - public static void setMsfRpc(RPCClient value){ - if(value==mMsfRpc) + public static void setMsfRpc(RPCClient value) { + if (value == mMsfRpc) return; mMsfRpc = value; // refresh all exploits @@ -869,62 +903,59 @@ public static void setMsfRpc(RPCClient value){ } } } - for( Plugin plugin : getPluginsForTarget() ) { + for (Plugin plugin : getPluginsForTarget()) { plugin.onRpcChange(value); } } - public static Proxy getProxy(){ - try{ - if(mProxy == null) + public static Proxy getProxy() { + try { + if (mProxy == null) mProxy = new Proxy(getNetwork().getLocalAddress(), HTTP_PROXY_PORT); - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } return mProxy; } - public static HTTPSRedirector getHttpsRedirector(){ - try{ - if(mRedirector == null) + public static HTTPSRedirector getHttpsRedirector() { + try { + if (mRedirector == null) mRedirector = new HTTPSRedirector(mContext, getNetwork().getLocalAddress(), HTTPS_REDIR_PORT); - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } return mRedirector; } - public static Server getServer(){ - try{ - if(mServer == null) + public static Server getServer() { + try { + if (mServer == null) mServer = new Server(getNetwork().getLocalAddress(), HTTP_SERVER_PORT); - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } return mServer; } - public static String getImageMimeType(String fileName){ + public static String getImageMimeType(String fileName) { String type = "image/jpeg", - name = fileName.toLowerCase(); + name = fileName.toLowerCase(); - if(name.endsWith(".jpeg") || name.endsWith(".jpg")) + if (name.endsWith(".jpeg") || name.endsWith(".jpg")) type = "image/jpeg"; - else if(name.endsWith(".png")) + else if (name.endsWith(".png")) type = "image/png"; - else if(name.endsWith(".gif")) + else if (name.endsWith(".gif")) type = "image/gif"; - else if(name.endsWith(".tiff")) + else if (name.endsWith(".tiff")) type = "image/tiff"; return type; @@ -936,33 +967,86 @@ public static void reset() { synchronized (mTargets) { mTargets.clear(); - Target network = new Target(mNetwork), - gateway = new Target(mNetwork.getGatewayAddress(), mNetwork.getGatewayHardware()), - device = new Target(mNetwork.getLocalAddress(), mNetwork.getLocalHardware()); + Target network, gateway, device; + + network = new Target(mNetwork); + device = new Target(mNetwork.getLocalAddress(), mNetwork.getLocalHardware()); + - gateway.setAlias(mNetwork.getSSID()); device.setAlias(android.os.Build.MODEL); mTargets.add(network); - mTargets.add(gateway); + + if(mNetwork.haveGateway()) { + gateway = new Target(mNetwork.getGatewayAddress(), mNetwork.getGatewayHardware()); + gateway.setAlias(mNetwork.getSSID()); + mTargets.add(gateway); + } + mTargets.add(device); scanThemAll(); } + + notifyTargetListChanged(); } public static void scanThemAll() { - if(!Services.getNetworkRadar().isAutoScanEnabled()) { + if (!Services.getNetworkRadar().isAutoScanEnabled()) { return; } synchronized (mTargets) { - for(Target t : mTargets) { + for (Target t : mTargets) { Services.getNetworkRadar().onNewTargetFound(t); } } } - public static boolean isInitialized(){ + public static void markNetworkAsDisconnected() { + synchronized (mTargets) { + for (Target t : mTargets) { + switch (t.getType()) { + case NETWORK: + if (t.getNetwork() == mNetwork) { + t.setConneced(false); + } + break; + case ENDPOINT: + if (mNetwork.isInternal(t.getAddress())) { + t.setConneced(false); + } + break; + } + } + } + notifyTargetListChanged(); + } + + public static void markInitialNetworkTargetsAsConnected() { + InetAddress localAddress = mNetwork.getLocalAddress(); + boolean haveGateway = mNetwork.haveGateway(); + InetAddress gatewayAddress = mNetwork.getGatewayAddress(); + + synchronized (mTargets) { + for (Target t : mTargets) { + switch (t.getType()) { + case NETWORK: + if (t.getNetwork() == mNetwork) { + t.setConneced(true); + } + default: + if (localAddress.equals(t.getAddress()) || + (haveGateway && gatewayAddress.equals(t.getAddress()))) { + t.setConneced(true); + } + break; + } + } + } + notifyTargetListChanged(); + } + + public static boolean isInitialized() { return mInitialized; } @@ -978,14 +1062,14 @@ public static KnownIssues getKnownIssues() { return mKnownIssues; } - public static String getMacVendor(byte[] mac){ - if(mac != null && mVendors != null && mac.length >= 3) + public static String getMacVendor(@Nullable byte[] mac) { + if (mac != null && mVendors != null && mac.length >= 3) return mVendors.get(NetworkHelper.getOUICode(mac)); else return null; } - public static String getProtocolByPort(String port){ + public static String getProtocolByPort(String port) { return mPorts.containsKey(port) ? mPorts.get(port) : null; } @@ -994,12 +1078,12 @@ public static String getProtocolByPort(int port) { return getProtocolByPort(Integer.toString(port)); } - public static int getPortByProtocol(String protocol){ + public static int getPortByProtocol(String protocol) { return mServices.containsKey(protocol) ? Integer.parseInt(mServices.get(protocol)) : 0; } - public static Context getContext(){ + public static Context getContext() { return mContext; } @@ -1009,9 +1093,10 @@ public static Network getNetwork() { /** * get a copy of the current targets + * * @return a copy of the target list */ - public static List getTargets(){ + public static List getTargets() { synchronized (mTargets) { return new ArrayList<>(mTargets); } @@ -1019,33 +1104,27 @@ public static List getTargets(){ /** * add a target to the list keeping it sorted. + * * @param target the target to add * @return true if target is added, false if already present */ - public static boolean addOrderedTarget(Target target){ - if(target == null) + public static boolean addOrderedTarget(Target target) { + if (target == null) return false; - synchronized (mTargets) { - if(mTargets.contains(target)) { - return false; - } + boolean changed; - for (int i = 0; i < mTargets.size(); i++) { - if (mTargets.get(i).comesAfter(target)) { - mTargets.add(i, target); - Services.getNetworkRadar().onNewTargetFound(target); - return true; - } + synchronized (mTargets) { + changed = mTargets.add(target); + if(changed) { + Services.getNetworkRadar().onNewTargetFound(target); + notifyTargetListChanged(); } - - mTargets.add(target); - Services.getNetworkRadar().onNewTargetFound(target); - return true; } + return changed; } - public static boolean hasTarget(Target target){ + public static boolean hasTarget(Target target) { synchronized (mTargets) { return mTargets.contains(target); } @@ -1055,30 +1134,23 @@ public static void setCurrentTarget(Target target) { mCurrentTarget = target; } - public static Target getCurrentTarget(){ + public static Target getCurrentTarget() { return mCurrentTarget; } - public static Target getTargetByAddress(String address){ + public static Target getTargetByAddress(String address) { try { return getTargetByAddress(InetAddress.getByName(address)); - } catch ( UnknownHostException e) { + } catch (UnknownHostException e) { Logger.error("cannot convert '" + address + "' to InetAddress: " + e.getMessage()); } return null; } public static Target getTargetByAddress(InetAddress address) { - int i, size; - synchronized (mTargets) { - - size = mTargets.size(); - - for(i=0;i getPlugins(){ + public static ArrayList getPlugins() { return mPlugins; } - public static ArrayList getPluginsForTarget(Target target){ + public static ArrayList getPluginsForTarget(Target target) { ArrayList filtered = new ArrayList(); - if(target != null){ - for(Plugin plugin : mPlugins) - if(plugin.isAllowedTarget(target)) + if (target != null) { + for (Plugin plugin : mPlugins) + if (plugin.isAllowedTarget(target)) filtered.add(plugin); } return filtered; } - public static ArrayList getPluginsForTarget(){ + public static ArrayList getPluginsForTarget() { return getPluginsForTarget(getCurrentTarget()); } - public static void setCurrentPlugin(Plugin plugin){ - Logger.debug( "Setting current plugin : " + mContext.getString( plugin.getName() ) ); + public static void setCurrentPlugin(Plugin plugin) { + Logger.debug("Setting current plugin : " + mContext.getString(plugin.getName())); mCurrentPlugin = plugin; } - public static Plugin getCurrentPlugin(){ + public static Plugin getCurrentPlugin() { return mCurrentPlugin; } @@ -1149,55 +1224,49 @@ public static Collection getCurrentExploits() { return getCurrentTarget().getExploits(); } - public static String getGatewayAddress(){ - return mNetwork.getGatewayAddress().getHostAddress(); - } - - public static boolean isForwardingEnabled(){ + public static boolean isForwardingEnabled() { boolean forwarding = false; BufferedReader reader; String line; - try{ + try { reader = new BufferedReader(new FileReader(IPV4_FORWARD_FILEPATH)); line = reader.readLine().trim(); forwarding = line.equals("1"); reader.close(); - } - catch(IOException e){ + } catch (IOException e) { Logger.warning(e.toString()); } return forwarding; } - public static void setForwarding(boolean enabled){ + public static void setForwarding(boolean enabled) { Logger.debug("Setting ipv4 forwarding to " + enabled); String status = (enabled ? "1" : "0"), - cmd = "echo " + status + " > " + IPV4_FORWARD_FILEPATH; + cmd = "echo " + status + " > " + IPV4_FORWARD_FILEPATH; - try{ + try { getTools().shell.run(cmd); - } - catch(Exception e){ + } catch (Exception e) { Logger.error(e.getMessage()); } } - public static void clean(boolean releaseLocks){ + public static void clean(boolean releaseLocks) { setForwarding(false); - try{ - if(releaseLocks){ + try { + if (releaseLocks) { Logger.debug("Releasing locks."); - if(mWifiLock != null && mWifiLock.isHeld()) + if (mWifiLock != null && mWifiLock.isHeld()) mWifiLock.release(); - if(mWakeLock != null && mWakeLock.isHeld()) + if (mWakeLock != null && mWakeLock.isHeld()) mWakeLock.release(); } @@ -1216,9 +1285,9 @@ public static void clean(boolean releaseLocks){ Client.Disconnect(); mCoreInitialized = false; + mInitialized = false; Services.getNetworkRadar().onAutoScanChanged(); - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } } diff --git a/cSploit/src/org/csploit/android/events/Account.java b/cSploit/src/main/java/org/csploit/android/events/Account.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Account.java rename to cSploit/src/main/java/org/csploit/android/events/Account.java diff --git a/cSploit/src/org/csploit/android/events/Attempts.java b/cSploit/src/main/java/org/csploit/android/events/Attempts.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Attempts.java rename to cSploit/src/main/java/org/csploit/android/events/Attempts.java diff --git a/cSploit/src/org/csploit/android/events/ChildDied.java b/cSploit/src/main/java/org/csploit/android/events/ChildDied.java similarity index 100% rename from cSploit/src/org/csploit/android/events/ChildDied.java rename to cSploit/src/main/java/org/csploit/android/events/ChildDied.java diff --git a/cSploit/src/org/csploit/android/events/ChildEnd.java b/cSploit/src/main/java/org/csploit/android/events/ChildEnd.java similarity index 100% rename from cSploit/src/org/csploit/android/events/ChildEnd.java rename to cSploit/src/main/java/org/csploit/android/events/ChildEnd.java diff --git a/cSploit/src/org/csploit/android/events/Event.java b/cSploit/src/main/java/org/csploit/android/events/Event.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Event.java rename to cSploit/src/main/java/org/csploit/android/events/Event.java diff --git a/cSploit/src/org/csploit/android/events/FuseBind.java b/cSploit/src/main/java/org/csploit/android/events/FuseBind.java similarity index 100% rename from cSploit/src/org/csploit/android/events/FuseBind.java rename to cSploit/src/main/java/org/csploit/android/events/FuseBind.java diff --git a/cSploit/src/org/csploit/android/events/Hop.java b/cSploit/src/main/java/org/csploit/android/events/Hop.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Hop.java rename to cSploit/src/main/java/org/csploit/android/events/Hop.java diff --git a/cSploit/src/org/csploit/android/events/Host.java b/cSploit/src/main/java/org/csploit/android/events/Host.java similarity index 87% rename from cSploit/src/org/csploit/android/events/Host.java rename to cSploit/src/main/java/org/csploit/android/events/Host.java index 2b58e949af..eed722263b 100644 --- a/cSploit/src/org/csploit/android/events/Host.java +++ b/cSploit/src/main/java/org/csploit/android/events/Host.java @@ -1,6 +1,7 @@ package org.csploit.android.events; import java.net.InetAddress; +import java.util.Arrays; /** * an host has been found @@ -11,7 +12,7 @@ public class Host implements Event { public final String name; public Host(byte[] ethAddress, InetAddress ipAddress, String name) { - this.ethAddress = ethAddress; + this.ethAddress = Arrays.copyOf(ethAddress, ethAddress.length); this.ipAddress = ipAddress; this.name = name; } diff --git a/cSploit/src/org/csploit/android/events/HostLost.java b/cSploit/src/main/java/org/csploit/android/events/HostLost.java similarity index 100% rename from cSploit/src/org/csploit/android/events/HostLost.java rename to cSploit/src/main/java/org/csploit/android/events/HostLost.java diff --git a/cSploit/src/org/csploit/android/events/Login.java b/cSploit/src/main/java/org/csploit/android/events/Login.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Login.java rename to cSploit/src/main/java/org/csploit/android/events/Login.java diff --git a/cSploit/src/org/csploit/android/events/Message.java b/cSploit/src/main/java/org/csploit/android/events/Message.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Message.java rename to cSploit/src/main/java/org/csploit/android/events/Message.java diff --git a/cSploit/src/org/csploit/android/events/Newline.java b/cSploit/src/main/java/org/csploit/android/events/Newline.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Newline.java rename to cSploit/src/main/java/org/csploit/android/events/Newline.java diff --git a/cSploit/src/org/csploit/android/events/Os.java b/cSploit/src/main/java/org/csploit/android/events/Os.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Os.java rename to cSploit/src/main/java/org/csploit/android/events/Os.java diff --git a/cSploit/src/org/csploit/android/events/Packet.java b/cSploit/src/main/java/org/csploit/android/events/Packet.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Packet.java rename to cSploit/src/main/java/org/csploit/android/events/Packet.java diff --git a/cSploit/src/org/csploit/android/events/Port.java b/cSploit/src/main/java/org/csploit/android/events/Port.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Port.java rename to cSploit/src/main/java/org/csploit/android/events/Port.java diff --git a/cSploit/src/org/csploit/android/events/Ready.java b/cSploit/src/main/java/org/csploit/android/events/Ready.java similarity index 100% rename from cSploit/src/org/csploit/android/events/Ready.java rename to cSploit/src/main/java/org/csploit/android/events/Ready.java diff --git a/cSploit/src/org/csploit/android/events/StderrNewline.java b/cSploit/src/main/java/org/csploit/android/events/StderrNewline.java similarity index 100% rename from cSploit/src/org/csploit/android/events/StderrNewline.java rename to cSploit/src/main/java/org/csploit/android/events/StderrNewline.java diff --git a/cSploit/src/org/csploit/android/gui/Console.java b/cSploit/src/main/java/org/csploit/android/gui/Console.java similarity index 98% rename from cSploit/src/org/csploit/android/gui/Console.java rename to cSploit/src/main/java/org/csploit/android/gui/Console.java index 9ad404341f..879442b257 100644 --- a/cSploit/src/org/csploit/android/gui/Console.java +++ b/cSploit/src/main/java/org/csploit/android/gui/Console.java @@ -3,8 +3,8 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.app.AppCompatActivity; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.appcompat.app.AppCompatActivity; import android.text.Html; import android.view.KeyEvent; import android.view.Menu; diff --git a/cSploit/src/org/csploit/android/gui/DirectoryPicker.java b/cSploit/src/main/java/org/csploit/android/gui/DirectoryPicker.java similarity index 100% rename from cSploit/src/org/csploit/android/gui/DirectoryPicker.java rename to cSploit/src/main/java/org/csploit/android/gui/DirectoryPicker.java diff --git a/cSploit/src/org/csploit/android/gui/FileEdit.java b/cSploit/src/main/java/org/csploit/android/gui/FileEdit.java similarity index 93% rename from cSploit/src/org/csploit/android/gui/FileEdit.java rename to cSploit/src/main/java/org/csploit/android/gui/FileEdit.java index b581ebafad..fe7caa686f 100644 --- a/cSploit/src/org/csploit/android/gui/FileEdit.java +++ b/cSploit/src/main/java/org/csploit/android/gui/FileEdit.java @@ -1,7 +1,7 @@ package org.csploit.android.gui; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; @@ -47,8 +47,8 @@ public void onClick(View view) { } public String loadFile (String _path) { - String _line = ""; - String _str_line = ""; + final StringBuilder builder = new StringBuilder(); + BufferedReader inputReader = null; if (_path == null){ @@ -58,8 +58,10 @@ public String loadFile (String _path) { try { inputReader = new BufferedReader(new FileReader(_path)); + + String _line; while ((_line = inputReader.readLine()) != null) { - _str_line += _line + "\n"; + builder.append(_line).append("\n"); } } catch (Exception e){ @@ -73,7 +75,7 @@ public String loadFile (String _path) { catch (Exception e){} } - return _str_line; + return builder.toString(); } public boolean saveFile (String _file_text, String _path){ diff --git a/cSploit/src/org/csploit/android/gui/MsfPreferences.java b/cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java similarity index 98% rename from cSploit/src/org/csploit/android/gui/MsfPreferences.java rename to cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java index a7698c25f0..72895cdc6b 100644 --- a/cSploit/src/org/csploit/android/gui/MsfPreferences.java +++ b/cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java @@ -211,7 +211,10 @@ else if(opt.isEvasion()) evasion.add(item); else general.add(item); - item.setOnPreferenceChangeListener(listener); + + if (item != null) { + item.setOnPreferenceChangeListener(listener); + } } if(required.size()>0) { diff --git a/cSploit/src/org/csploit/android/gui/dialogs/AboutDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/AboutDialog.java similarity index 90% rename from cSploit/src/org/csploit/android/gui/dialogs/AboutDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/AboutDialog.java index 334825a4d9..def8bbe26e 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/AboutDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/AboutDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -31,8 +31,8 @@ import java.text.DateFormat; -public class AboutDialog extends AlertDialog{ - public AboutDialog(Activity activity){ +public class AboutDialog extends AlertDialog { + public AboutDialog(FragmentActivity activity){ super(activity); DateFormat df = DateFormat.getDateTimeInstance(); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/ChangelogDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ChangelogDialog.java similarity index 93% rename from cSploit/src/org/csploit/android/gui/dialogs/ChangelogDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ChangelogDialog.java index d322f49010..53964d1231 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/ChangelogDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ChangelogDialog.java @@ -19,10 +19,10 @@ package org.csploit.android.gui.dialogs; import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.text.Html; import android.widget.TextView; @@ -41,7 +41,7 @@ public class ChangelogDialog extends AlertDialog private ProgressDialog mLoader = null; @SuppressLint("SetJavaScriptEnabled") - public ChangelogDialog(final Activity activity){ + public ChangelogDialog(final AppCompatActivity activity){ super(activity); this.setTitle("Changelog"); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/ChoiceDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ChoiceDialog.java similarity index 90% rename from cSploit/src/org/csploit/android/gui/dialogs/ChoiceDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ChoiceDialog.java index 7fb6dfb0f0..4c94925847 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/ChoiceDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ChoiceDialog.java @@ -18,8 +18,6 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; import android.view.View; import android.widget.Button; @@ -28,12 +26,15 @@ import org.csploit.android.R; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + public class ChoiceDialog extends AlertDialog{ public interface ChoiceDialogListener{ void onChoice(int choice); } - public ChoiceDialog(final Activity activity, String title, String[] choices, final ChoiceDialogListener listener){ + public ChoiceDialog(final FragmentActivity activity, String title, String[] choices, final ChoiceDialogListener listener){ super(activity); this.setTitle(title); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/ConfirmDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ConfirmDialog.java similarity index 87% rename from cSploit/src/org/csploit/android/gui/dialogs/ConfirmDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ConfirmDialog.java index 7f8d62d2ec..627fbbeb25 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/ConfirmDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ConfirmDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import org.csploit.android.R; @@ -31,7 +31,7 @@ public interface ConfirmDialogListener{ void onCancel(); } - public ConfirmDialog(String title, CharSequence message, Activity activity, ConfirmDialogListener confirmDialogListener){ + public ConfirmDialog(String title, CharSequence message, FragmentActivity activity, ConfirmDialogListener confirmDialogListener){ super(activity); this.setTitle(title); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/CustomFilterDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/CustomFilterDialog.java similarity index 94% rename from cSploit/src/org/csploit/android/gui/dialogs/CustomFilterDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/CustomFilterDialog.java index ca5d00eee6..dda33c5575 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/CustomFilterDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/CustomFilterDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; @@ -34,7 +34,7 @@ public interface CustomFilterDialogListener{ void onInputEntered(ArrayList from, ArrayList to); } - public CustomFilterDialog(String title, Activity activity, final CustomFilterDialogListener listener){ + public CustomFilterDialog(String title, AppCompatActivity activity, final CustomFilterDialogListener listener){ super(activity); final View view = LayoutInflater.from(activity).inflate(R.layout.plugin_mitm_filter_dialog, null); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/ErrorDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ErrorDialog.java similarity index 83% rename from cSploit/src/org/csploit/android/gui/dialogs/ErrorDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ErrorDialog.java index 1c84e3f0f5..0ba0ae303a 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/ErrorDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ErrorDialog.java @@ -18,12 +18,12 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; -public class ErrorDialog extends AlertDialog{ - public ErrorDialog(String title, String message, final Activity activity){ +public class ErrorDialog extends AlertDialog { + public ErrorDialog(String title, String message, final FragmentActivity activity){ super(activity); this.setTitle(title); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/FatalDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/FatalDialog.java similarity index 88% rename from cSploit/src/org/csploit/android/gui/dialogs/FatalDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/FatalDialog.java index e2dd45d206..99544b3709 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/FatalDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/FatalDialog.java @@ -18,15 +18,15 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.text.Html; import android.text.method.LinkMovementMethod; import android.widget.TextView; public class FatalDialog extends AlertDialog{ - public FatalDialog(String title, String message, boolean html, final Activity activity){ + public FatalDialog(String title, String message, boolean html, final FragmentActivity activity){ super(activity); this.setTitle(title); @@ -52,7 +52,7 @@ public void onClick(DialogInterface dialog, int id){ }); } - public FatalDialog(String title, String message, final Activity activity){ + public FatalDialog(String title, String message, final FragmentActivity activity){ this(title, message, false, activity); } } diff --git a/cSploit/src/org/csploit/android/gui/dialogs/FinishDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/FinishDialog.java similarity index 87% rename from cSploit/src/org/csploit/android/gui/dialogs/FinishDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/FinishDialog.java index 6fad70c785..6532ae4bac 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/FinishDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/FinishDialog.java @@ -18,12 +18,12 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; public class FinishDialog extends AlertDialog{ - public FinishDialog(String title, String message, final Activity activity){ + public FinishDialog(String title, String message, final FragmentActivity activity){ super(activity); this.setTitle(title); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/InputDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/InputDialog.java similarity index 87% rename from cSploit/src/org/csploit/android/gui/dialogs/InputDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/InputDialog.java index dcf4b39615..9be91a3f93 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/InputDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/InputDialog.java @@ -18,14 +18,15 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; import android.text.InputType; import android.widget.EditText; import org.csploit.android.R; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + public class InputDialog extends AlertDialog{ private EditText mEditText = null; @@ -33,11 +34,11 @@ public interface InputDialogListener{ void onInputEntered(String input); } - public InputDialog(String title, String message, Activity activity, InputDialogListener inputDialogListener){ + public InputDialog(String title, String message, FragmentActivity activity, InputDialogListener inputDialogListener){ this(title, message, null, true, false, activity, inputDialogListener); } - public InputDialog(String title, String message, String text, boolean editable, boolean password, Activity activity, InputDialogListener inputDialogListener){ + public InputDialog(String title, String message, String text, boolean editable, boolean password, FragmentActivity activity, InputDialogListener inputDialogListener){ super(activity); mEditText = new EditText(activity); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/ListChoiceDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ListChoiceDialog.java similarity index 87% rename from cSploit/src/org/csploit/android/gui/dialogs/ListChoiceDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ListChoiceDialog.java index a79d83fdd6..ee4af4c77c 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/ListChoiceDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/ListChoiceDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -28,12 +28,12 @@ import org.csploit.android.R; -public class ListChoiceDialog extends AlertDialog{ +public class ListChoiceDialog extends AlertDialog { /** create a list choice dialog from android resource ids * @param items String ids */ - public ListChoiceDialog(Integer title, Integer[] items, Activity activity, final ChoiceDialog.ChoiceDialogListener listener){ + public ListChoiceDialog(Integer title, Integer[] items, FragmentActivity activity, final ChoiceDialog.ChoiceDialogListener listener){ super(activity); ListView mList = new ListView(activity); @@ -67,7 +67,7 @@ public void onClick(DialogInterface dialog, int id){ /** create a list choice dialog from a String array * @param items Strings to choose from */ - public ListChoiceDialog(String title, String[] items, Activity activity, final ChoiceDialog.ChoiceDialogListener listener){ + public ListChoiceDialog(String title, String[] items, FragmentActivity activity, final ChoiceDialog.ChoiceDialogListener listener){ super(activity); ListView mList = new ListView(activity); @@ -95,7 +95,7 @@ public void onClick(DialogInterface dialog, int id){ /** create a list choice dialog from generic objects array ( call toString on every object ) * @param items array containing objects to choices from */ - public ListChoiceDialog(String title, Object[] items, Activity activity, final ChoiceDialog.ChoiceDialogListener listener) { + public ListChoiceDialog(String title, Object[] items, FragmentActivity activity, final ChoiceDialog.ChoiceDialogListener listener) { super(activity); ListView mList = new ListView(activity); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java similarity index 84% rename from cSploit/src/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java index 1a556dc999..7d93f60aee 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java @@ -18,8 +18,6 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; import android.view.View; import android.widget.AdapterView; @@ -29,6 +27,9 @@ import org.csploit.android.R; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + public class MultipleChoiceDialog extends AlertDialog{ public interface MultipleChoiceDialogListener{ @@ -40,7 +41,7 @@ public interface MultipleChoiceDialogListener{ /** create a list choice dialog from android resource ids * @param items String ids */ - public MultipleChoiceDialog(int title, int[] items, Activity activity, final MultipleChoiceDialogListener listener){ + public MultipleChoiceDialog(int title, int[] items, FragmentActivity activity, final MultipleChoiceDialogListener listener){ super(activity); String[] _items = new String[items.length]; @@ -55,7 +56,7 @@ public MultipleChoiceDialog(int title, int[] items, Activity activity, final Mul * @param items Strings to choose from */ - public MultipleChoiceDialog(String title, String[] items, Activity activity, final MultipleChoiceDialogListener listener){ + public MultipleChoiceDialog(String title, String[] items, FragmentActivity activity, final MultipleChoiceDialogListener listener){ super(activity); commonCtor(title, items, activity, listener); @@ -64,7 +65,7 @@ public MultipleChoiceDialog(String title, String[] items, Activity activity, fin /** create a list choice dialog from generic objects array ( call toString on every object ) * @param items */ - public MultipleChoiceDialog(String title, Object[] items, Activity activity, final MultipleChoiceDialogListener listener) { + public MultipleChoiceDialog(String title, Object[] items, FragmentActivity activity, final MultipleChoiceDialogListener listener) { super(activity); String[] _items = new String[items.length]; @@ -75,7 +76,7 @@ public MultipleChoiceDialog(String title, Object[] items, Activity activity, fin commonCtor(title, _items, activity, listener); } - private void commonCtor(String title, String[] items, Activity activity, final MultipleChoiceDialogListener listener) { + private void commonCtor(String title, String[] items, FragmentActivity activity, final MultipleChoiceDialogListener listener) { ListView mList = new ListView(activity); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/RedirectionDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/RedirectionDialog.java similarity index 90% rename from cSploit/src/org/csploit/android/gui/dialogs/RedirectionDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/RedirectionDialog.java index 593932cc4d..e614116eb5 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/RedirectionDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/RedirectionDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; @@ -28,7 +28,7 @@ import org.csploit.android.R; public class RedirectionDialog extends AlertDialog{ - public RedirectionDialog(String title, Activity activity, final RedirectionDialogListener listener){ + public RedirectionDialog(String title, AppCompatActivity activity, final RedirectionDialogListener listener){ super(activity); final View view = LayoutInflater.from(activity).inflate(R.layout.plugin_mitm_redirect_dialog, null); diff --git a/cSploit/src/org/csploit/android/gui/dialogs/SpinnerDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/SpinnerDialog.java similarity index 90% rename from cSploit/src/org/csploit/android/gui/dialogs/SpinnerDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/SpinnerDialog.java index 57fca5c69c..bf303a42d9 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/SpinnerDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/SpinnerDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; @@ -32,7 +32,7 @@ public class SpinnerDialog extends AlertDialog{ private int mSelected = 0; - public SpinnerDialog(String title, String message, String[] items, int default_index, Activity activity, final SpinnerDialogListener listener){ + public SpinnerDialog(String title, String message, String[] items, int default_index, FragmentActivity activity, final SpinnerDialogListener listener){ super(activity); Spinner mSpinner = new Spinner(activity); @@ -66,7 +66,7 @@ public void onClick(DialogInterface dialog, int id) { }); } - public SpinnerDialog(String title, String message, String[] items, Activity activity, final SpinnerDialogListener listener) { + public SpinnerDialog(String title, String message, String[] items, FragmentActivity activity, final SpinnerDialogListener listener) { this(title,message,items,0,activity,listener); } diff --git a/cSploit/src/org/csploit/android/gui/dialogs/WifiCrackDialog.java b/cSploit/src/main/java/org/csploit/android/gui/dialogs/WifiCrackDialog.java similarity index 90% rename from cSploit/src/org/csploit/android/gui/dialogs/WifiCrackDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/WifiCrackDialog.java index 9ab1e3dc50..da237a2067 100644 --- a/cSploit/src/org/csploit/android/gui/dialogs/WifiCrackDialog.java +++ b/cSploit/src/main/java/org/csploit/android/gui/dialogs/WifiCrackDialog.java @@ -18,9 +18,9 @@ */ package org.csploit.android.gui.dialogs; -import android.app.Activity; -import android.app.AlertDialog; import android.content.DialogInterface; +import androidx.fragment.app.FragmentActivity; +import androidx.appcompat.app.AlertDialog; import android.text.InputType; import android.widget.EditText; @@ -29,7 +29,7 @@ public class WifiCrackDialog extends AlertDialog{ private EditText mEditText = null; - public WifiCrackDialog(String title, String message, Activity activity, WifiCrackDialogListener wifiCrackDialogListener){ + public WifiCrackDialog(String title, String message, FragmentActivity activity, WifiCrackDialogListener wifiCrackDialogListener){ super(activity); mEditText = new EditText(activity); diff --git a/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java new file mode 100644 index 0000000000..c5e6364f4a --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java @@ -0,0 +1,128 @@ +package org.csploit.android.helpers; + +import org.apache.commons.compress.utils.IOUtils; +import org.csploit.android.core.*; +import org.csploit.android.core.System; +import org.csploit.android.tools.Ip; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.net.InetAddress; + +/** + * A class that provide some useful network-related static methods + */ +public final class NetworkHelper { + /** + * translate an OUI to it's integer representation + * @param macAddress the 6-byte array that represent a mac address + * @return the OUI integer + */ + public static int getOUICode(byte[] macAddress) { + return (macAddress[0] << 16) | (macAddress[1] << 8) | macAddress[2]; + } + + /** + * translate an OUI to it's integer representation + * @param hexOui a string that hold OUI in hexadecimal form ( e.g. "ACDE48" ) + * @return the OUI integer + */ + public static int getOUICode(String hexOui) { + return Integer.parseInt(hexOui, 16); + } + + /** + * compare two byte[] comparing their length and each of their values. + * @return -1 if {@code a} is less than {@code b}, 0 if are equals, +1 if {@code a} is greater than {@code b} + */ + public static int compareByteArray(byte[] a, byte[] b) { + int result; + + result = a.length - b.length; + + if(result != 0) { + return result; + } + + for(int i = 0; i < a.length; i++) { + result = ((short) a[i] & 0xFF) - ((short) b[i] & 0xFF); + if(result != 0) { + return result; + } + } + + return 0; + } + + /** + * compare two {@link InetAddress} + * @return -1 if {@code a} is less than {@code b}, 0 if are equals, +1 if {@code a} is greater than {@code b} + */ + public static int compareInetAddresses(InetAddress a, InetAddress b) { + return compareByteArray(a.getAddress(), b.getAddress()); + } + + public static String getIfaceGateway(String iface) { + Pattern pattern = Pattern.compile(String.format("^%s\\t+00000000\\t+([0-9A-F]{8})", iface), Pattern.CASE_INSENSITIVE); + BufferedReader reader = null; + String line; + + try { + reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/net/route"))); + + while ((line = reader.readLine()) != null) { + Matcher matcher = pattern.matcher(line); + if (!matcher.find()) { + continue; + } + String rawAddress = matcher.group(1); + StringBuilder sb = new StringBuilder(); + for (int i = 6; ; i -= 2) { + String part = rawAddress.substring(i, i + 2); + sb.append(Integer.parseInt(part, 16)); + if (i > 0) { + sb.append('.'); + } else { + break; + } + } + String res = sb.toString(); + Logger.debug("found system default gateway for interface " + iface + ": " + res); + return res; + } + } catch (IOException e) { + System.errorLogging(e); + } finally { + IOUtils.closeQuietly(reader); + } + + Logger.warning("falling back to ip"); + + return getIfaceGatewayUsingIp(iface); + } + + private static String getIfaceGatewayUsingIp(String iface) { + if(!System.isCoreInitialized()) + return null; + + final StringBuilder sb = new StringBuilder(); + + try { + Child process = System.getTools().ip.getGatewayForIface(iface, new Ip.GatewayReceiver() { + @Override + public void onGatewayFound(String gateway) { + sb.append(gateway); + } + }); + process.join(); + } catch (ChildManager.ChildNotStartedException | InterruptedException e) { + System.errorLogging(e); + } + + return sb.length() > 0 ? sb.toString() : null; + } +} diff --git a/cSploit/src/org/csploit/android/helpers/ThreadHelper.java b/cSploit/src/main/java/org/csploit/android/helpers/ThreadHelper.java similarity index 100% rename from cSploit/src/org/csploit/android/helpers/ThreadHelper.java rename to cSploit/src/main/java/org/csploit/android/helpers/ThreadHelper.java diff --git a/cSploit/src/org/csploit/android/net/ByteBuffer.java b/cSploit/src/main/java/org/csploit/android/net/ByteBuffer.java similarity index 97% rename from cSploit/src/org/csploit/android/net/ByteBuffer.java rename to cSploit/src/main/java/org/csploit/android/net/ByteBuffer.java index 252121ff06..bf808bc30d 100644 --- a/cSploit/src/org/csploit/android/net/ByteBuffer.java +++ b/cSploit/src/main/java/org/csploit/android/net/ByteBuffer.java @@ -125,11 +125,11 @@ public String toString(){ } public byte[] getData(){ - return mBuffer; + return Arrays.copyOf(mBuffer, mBuffer.length); } public void setData(byte[] buffer){ - mBuffer = buffer; + mBuffer = Arrays.copyOf(buffer, buffer.length); mCharsetDetector.handleData(buffer, 0, buffer.length); } diff --git a/cSploit/src/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java similarity index 80% rename from cSploit/src/org/csploit/android/net/Endpoint.java rename to cSploit/src/main/java/org/csploit/android/net/Endpoint.java index 27be5e0304..934ad0a172 100644 --- a/cSploit/src/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -18,14 +18,18 @@ */ package org.csploit.android.net; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import org.csploit.android.core.System; +import org.csploit.android.helpers.NetworkHelper; + import java.io.BufferedReader; import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Arrays; -import org.csploit.android.core.System; - -public class Endpoint +public class Endpoint implements Comparable { private InetAddress mAddress = null; private byte[] mHardware = null; @@ -53,9 +57,9 @@ public Endpoint(String address){ this(address, null); } - public Endpoint(InetAddress address, byte[] hardware){ + public Endpoint(InetAddress address, @Nullable byte[] hardware){ mAddress = address; - mHardware = hardware; + mHardware = hardware != null ? Arrays.copyOf(hardware, hardware.length) : null; } public Endpoint(String address, String hardware){ @@ -99,22 +103,28 @@ else if(mHardware != null && endpoint.mHardware != null) { return mAddress.equals(endpoint.getAddress()); } - public InetAddress getAddress(){ - return mAddress; - } + @Override + public int compareTo(@NonNull Endpoint another) { + if(mHardware != null && another.mHardware != null) { + if(NetworkHelper.compareByteArray(mHardware, another.mHardware) == 0) { + return 0; + } + } - public long getAddressAsLong(){ - byte[] baddr = mAddress.getAddress(); + return NetworkHelper.compareInetAddresses(mAddress, another.mAddress); + } - return ((baddr[0] & 0xFFl) << 24) + ((baddr[1] & 0xFFl) << 16) + ((baddr[2] & 0xFFl) << 8) + (baddr[3] & 0xFFl); + public InetAddress getAddress(){ + return mAddress; } public void setAddress(InetAddress address){ this.mAddress = address; } + @Nullable public byte[] getHardware(){ - return mHardware; + return mHardware != null ? Arrays.copyOf(mHardware, mHardware.length) : null; } public String getHardwareAsString(){ @@ -131,7 +141,7 @@ public String getHardwareAsString(){ } public void setHardware(byte[] hardware){ - this.mHardware = hardware; + this.mHardware = Arrays.copyOf(hardware, hardware.length); } public String toString(){ diff --git a/cSploit/src/org/csploit/android/net/GitHubParser.java b/cSploit/src/main/java/org/csploit/android/net/GitHubParser.java similarity index 100% rename from cSploit/src/org/csploit/android/net/GitHubParser.java rename to cSploit/src/main/java/org/csploit/android/net/GitHubParser.java diff --git a/cSploit/src/org/csploit/android/net/IP4Address.java b/cSploit/src/main/java/org/csploit/android/net/IP4Address.java similarity index 91% rename from cSploit/src/org/csploit/android/net/IP4Address.java rename to cSploit/src/main/java/org/csploit/android/net/IP4Address.java index 8186028895..3a0dbe72b4 100644 --- a/cSploit/src/org/csploit/android/net/IP4Address.java +++ b/cSploit/src/main/java/org/csploit/android/net/IP4Address.java @@ -22,12 +22,13 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.ByteOrder; +import java.util.Arrays; -public class IP4Address +public class IP4Address implements Comparable { private byte[] mByteArray = null; private String mString = ""; - private int mInteger = 0; + private final int mInteger; private InetAddress mAddress = null; public static int ntohl(int n){ @@ -82,7 +83,7 @@ public IP4Address(String address) throws UnknownHostException{ } public IP4Address(byte[] address) throws UnknownHostException{ - mByteArray = address; + mByteArray = Arrays.copyOf(address, address.length); mAddress = InetAddress.getByAddress(mByteArray); mString = mAddress.getHostAddress(); mInteger = ((mByteArray[0] & 0xFF) << 24) + @@ -102,7 +103,7 @@ public IP4Address(InetAddress address){ } public byte[] toByteArray(){ - return mByteArray; + return Arrays.copyOf(mByteArray, mByteArray.length); } public String toString(){ @@ -125,6 +126,11 @@ public boolean equals(InetAddress address){ return mAddress.equals(address); } + @Override + public int compareTo(IP4Address another) { + return mInteger - another.mInteger; + } + public int getPrefixLength(){ int bits, i, n = mInteger; diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java new file mode 100644 index 0000000000..e50fe4cc68 --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -0,0 +1,406 @@ +/* + * This file is part of the dSploit. + * + * Copyleft of Simone Margaritelli aka evilsocket + * + * dSploit is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * dSploit is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with dSploit. If not, see . + */ +package org.csploit.android.net; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.DhcpInfo; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import android.util.Patterns; +import org.apache.commons.net.util.SubnetUtils; +import org.csploit.android.core.Logger; +import org.csploit.android.core.System; +import org.csploit.android.helpers.NetworkHelper; + +import java.lang.reflect.Method; +import java.net.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +public class Network implements Comparable { + public enum Protocol { + TCP, + UDP, + ICMP, + IGMP, + UNKNOWN; + + public static Protocol fromString(String proto) { + + if (proto != null) { + proto = proto.toLowerCase(); + + if (proto.equals("tcp")) + return TCP; + + else if (proto.equals("udp")) + return UDP; + + else if (proto.equals("icmp")) + return ICMP; + + else if (proto.equals("igmp")) + return IGMP; + } + + return UNKNOWN; + } + + public String toString() { + switch (this) { + case ICMP: + return "icmp"; + case IGMP: + return "igmp"; + case TCP: + return "tcp"; + case UDP: + return "udp"; + default: + return "unknown"; + } + } + } + + private ConnectivityManager mConnectivityManager = null; + private WifiManager mWifiManager = null; + private DhcpInfo mInfo = null; + private WifiInfo mWifiInfo = null; + private NetworkInterface mInterface = null; + private IP4Address mGateway = null; + private IP4Address mNetmask = null; + private IP4Address mLocal = null; + private IP4Address mBase = null; + private Method mTetheredIfacesMethod = null; + + /** + * see http://en.wikipedia.org/wiki/Reserved_IP_addresses + */ + private static final String[] PRIVATE_NETWORKS = { + "10.0.0.0/8", + "100.64.0.0/10", + "172.16.0.0/12", + "192.168.0.0/16" + }; + + public Network(Context context, String iface) throws SocketException, UnknownHostException { + mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + mInfo = mWifiManager.getDhcpInfo(); + mWifiInfo = mWifiManager.getConnectionInfo(); + mLocal = new IP4Address(mInfo.ipAddress); + mGateway = new IP4Address(mInfo.gateway); + mNetmask = getNetmask(); + mBase = new IP4Address(mInfo.netmask & mInfo.gateway); + mTetheredIfacesMethod = getTetheredIfacesMethod(mConnectivityManager); + + if (iface != null) { + if (initNetworkInterface(iface)) + return; + } else { + for (String ifname : getAvailableInterfaces()) { + if (initNetworkInterface(ifname)) { + return; + } + } + } + + throw new NoRouteToHostException("Not connected to any network."); + } + + private static Method getTetheredIfacesMethod(ConnectivityManager connectivityManager) { + try { + return connectivityManager.getClass().getDeclaredMethod("getTetheredIfaces"); + } catch (NoSuchMethodException e) { + Logger.warning("unable to get 'ConnectivityManager#getTetheredIfaces()': " + e.getMessage()); + return null; + } + } + + public boolean initNetworkInterface(String iface) { + + InterfaceAddress ifaceAddress = null; + try { + if (iface == null) + iface = getAvailableInterfaces().get(0); + + mInterface = NetworkInterface.getByName(iface); + + if (mInterface.getInterfaceAddresses().isEmpty()) { + return false; + } + + for (InterfaceAddress ia : mInterface.getInterfaceAddresses()) { + if(Patterns.IP_ADDRESS.matcher(ia.getAddress().getHostAddress()).matches()) { + ifaceAddress = ia; + Logger.warning("interfaceAddress: " + ia.getAddress().getHostAddress() + "/" + Short.toString(ia.getNetworkPrefixLength())); + break; + } + else + Logger.error("not valid ip: " + ia.getAddress().getHostAddress() + "/" + Short.toString(ia.getNetworkPrefixLength())); + } + if (ifaceAddress == null){ + return false; + } + + SubnetUtils su = new SubnetUtils( + // get(1) == ipv4 + ifaceAddress.getAddress().getHostAddress() + + "/" + + Short.toString(ifaceAddress.getNetworkPrefixLength())); + + mLocal = new IP4Address(su.getInfo().getAddress()); + mNetmask = new IP4Address(su.getInfo().getNetmask()); + mBase = new IP4Address(su.getInfo().getNetworkAddress()); + + updateGateway(); + + return true; + } catch (Exception e) { + Logger.error("Error: " + e.getLocalizedMessage()); + } + + return false; + } + + private void updateGateway() throws UnknownHostException { + String gateway = NetworkHelper.getIfaceGateway(mInterface.getDisplayName()); + + if(gateway != null) { + mGateway = new IP4Address(gateway); + } else { + Logger.warning("gateway not found"); + } + } + + public void onCoreAttached() { + if(haveGateway()) + return; + + try { + updateGateway(); + } catch (UnknownHostException e) { + Logger.warning(e.getMessage()); + } + + if(!haveGateway()) + return; + + Target gateway = new Target(getGatewayAddress(), getGatewayHardware()); + gateway.setAlias(getSSID()); + + System.addOrderedTarget(gateway); + } + + private IP4Address getNetmask() throws UnknownHostException { + IP4Address result = new IP4Address(mInfo.netmask); + + if (System.getSettings().getBoolean("WIDE_SCAN", false)) { + SubnetUtils privateNetwork; + + for (String cidr_notation : PRIVATE_NETWORKS) { + privateNetwork = new SubnetUtils(cidr_notation); + + if (privateNetwork.getInfo().isInRange(mLocal.toString())) { + result = new IP4Address(privateNetwork.getInfo().getNetmask()); + break; + } + } + } + + return result; + } + + public boolean equals(Network network) { + return mInfo.equals(network.getInfo()); + } + + public boolean isInternal(byte[] address) { + byte[] local = mLocal.toByteArray(); + byte[] mask = mNetmask.toByteArray(); + + for (int i = 0; i < local.length; i++) + if ((local[i] & mask[i]) != (address[i] & mask[i])) + return false; + + return true; + } + + public boolean isInternal(String ip) { + try { + return isInternal(InetAddress.getByName(ip).getAddress()); + } catch (UnknownHostException e) { + Logger.error(e.getMessage()); + } + return false; + } + + public boolean isInternal(InetAddress address) { + return isInternal(address.getAddress()); + } + + public static boolean isWifiConnected(Context context) { + ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + + return info != null && info.isConnected() && info.isAvailable(); + } + + public static boolean isConnectivityAvailable(Context context) { + ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = manager.getActiveNetworkInfo(); + + return info != null && info.isConnected(); + } + + public boolean isConnected() { + return isIfaceConnected(mInterface); + } + + public String getSSID() { + String res = mWifiInfo.getSSID(); + return res.equals("") ? "" : res; + } + + public int getNumberOfAddresses() { + return IP4Address.ntohl(~mNetmask.toInteger()); + } + + public IP4Address getStartAddress() { + return mBase; + } + + public String getNetworkMasked() { + SubnetUtils sub = new SubnetUtils(mLocal.toString(), mNetmask.toString()); + return sub.getInfo().getNetworkAddress(); + } + + public String getNetworkRepresentation() { + return getNetworkMasked() + "/" + mNetmask.getPrefixLength(); + } + + public DhcpInfo getInfo() { + return mInfo; + } + + public InetAddress getNetmaskAddress() { + return mNetmask.toInetAddress(); + } + + public boolean haveGateway() { + return mGateway != null; + } + + public boolean isTetheringEnabled() { + if(mTetheredIfacesMethod == null) { + return false; + } + try { + String[] ifaces = (String[]) mTetheredIfacesMethod.invoke(mConnectivityManager); + return ifaces.length > 0; + } catch (Exception e) { + Logger.error("unable to retrieve tethered ifaces: " + e.getMessage()); + return false; + } + } + + public InetAddress getGatewayAddress() { + return mGateway == null ? null : mGateway.toInetAddress(); + } + + public byte[] getGatewayHardware() { + return Endpoint.parseMacAddress(mWifiInfo.getBSSID()); + } + + @Nullable + public byte[] getLocalHardware() { + try { + return mInterface.getHardwareAddress(); //FIXME: #831 + } catch (SocketException e) { + System.errorLogging(e); + } + + return null; + } + + public String getLocalAddressAsString() { + return mLocal.toString(); + } + + public InetAddress getLocalAddress() { + return mLocal.toInetAddress(); + } + + @Override + public int compareTo(@NonNull Network another) { + if(mBase.equals(another.mBase)) { + return mNetmask.getPrefixLength() - another.mNetmask.getPrefixLength(); + } + return mBase.compareTo(another.mBase); + } + + private static boolean isIfaceConnected(NetworkInterface networkInterface) { + try { + return networkInterface.isUp() && !networkInterface.isLoopback() && + !networkInterface.getInterfaceAddresses().isEmpty(); + } catch (SocketException e) { + return false; + } + } + + /** + * Retrieves a list of ready to use network interfaces. + * + * @return list of ready to use network interfaces + */ + public static List getAvailableInterfaces() { + List result; + Enumeration interfaces = null; + + try { + interfaces = NetworkInterface.getNetworkInterfaces(); + } catch (SocketException e) { + System.errorLogging(e); + } + + if (interfaces == null) + return Collections.emptyList(); + + result = new ArrayList<>(); + + while (interfaces.hasMoreElements()) { + NetworkInterface iface = interfaces.nextElement(); + if (isIfaceConnected(iface)) { + result.add(iface.getName()); + } + } + + return result; + } + + public NetworkInterface getInterface() { + return mInterface; + } +} \ No newline at end of file diff --git a/cSploit/src/org/csploit/android/net/RemoteReader.java b/cSploit/src/main/java/org/csploit/android/net/RemoteReader.java similarity index 99% rename from cSploit/src/org/csploit/android/net/RemoteReader.java rename to cSploit/src/main/java/org/csploit/android/net/RemoteReader.java index bd2954d97f..5d3ae6a4f6 100644 --- a/cSploit/src/org/csploit/android/net/RemoteReader.java +++ b/cSploit/src/main/java/org/csploit/android/net/RemoteReader.java @@ -155,7 +155,7 @@ public void onTaskDone(Task t) { /** * send the fetched content to the receiver. */ - private class Notifier implements Runnable { + private static class Notifier implements Runnable { private final Task task; private final byte[] content; private final boolean isError; diff --git a/cSploit/src/org/csploit/android/net/Target.java b/cSploit/src/main/java/org/csploit/android/net/Target.java similarity index 95% rename from cSploit/src/org/csploit/android/net/Target.java rename to cSploit/src/main/java/org/csploit/android/net/Target.java index 6b20888b38..6f907a5607 100644 --- a/cSploit/src/org/csploit/android/net/Target.java +++ b/cSploit/src/main/java/org/csploit/android/net/Target.java @@ -39,7 +39,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Target +import androidx.annotation.NonNull; + +public class Target implements Comparable { public enum Type{ @@ -440,8 +442,34 @@ public boolean hasAlias(){ return mAlias != null && !mAlias.isEmpty(); } - public boolean comesAfter(Target target){ - return mType != Type.NETWORK && (mType != Type.ENDPOINT || target.getType() == Type.ENDPOINT && mEndpoint.getAddressAsLong() > target.getEndpoint().getAddressAsLong()); + @Override + public int compareTo(@NonNull Target another) { + if(mType != another.mType) { + if(mType == Type.NETWORK) { + return -1; + } else if (mType == Type.REMOTE) { + return +1; + } else if (another.mType == Type.NETWORK){ + return +1; + } else { // another is REMOTE + return -1; + } + } + if(mType == Type.NETWORK) { + return mNetwork.compareTo(another.mNetwork); + } else if(mType == Type.REMOTE){ + return mHostname.compareTo(another.mHostname); + } else { + try { + if (mEndpoint.getAddress().equals(System.getNetwork().getGatewayAddress())) + return -1; + else if (mEndpoint.getAddress().equals(System.getNetwork().getLocalAddress())) + return +1; + } catch (Exception e) { + System.errorLogging(e); + } + return mEndpoint.compareTo(another.mEndpoint); + } } public Target(Network net){ @@ -483,7 +511,6 @@ else if(mType == Type.REMOTE) return mHostname.equals(target.getHostname()); } - return false; } diff --git a/cSploit/src/org/csploit/android/net/datasource/CVEDetails.java b/cSploit/src/main/java/org/csploit/android/net/datasource/CVEDetails.java similarity index 100% rename from cSploit/src/org/csploit/android/net/datasource/CVEDetails.java rename to cSploit/src/main/java/org/csploit/android/net/datasource/CVEDetails.java diff --git a/cSploit/src/org/csploit/android/net/datasource/ExploitDb.java b/cSploit/src/main/java/org/csploit/android/net/datasource/ExploitDb.java similarity index 100% rename from cSploit/src/org/csploit/android/net/datasource/ExploitDb.java rename to cSploit/src/main/java/org/csploit/android/net/datasource/ExploitDb.java diff --git a/cSploit/src/org/csploit/android/net/datasource/Generic.java b/cSploit/src/main/java/org/csploit/android/net/datasource/Generic.java similarity index 100% rename from cSploit/src/org/csploit/android/net/datasource/Generic.java rename to cSploit/src/main/java/org/csploit/android/net/datasource/Generic.java diff --git a/cSploit/src/org/csploit/android/net/datasource/Rapid7.java b/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java similarity index 98% rename from cSploit/src/org/csploit/android/net/datasource/Rapid7.java rename to cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java index fe5b1202a4..4562e3b6c5 100644 --- a/cSploit/src/org/csploit/android/net/datasource/Rapid7.java +++ b/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java @@ -211,6 +211,10 @@ public static void beginFetchReferences(RemoteReader.Job job, Target.Exploit exp public void onContentFetched(byte[] content) { MsfExploit result = parsePage(new String(content)); + + if(result == null) + return; + result.copyTo(exploit); receiver.onFoundItemChanged(exploit); @@ -308,9 +312,11 @@ private void parseSearchResults(String html) { private void parseExploit(String html) { MsfExploit exploit = ExploitReceiver.parsePage(html); - exploit.setPort(port); + if(exploit != null) { + exploit.setPort(port); - receiver.onItemFound(exploit); + receiver.onItemFound(exploit); + } } @Override diff --git a/cSploit/src/org/csploit/android/net/datasource/Search.java b/cSploit/src/main/java/org/csploit/android/net/datasource/Search.java similarity index 100% rename from cSploit/src/org/csploit/android/net/datasource/Search.java rename to cSploit/src/main/java/org/csploit/android/net/datasource/Search.java diff --git a/cSploit/src/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java similarity index 67% rename from cSploit/src/org/csploit/android/net/http/RequestParser.java rename to cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index f189ac0a16..47775edd7f 100644 --- a/cSploit/src/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -22,11 +22,14 @@ import org.csploit.android.core.Logger; import org.csploit.android.net.ByteBuffer; +import org.csploit.android.net.http.proxy.DNSCache; import java.net.HttpCookie; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class RequestParser { @@ -45,30 +48,30 @@ public class RequestParser private static final String[] TLD = { ".com.ac", ".edu.ac", ".gov.ac", - ".net.ac", ".mil.ac", ".org.ac", ".ad", ".nom.ad", ".ae", + ".net.ac", ".mil.ac", ".org.ac", ".nom.ad", ".ad", ".net.ae", ".gov.ae", ".org.ae", ".mil.ae", ".sch.ae", ".ac.ae", - ".pro.ae", ".name.ae", ".aero", ".af", ".gov.af", ".edu.af", - ".net.af", ".com.af", ".ag", ".com.ag", ".org.ag", ".net.ag", - ".co.ag", ".nom.ag", ".ai", ".off.ai", ".com.ai", ".net.ai", - ".org.ai", ".gov.al", ".edu.al", ".org.al", ".com.al", ".net.al", - ".tirana.al", ".soros.al", ".upt.al", ".am", ".an", ".com.an", - ".net.an", ".org.an", ".edu.an", ".co.ao", ".ed.ao", ".gv.ao", + ".pro.ae", ".name.ae", ".ae", ".aero", ".gov.af", ".edu.af", + ".net.af", ".com.af", ".af", ".com.ag", ".org.ag", ".net.ag", + ".co.ag", ".nom.ag", ".ag", ".off.ai", ".com.ai", ".net.ai", + ".org.ai", ".ai", ".gov.al", ".edu.al", ".org.al", ".com.al", ".net.al", + ".tirana.al", ".soros.al", ".upt.al", ".am", ".com.an", + ".net.an", ".org.an", ".edu.an", ".an", ".co.ao", ".ed.ao", ".gv.ao", ".it.ao", ".og.ao", ".pb.ao", ".com.ar", ".gov.ar", ".int.ar", ".mil.ar", ".net.ar", ".org.ar", ".iris.arpa", ".uri.arpa", - ".urn.arpa", ".as", ".at", ".gv.at", ".ac.at", ".co.at", ".or.at", - ".priv.at", ".asn.au", ".com.au", ".net.au", ".id.au", ".org.au", + ".urn.arpa", ".as", ".gv.at", ".ac.at", ".co.at", ".or.at", + ".priv.at", ".at", ".asn.au", ".com.au", ".net.au", ".id.au", ".org.au", ".csiro.au", ".oz.au", ".info.au", ".conf.au", ".act.au", ".nsw.au", ".nt.au", ".qld.au", ".sa.au", ".tas.au", ".vic.au", ".wa.auFor", ".gov.au", ".and", ".act", ".nsw", ".nt", ".qld", - ".sa", ".tas", ".vic", ".wa", ".aw", ".com.aw", ".ax", ".az", + ".sa", ".tas", ".vic", ".wa", ".com.aw", ".aw", ".ax", ".com.az", ".net.az", ".int.az", ".gov.az", ".biz.az", ".org.az", - ".edu.az", ".mil.az", ".pp.az", ".name.az", ".info.az", ".com.bb", + ".edu.az", ".mil.az", ".pp.az", ".name.az", ".info.az", ".az", ".com.bb", ".edu.bb", ".gov.bb", ".net.bb", ".org.bb", ".com.bd", ".edu.bd", ".net.bd", ".gov.bd", ".org.bd", ".mil.bd", ".ac.be", ".gov.bf", ".possibly", ".com.bm", ".edu.bm", ".org.bm", ".gov.bm", ".net.bm", - ".com.bn", ".edu.bn", ".org.bn", ".net.bn", ".bo", ".com.bo", + ".com.bn", ".edu.bn", ".org.bn", ".net.bn", ".com.bo", ".org.bo", ".net.bo", ".gov.bo", ".gob.bo", ".edu.bo", ".tv.bo", - ".mil.bo", ".int.bo", ".agr.br", ".am.br", ".art.br", ".edu.br", + ".mil.bo", ".int.bo", ".bo", ".agr.br", ".am.br", ".art.br", ".edu.br", ".com.br", ".coop.br", ".esp.br", ".far.br", ".fm.br", ".gov.br", ".imb.br", ".ind.br", ".inf.br", ".mil.br", ".net.br", ".org.br", ".psi.br", ".rec.br", ".srv.br", ".tmp.br", ".tur.br", ".tv.br", @@ -77,71 +80,71 @@ public class RequestParser ".eti.br", ".fnd.br", ".fot.br", ".fst.br", ".ggf.br", ".jor.br", ".lel.br", ".mat.br", ".med.br", ".mus.br", ".not.br", ".ntr.br", ".odo.br", ".ppg.br", ".pro.br", ".psc.br", ".qsl.br", ".slg.br", - ".trd.br", ".vet.br", ".zlg.br", ".dpn.br", ".nom.br", ".bs", - ".com.bs", ".net.bs", ".org.bs", ".bt", ".com.bt", ".edu.bt", - ".gov.bt", ".net.bt", ".org.bt", ".bw", ".co.bw", ".org.bw", - ".gov.by", ".mil.by", ".ca", ".ab.ca", ".bc.ca", ".mb.ca", + ".trd.br", ".vet.br", ".zlg.br", ".dpn.br", ".nom.br", + ".com.bs", ".net.bs", ".org.bs", ".bs", ".com.bt", ".edu.bt", + ".gov.bt", ".net.bt", ".org.bt", ".bt", ".co.bw", ".org.bw", ".bw", + ".gov.by", ".mil.by", ".ab.ca", ".bc.ca", ".mb.ca", ".nb.ca", ".nf.ca", ".nl.ca", ".ns.ca", ".nt.ca", ".nu.ca", - ".on.ca", ".pe.ca", ".qc.ca", ".sk.ca", ".yk.ca", ".cc", ".co.cc", - ".cd", ".com.cd", ".net.cd", ".org.cd", ".ch", ".com.ch", - ".net.ch", ".org.ch", ".gov.ch", ".co.ck", ".others", ".cn", + ".on.ca", ".pe.ca", ".qc.ca", ".sk.ca", ".yk.ca", ".ca", ".co.cc", ".cc", + ".com.cd", ".net.cd", ".org.cd", ".cd", ".com.ch", + ".net.ch", ".org.ch", ".gov.ch", ".ch", ".co.ck", ".others", ".ac.cn", ".com.cn", ".edu.cn", ".gov.cn", ".net.cn", ".org.cn", ".ah.cn", ".bj.cn", ".cq.cn", ".fj.cn", ".gd.cn", ".gs.cn", ".gz.cn", ".gx.cn", ".ha.cn", ".hb.cn", ".he.cn", ".hi.cn", ".hl.cn", ".hn.cn", ".jl.cn", ".js.cn", ".jx.cn", ".ln.cn", ".nm.cn", ".nx.cn", ".qh.cn", ".sc.cn", ".sd.cn", ".sh.cn", ".sn.cn", ".sx.cn", ".tj.cn", ".xj.cn", ".xz.cn", ".yn.cn", - ".zj.cn", ".com.co", ".edu.co", ".org.co", ".gov.co", ".mil.co", + ".zj.cn", ".cn", ".com.co", ".edu.co", ".org.co", ".gov.co", ".mil.co", ".net.co", ".nom.co", ".ac.cr", ".co.cr", ".ed.cr", ".fi.cr", - ".go.cr", ".or.cr", ".sa.cr", ".cu", ".com.cu", ".edu.cu", - ".org.cu", ".net.cu", ".gov.cu", ".inf.cu", ".cx", ".gov.cx", + ".go.cr", ".or.cr", ".sa.cr", ".com.cu", ".edu.cu", + ".org.cu", ".net.cu", ".gov.cu", ".inf.cu", ".cu", ".gov.cx", ".cx", ".com.cy", ".biz.cy", ".info.cy", ".ltd.cy", ".pro.cy", ".net.cy", ".org.cy", ".name.cy", ".tm.cy", ".ac.cy", ".ekloges.cy", - ".press.cy", ".parliament.cy", ".dm", ".com.dm", ".net.dm", - ".org.dm", ".edu.dm", ".gov.dm", ".edu.do", ".gov.do", ".gob.do", + ".press.cy", ".parliament.cy", ".com.dm", ".net.dm", + ".org.dm", ".edu.dm", ".gov.dm", ".dm", ".edu.do", ".gov.do", ".gob.do", ".com.do", ".org.do", ".sld.do", ".web.do", ".net.do", ".mil.do", - ".art.do", ".dz", ".com.dz", ".org.dz", ".net.dz", ".gov.dz", - ".edu.dz", ".asso.dz", ".pol.dz", ".art.dz", ".ec", ".com.ec", + ".art.do", ".com.dz", ".org.dz", ".net.dz", ".gov.dz", + ".edu.dz", ".asso.dz", ".pol.dz", ".art.dz", ".dz", ".com.ec", ".info.ec", ".net.ec", ".fin.ec", ".med.ec", ".pro.ec", ".org.ec", - ".edu.ec", ".gov.ec", ".mil.ec", ".ee", ".com.ee", ".org.ee", - ".fie.ee", ".pri.ee", ".eun.eg", ".edu.eg", ".sci.eg", ".gov.eg", - ".com.eg", ".org.eg", ".net.eg", ".mil.eg", ".es", ".com.es", - ".nom.es", ".org.es", ".gob.es", ".edu.es", ".com.et", ".gov.et", + ".edu.ec", ".gov.ec", ".mil.ec", ".ec",".com.ee", ".org.ee", + ".fie.ee", ".pri.ee", ".ee", ".eun.eg", ".edu.eg", ".sci.eg", ".gov.eg", + ".com.eg", ".org.eg", ".net.eg", ".mil.eg", ".com.es", + ".nom.es", ".org.es", ".gob.es", ".edu.es", ".es", ".com.et", ".gov.et", ".org.et", ".edu.et", ".net.et", ".biz.et", ".name.et", ".info.et", - ".fi", ".aland.fi", ".biz.fj", ".com.fj", ".info.fj", ".name.fj", + ".aland.fi", ".fi", ".biz.fj", ".com.fj", ".info.fj", ".name.fj", ".net.fj", ".org.fj", ".pro.fj", ".ac.fj", ".gov.fj", ".mil.fj", ".school.fj", ".co.fk", ".org.fk", ".gov.fk", ".ac.fk", ".nom.fk", - ".net.fk", ".fr", ".tm.fr", ".asso.fr", ".nom.fr", ".prd.fr", - ".presse.fr", ".com.fr", ".gouv.fr", ".ge", ".com.ge", ".edu.ge", - ".gov.ge", ".org.ge", ".mil.ge", ".net.ge", ".pvt.ge", ".gg", - ".co.gg", ".net.gg", ".org.gg", ".com.gh", ".edu.gh", ".gov.gh", - ".org.gh", ".mil.gh", ".gi", ".com.gi", ".ltd.gi", ".gov.gi", + ".net.fk", ".tm.fr", ".asso.fr", ".nom.fr", ".prd.fr", + ".presse.fr", ".com.fr", ".gouv.fr", ".fr", ".com.ge", ".edu.ge", + ".gov.ge", ".org.ge", ".mil.ge", ".net.ge", ".pvt.ge", ".ge", + ".co.gg", ".net.gg", ".org.gg", ".gg", ".com.gh", ".edu.gh", ".gov.gh", + ".org.gh", ".mil.gh", ".gh", ".com.gi", ".ltd.gi", ".gov.gi", ".mod.gi", ".edu.gi", ".org.gi", ".com.gn", ".ac.gn", ".gov.gn", - ".org.gn", ".net.gn", ".gp", ".or", ".org.gp", ".gr", ".com.gr", - ".edu.gr", ".net.gr", ".org.gr", ".gov.gr", ".hk", ".com.hk", - ".edu.hk", ".gov.hk", ".idv.hk", ".net.hk", ".org.hk", ".hn", + ".org.gn", ".net.gn", ".gn", ".or", ".org.gp", ".gp", ".com.gr", + ".edu.gr", ".net.gr", ".org.gr", ".gov.gr", ".gr", ".com.hk", + ".edu.hk", ".gov.hk", ".idv.hk", ".net.hk", ".org.hk", ".hk", ".com.hn", ".edu.hn", ".org.hn", ".net.hn", ".mil.hn", ".gob.hn", - ".hr", ".iz.hr", ".from.hr", ".name.hr", ".com.hr", ".ht", + ".hn", ".iz.hr", ".from.hr", ".name.hr", ".com.hr", ".hr", ".com.ht", ".net.ht", ".firm.ht", ".shop.ht", ".info.ht", ".pro.ht", ".adult.ht", ".org.ht", ".art.ht", ".pol.ht", ".rel.ht", ".asso.ht", ".perso.ht", ".coop.ht", ".med.ht", ".edu.ht", - ".gouv.ht", ".hu", ".co.hu", ".info.hu", ".org.hu", ".priv.hu", + ".gouv.ht", ".ht", ".co.hu", ".info.hu", ".org.hu", ".priv.hu", ".sport.hu", ".tm.hu", ".agrar.hu", ".bolt.hu", ".casino.hu", ".city.hu", ".erotica.hu", ".erotika.hu", ".film.hu", ".forum.hu", ".games.hu", ".hotel.hu", ".ingatlan.hu", ".jogasz.hu", ".konyvelo.hu", ".lakas.hu", ".media.hu", ".news.hu", ".reklam.hu", ".sex.hu", ".shop.hu", ".suli.hu", ".szex.hu", ".tozsde.hu", - ".utazas.hu", ".video.hu", ".ac.id", ".co.id", ".or.id", ".go.id", - ".ie", ".gov.ie", ".ac.il", ".co.il", ".org.il", ".net.il", + ".utazas.hu", ".video.hu", ".hu", ".ac.id", ".co.id", ".or.id", ".go.id", + ".gov.ie", ".ie", ".ac.il", ".co.il", ".org.il", ".net.il", ".gov.il", ".muni.il", ".idf.il", ".co.im", ".ltd.co.im", ".plc.co.im", ".net.im", ".gov.im", ".org.im", ".nic.im", ".ac.im", - ".in", ".co.in", ".firm.in", ".net.in", ".org.in", ".gen.in", + ".co.in", ".firm.in", ".net.in", ".org.in", ".gen.in", ".ind.in", ".nic.in", ".ac.in", ".edu.in", ".res.in", ".gov.in", - ".mil.in", ".ir", ".ac.ir", ".co.ir", ".gov.ir", ".net.ir", - ".org.ir", ".sch.ir", ".it", ".gov.it", "...", ".je", ".co.je", - ".net.je", ".org.je", ".edu.jm", ".gov.jm", ".com.jm", ".net.jm", - ".org.jm", ".jo", ".com.jo", ".org.jo", ".net.jo", ".edu.jo", - ".gov.jo", ".mil.jo", ".jp", ".ac.jp", ".ad.jp", ".co.jp", + ".mil.in", ".in", ".ac.ir", ".co.ir", ".gov.ir", ".net.ir", + ".org.ir", ".sch.ir", ".ir", ".gov.it", ".it", ".co.je", + ".net.je", ".org.je", ".je", ".edu.jm", ".gov.jm", ".com.jm", ".net.jm", + ".org.jm", ".com.jo", ".org.jo", ".net.jo", ".edu.jo", + ".gov.jo", ".mil.jo", ".jo", ".ac.jp", ".ad.jp", ".co.jp", ".ed.jp", ".go.jp", ".gr.jp", ".lg.jp", ".ne.jp", ".hokkaido.jp", ".aomori.jp", ".iwate.jp", ".miyagi.jp", ".akita.jp", ".yamagata.jp", ".fukushima.jp", ".ibaraki.jp", ".tochigi.jp", @@ -155,30 +158,30 @@ public class RequestParser ".kochi.jp", ".fukuoka.jp", ".saga.jp", ".nagasaki.jp", ".kumamoto.jp", ".oita.jp", ".miyazaki.jp", ".kagoshima.jp", ".okinawa.jp", ".sapporo.jp", ".sendai.jp", ".yokohama.jp", - ".kawasaki.jp", ".nagoya.jp", ".kobe.jp", ".kitakyushu.jp", + ".kawasaki.jp", ".nagoya.jp", ".kobe.jp", ".kitakyushu.jp", ".jp", ".per.kh", ".com.kh", ".edu.kh", ".gov.kh", ".mil.kh", ".net.kh", - ".org.kh", ".kr", ".co.kr", ".or.kr", ".com.kw", ".edu.kw", - ".gov.kw", ".net.kw", ".org.kw", ".mil.kw", ".ky", ".edu.ky", - ".gov.ky", ".com.ky", ".org.ky", ".net.ky", ".org.kz", ".edu.kz", + ".org.kh", ".co.kr", ".or.kr", ".kr", ".com.kw", ".edu.kw", + ".gov.kw", ".net.kw", ".org.kw", ".mil.kw", ".edu.ky", + ".gov.ky", ".com.ky", ".org.ky", ".net.ky", ".ky", ".org.kz", ".edu.kz", ".net.kz", ".gov.kz", ".mil.kz", ".com.kz", ".net.lb", ".org.lb", ".gov.lb", ".edu.lb", ".com.lb", ".com.lc", ".org.lc", ".edu.lc", - ".gov.lc", ".li", ".com.li", ".net.li", ".org.li", ".gov.li", - ".lk", ".gov.lk", ".sch.lk", ".net.lk", ".int.lk", ".com.lk", + ".gov.lc", ".com.li", ".net.li", ".org.li", ".gov.li", ".li", + ".gov.lk", ".sch.lk", ".net.lk", ".int.lk", ".com.lk", ".org.lk", ".edu.lk", ".ngo.lk", ".soc.lk", ".web.lk", ".ltd.lk", - ".assn.lk", ".grp.lk", ".hotel.lk", ".com.lr", ".edu.lr", - ".gov.lr", ".org.lr", ".net.lr", ".org.ls", ".co.ls", ".lt", - ".gov.lt", ".mil.lt", ".lu", ".gov.lu", ".mil.lu", ".org.lu", - ".net.lu", ".lv", ".com.lv", ".edu.lv", ".gov.lv", ".org.lv", - ".mil.lv", ".id.lv", ".net.lv", ".asn.lv", ".conf.lv", ".ly", + ".assn.lk", ".grp.lk", ".hotel.lk", ".lk", ".com.lr", ".edu.lr", + ".gov.lr", ".org.lr", ".net.lr", ".org.ls", ".co.ls", + ".gov.lt", ".mil.lt", ".lt", ".gov.lu", ".mil.lu", ".org.lu", + ".net.lu", ".lu", ".com.lv", ".edu.lv", ".gov.lv", ".org.lv", + ".mil.lv", ".id.lv", ".net.lv", ".asn.lv", ".conf.lv", ".lv", ".com.ly", ".net.ly", ".gov.ly", ".plc.ly", ".edu.ly", ".sch.ly", - ".med.ly", ".org.ly", ".id.ly", ".ma", ".co.ma", ".net.ma", - ".gov.ma", ".org.ma", ".mc", ".tm.mc", ".asso.mc", ".mg", + ".med.ly", ".org.ly", ".id.ly", ".ly", ".co.ma", ".net.ma", + ".gov.ma", ".org.ma", ".ma", ".tm.mc", ".asso.mc", ".mc", ".org.mg", ".nom.mg", ".gov.mg", ".prd.mg", ".tm.mg", ".com.mg", - ".edu.mg", ".mil.mg", ".army.mil", ".navy.mil", ".mk", ".com.mk", - ".org.mk", ".mo", ".com.mo", ".net.mo", ".org.mo", ".edu.mo", - ".gov.mo", ".weather.mobi", ".music.mobi", ".mt", ".org.mt", - ".com.mt", ".gov.mt", ".edu.mt", ".net.mt", ".mu", ".com.mu", - ".co.mu", ".aero.mv", ".biz.mv", ".com.mv", ".coop.mv", ".edu.mv", + ".edu.mg", ".mil.mg", ".mg", ".army.mil", ".navy.mil", ".com.mk", + ".org.mk", ".mk", ".com.mo", ".net.mo", ".org.mo", ".edu.mo", + ".gov.mo", ".mo", ".weather.mobi", ".music.mobi", ".org.mt", + ".com.mt", ".gov.mt", ".edu.mt", ".net.mt", ".mt", ".com.mu", + ".co.mu", ".mu", ".aero.mv", ".biz.mv", ".com.mv", ".coop.mv", ".edu.mv", ".gov.mv", ".info.mv", ".int.mv", ".mil.mv", ".museum.mv", ".name.mv", ".net.mv", ".org.mv", ".pro.mv", ".ac.mw", ".co.mw", ".com.mw", ".coop.mw", ".edu.mw", ".gov.mw", ".int.mw", @@ -186,12 +189,12 @@ public class RequestParser ".org.mx", ".edu.mx", ".gob.mx", ".com.my", ".net.my", ".org.my", ".gov.my", ".edu.my", ".mil.my", ".name.my", ".edu.ng", ".com.ng", ".gov.ng", ".org.ng", ".net.ng", ".gob.ni", ".com.ni", ".edu.ni", - ".org.ni", ".nom.ni", ".net.ni", ".nl", ".no", ".mil.no", + ".org.ni", ".nom.ni", ".net.ni", ".nl", ".mil.no", ".stat.no", ".kommune.no", ".herad.no", ".priv.no", ".vgs.no", ".fhs.no", ".museum.no", ".fylkesbibl.no", ".folkebibl.no", - ".idrett.no", ".com.np", ".org.np", ".edu.np", ".net.np", - ".gov.np", ".mil.np", ".nr", ".gov.nr", ".edu.nr", ".biz.nr", - ".info.nr", ".org.nr", ".com.nr", ".net.nr", ".ac.nz", ".co.nz", + ".idrett.no", ".no", ".com.np", ".org.np", ".edu.np", ".net.np", + ".gov.np", ".mil.np", ".gov.nr", ".edu.nr", ".biz.nr", + ".info.nr", ".org.nr", ".com.nr", ".net.nr", ".nr", ".ac.nz", ".co.nz", ".cri.nz", ".gen.nz", ".geek.nz", ".govt.nz", ".iwi.nz", ".maori.nz", ".mil.nz", ".net.nz", ".org.nz", ".school.nz", ".com.om", ".co.om", ".edu.om", ".ac.com", ".sch.om", ".gov.om", @@ -199,55 +202,55 @@ public class RequestParser ".pro.om", ".med.om", ".com.pa", ".ac.pa", ".sld.pa", ".gob.pa", ".edu.pa", ".org.pa", ".net.pa", ".abo.pa", ".ing.pa", ".med.pa", ".nom.pa", ".com.pe", ".org.pe", ".net.pe", ".edu.pe", ".mil.pe", - ".gob.pe", ".nom.pe", ".pf", ".com.pf", ".org.pf", ".edu.pf", - ".com.pg", ".net.pg", ".ph", ".com.ph", ".gov.ph", ".pk", + ".gob.pe", ".nom.pe", ".com.pf", ".org.pf", ".edu.pf", ".pf", + ".com.pg", ".net.pg", ".com.ph", ".gov.ph", ".ph", ".com.pk", ".net.pk", ".edu.pk", ".org.pk", ".fam.pk", ".biz.pk", ".web.pk", ".gov.pk", ".gob.pk", ".gok.pk", ".gon.pk", ".gop.pk", - ".gos.pk", ".pl", ".com.pl", ".biz.pl", ".net.pl", ".art.pl", + ".gos.pk", ".pk", ".com.pl", ".biz.pl", ".net.pl", ".art.pl", ".edu.pl", ".org.pl", ".ngo.pl", ".gov.pl", ".info.pl", ".mil.pl", ".waw.pl", ".warszawa.pl", ".wroc.pl", ".wroclaw.pl", ".krakow.pl", ".poznan.pl", ".lodz.pl", ".gda.pl", ".gdansk.pl", ".slupsk.pl", ".szczecin.pl", ".lublin.pl", ".bialystok.pl", - ".olsztyn.pl.torun.pl", ".more...", ".pr", ".biz.pr", ".com.pr", + ".olsztyn.pl.torun.pl", ".pl", ".biz.pr", ".com.pr", ".edu.pr", ".gov.pr", ".info.pr", ".isla.pr", ".name.pr", - ".net.pr", ".org.pr", ".pro.pr", ".law.pro", ".med.pro", - ".cpa.pro", ".ps", ".edu.ps", ".gov.ps", ".sec.ps", ".plo.ps", - ".com.ps", ".org.ps", ".net.ps", ".pt", ".com.pt", ".edu.pt", - ".gov.pt", ".int.pt", ".net.pt", ".nome.pt", ".org.pt", ".publ.pt", - ".net.py", ".org.py", ".gov.py", ".edu.py", ".com.py", ".ro", + ".net.pr", ".org.pr", ".pro.pr", ".pr", ".law.pro", ".med.pro", + ".cpa.pro", ".edu.ps", ".gov.ps", ".sec.ps", ".plo.ps", + ".com.ps", ".org.ps", ".net.ps", ".ps", ".com.pt", ".edu.pt", + ".gov.pt", ".int.pt", ".net.pt", ".nome.pt", ".org.pt", ".publ.pt", ".pt", + ".net.py", ".org.py", ".gov.py", ".edu.py", ".com.py", ".com.ro", ".org.ro", ".tm.ro", ".nt.ro", ".nom.ro", ".info.ro", - ".rec.ro", ".arts.ro", ".firm.ro", ".store.ro", ".www.ro", ".ru", + ".rec.ro", ".arts.ro", ".firm.ro", ".store.ro", ".www.ro", ".ro", ".com.ru", ".net.ru", ".org.ru", ".pp.ru", ".msk.ru", ".int.ru", - ".ac.ru", ".rw", ".gov.rw", ".net.rw", ".edu.rw", ".ac.rw", - ".com.rw", ".co.rw", ".int.rw", ".mil.rw", ".gouv.rw", ".com.sa", + ".ac.ru", ".ru", ".gov.rw", ".net.rw", ".edu.rw", ".ac.rw", + ".com.rw", ".co.rw", ".int.rw", ".mil.rw", ".gouv.rw", ".rw", ".com.sa", ".edu.sa", ".sch.sa", ".med.sa", ".gov.sa", ".net.sa", ".org.sa", - ".pub.sa", ".com.sb", ".gov.sb", ".net.sb", ".edu.sb", ".sc", - ".com.sc", ".gov.sc", ".net.sc", ".org.sc", ".edu.sc", ".sd", + ".pub.sa", ".com.sb", ".gov.sb", ".net.sb", ".edu.sb", + ".com.sc", ".gov.sc", ".net.sc", ".org.sc", ".edu.sc", ".sc", ".com.sd", ".net.sd", ".org.sd", ".edu.sd", ".med.sd", ".tv.sd", - ".gov.sd", ".info.sd", ".se", ".org.se", ".pp.se", ".tm.se", + ".gov.sd", ".info.sd", ".sd", ".org.se", ".pp.se", ".tm.se", ".brand.se", ".parti.se", ".press.se", ".komforb.se", ".kommunalforbund.se", ".komvux.se", ".lanarb.se", ".lanbib.se", ".naturbruksgymn.se", ".sshn.se", ".fhv.se", ".fhsk.se", ".fh.se", ".ab.se", ".c.se", ".d.se", ".e.se", ".f.se", ".g.se", ".h.se", ".i.se", ".k.se", ".m.se", ".n.se", ".o.se", ".s.se", ".t.se", - ".u.se", ".w.se", ".x.se", ".y.se", ".z.se", ".ac.se", ".bd.se", - ".sg", ".com.sg", ".net.sg", ".org.sg", ".gov.sg", ".edu.sg", - ".per.sg", ".idn.sg", ".edu.sv", ".com.sv", ".gob.sv", ".org.sv", + ".u.se", ".w.se", ".x.se", ".y.se", ".z.se", ".ac.se", ".bd.se", ".se", + ".com.sg", ".net.sg", ".org.sg", ".gov.sg", ".edu.sg", + ".per.sg", ".idn.sg", ".sg", ".edu.sv", ".com.sv", ".gob.sv", ".org.sv", ".red.sv", ".gov.sy", ".com.sy", ".net.sy", ".ac.th", ".co.th", - ".in.th", ".go.th", ".mi.th", ".or.th", ".net.th", ".tj", ".ac.tj", + ".in.th", ".go.th", ".mi.th", ".or.th", ".net.th", ".ac.tj", ".biz.tj", ".com.tj", ".co.tj", ".edu.tj", ".int.tj", ".name.tj", - ".net.tj", ".org.tj", ".web.tj", ".gov.tj", ".go.tj", ".mil.tj", + ".net.tj", ".org.tj", ".web.tj", ".gov.tj", ".go.tj", ".mil.tj", ".tj", ".com.tn", ".intl.tn", ".gov.tn", ".org.tn", ".ind.tn", ".nat.tn", ".tourism.tn", ".info.tn", ".ens.tn", ".fin.tn", ".net.tn", ".to", - ".gov.to", ".tp", ".gov.tp", ".com.tr", ".info.tr", ".biz.tr", + ".gov.to", ".gov.tp", ".tp", ".com.tr", ".info.tr", ".biz.tr", ".net.tr", ".org.tr", ".web.tr", ".gen.tr", ".av.tr", ".dr.tr", ".bbs.tr", ".name.tr", ".tel.tr", ".gov.tr", ".bel.tr", ".pol.tr", - ".mil.tr", ".edu.tr", ".tt", ".co.tt", ".com.tt", ".org.tt", + ".mil.tr", ".edu.tr", ".co.tt", ".com.tt", ".org.tt", ".net.tt", ".biz.tt", ".info.tt", ".pro.tt", ".name.tt", ".edu.tt", - ".gov.tt", ".tv", ".gov.tv", ".tw", ".edu.tw", ".gov.tw", + ".gov.tt", ".tt", ".gov.tv", ".tv", ".edu.tw", ".gov.tw", ".mil.tw", ".com.tw", ".net.tw", ".org.tw", ".idv.tw", ".game.tw", - ".ebiz.tw", ".club.tw", ".co.tz", ".ac.tz", ".go.tz", ".or.tz", - ".ne.tz", ".ua", ".com.ua", ".gov.ua", ".net.ua", ".edu.ua", + ".ebiz.tw", ".club.tw", ".tw", ".co.tz", ".ac.tz", ".go.tz", ".or.tz", + ".ne.tz", ".com.ua", ".gov.ua", ".net.ua", ".edu.ua", ".org.uaGeographical", ".cherkassy.ua", ".ck.ua", ".chernigov.ua", ".cn.ua", ".chernovtsy.ua", ".cv.ua", ".crimea.ua", ".dnepropetrovsk.ua", ".dp.ua", ".donetsk.ua", ".dn.ua", ".if.ua", @@ -258,12 +261,12 @@ public class RequestParser ".poltava.ua", ".pl.ua", ".rovno.ua", ".rv.ua", ".sebastopol.ua", ".sumy.ua", ".ternopil.ua", ".te.ua", ".uzhgorod.ua", ".vinnica.ua", ".vn.ua", ".zaporizhzhe.ua", ".zp.ua", - ".zhitomir.ua", ".zt.ua", ".ug", ".co.ug", ".ac.ug", ".sc.ug", - ".go.ug", ".ne.ug", ".or.ug", ".ac.uk", ".co.uk", ".gov.uk", + ".zhitomir.ua", ".zt.ua", ".ua", ".co.ug", ".ac.ug", ".sc.ug", + ".go.ug", ".ne.ug", ".or.ug", ".ug", ".ac.uk", ".co.uk", ".gov.uk", ".ltd.uk", ".me.uk", ".mil.uk", ".mod.uk", ".net.uk", ".nic.uk", ".nhs.uk", ".org.uk", ".plc.uk", ".police.uk", ".bl.uk", ".icnet.uk", ".jet.uk", ".nel.uk", ".nls.uk", - ".parliament.uk.sch.uk", ".uses", ".level", ".domains", ".us", + ".parliament.uk.sch.uk", ".uses", ".level", ".domains", ".ak.us", ".al.us", ".ar.us", ".az.us", ".ca.us", ".co.us", ".ct.us", ".dc.us", ".de.us", ".dni.us", ".fed.us", ".fl.us", ".ga.us", ".hi.us", ".ia.us", ".id.us", ".il.us", ".in.us", @@ -273,12 +276,12 @@ public class RequestParser ".nm.us", ".nsn.us", ".nv.us", ".ny.us", ".oh.us", ".ok.us", ".or.us", ".pa.us", ".ri.us", ".sc.us", ".sd.us", ".tn.us", ".tx.us", ".ut.us", ".vt.us", ".va.us", ".wa.us", ".wi.us", - ".wv.us", ".wy.us", ".edu.uy", ".gub.uy", ".org.uy", ".com.uy", + ".wv.us", ".wy.us", ".us", ".edu.uy", ".gub.uy", ".org.uy", ".com.uy", ".net.uy", ".mil.uy", ".vatican.va", ".com.ve", ".net.ve", - ".org.ve", ".info.ve", ".co.ve", ".web.ve", ".vi", ".com.vi", - ".org.vi", ".edu.vi", ".gov.vi", ".vn", ".com.vn", ".net.vn", + ".org.ve", ".info.ve", ".co.ve", ".web.ve", ".com.vi", + ".org.vi", ".edu.vi", ".gov.vi", ".vi", ".com.vn", ".net.vn", ".org.vn", ".edu.vn", ".gov.vn", ".int.vn", ".ac.vn", ".biz.vn", - ".info.vn", ".name.vn", ".pro.vn", ".health.vn", ".com.ye", + ".info.vn", ".name.vn", ".pro.vn", ".health.vn", ".vn", ".com.ye", ".net.ye", ".ac.yu", ".co.yu", ".org.yu", ".edu.yu", ".ac.za", ".city.za", ".co.za", ".edu.za", ".gov.za", ".law.za", ".mil.za", ".nom.za", ".org.za", ".school.za", ".alt.za", ".net.za", @@ -288,26 +291,38 @@ public class RequestParser public static String getBaseDomain(String hostname){ - String domain = ""; - // if hostname is an IP address return that address if(Patterns.IP_ADDRESS.matcher(hostname).matches()) return hostname; + String cached_domain = DNSCache.getInstance().getRootDomain(hostname); + if (cached_domain != null) { + return cached_domain; + } + for(String tld : TLD){ if(hostname.endsWith(tld)){ String[] host_parts = hostname.split("\\."), tld_parts = tld.split("\\."); int itld = tld_parts.length, ihost = host_parts.length, - i = 0, - stop = ihost - 1; + i = 0; + + if ((ihost - itld) == 0 || ihost == 2) + return hostname; + + StringBuilder sb = new StringBuilder(); - domain = ""; - for(i = ihost - itld; i <= stop; i++){ - domain += host_parts[i] + (i == stop ? "" : "."); + for(i = ihost - itld; i < ihost; i++){ + sb.append(host_parts[i]); + if(i < ihost - 1) { + sb.append("."); + } } + String domain = sb.toString(); + + DNSCache.getInstance().addRootDomain(domain); return domain; } } @@ -316,14 +331,15 @@ public static String getBaseDomain(String hostname){ nextIndex = hostname.indexOf('.'), lastIndex = hostname.lastIndexOf('.'); - while(nextIndex < lastIndex){ + while(nextIndex < lastIndex) { startIndex = nextIndex + 1; nextIndex = hostname.indexOf('.', startIndex); } - if(startIndex > 0) + if(startIndex > 0) { + DNSCache.getInstance().addRootDomain(hostname.substring(startIndex)); return hostname.substring(startIndex); - + } else return hostname; } @@ -478,4 +494,48 @@ public static ArrayList getCookiesFromHeaders(ArrayList head return null; } + + /** + * extract the charset encoding from the HTTP response headers. + * + * @param contentType content-type header to be parsed + * @return returns the charset encoding if we've found it, or null. + */ + public static String getCharsetFromHeaders(String contentType){ + if (contentType != null && contentType.toLowerCase().trim().contains("charset=")){ + String[] parts = contentType.toLowerCase().trim().split("="); + if (parts.length > 0) + return parts[1]; + } + + return null; + } + + /** + * extract the charset encoding of a web site from the headers. + * + * @param body html body of the site to be parsed + * @return returns the charset encoding if we've found it, or null. + */ + public static String getCharsetFromBody(String body) { + if (body != null) { + int headEnd = body.toLowerCase().trim().indexOf(""); + + // return null if there's no head tags + if (headEnd == -1) + return null; + + String body_head = body.toLowerCase().substring(0, headEnd); + + Pattern p = Pattern.compile("charset=([\"\'a-z0-9A-Z-]+)"); + Matcher m = p.matcher(body_head); + String str_match = ""; + if (m.find()) { + str_match = m.toMatchResult().group(1); + return str_match.replaceAll("[\"']", ""); + } + } + + return null; + } } diff --git a/cSploit/src/org/csploit/android/net/http/proxy/CookieCleaner.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/CookieCleaner.java similarity index 75% rename from cSploit/src/org/csploit/android/net/http/proxy/CookieCleaner.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/CookieCleaner.java index 05062bb96c..8aad43fd8e 100644 --- a/cSploit/src/org/csploit/android/net/http/proxy/CookieCleaner.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/CookieCleaner.java @@ -55,8 +55,10 @@ else if(request.contains("Cookie:") == false) } public String getExpiredResponse(String request, String hostname){ - String domain = RequestParser.getBaseDomain(hostname), - response = "HTTP/1.1 302 Found\n"; + final StringBuilder responseBuilder = new StringBuilder(); + String domain = RequestParser.getBaseDomain(hostname); + + responseBuilder.append("HTTP/1.1 302 Found\n"); for(String line : request.split("\n")){ if(line.indexOf(':') != -1){ @@ -72,18 +74,24 @@ public String getExpiredResponse(String request, String hostname){ if(split.length == 2){ cookie = split[0].trim(); - response += "Set-Cookie: " + cookie + "=EXPIRED;Path=/;Domain=" + domain + ";Expires=Mon, 01-Jan-1990 00:00:00 GMT\n" + - "Set-Cookie: " + cookie + "=EXPIRED;Path=/;Domain=" + hostname + ";Expires=Mon, 01-Jan-1990 00:00:00 GMT\n"; + responseBuilder.append("Set-Cookie: ").append(cookie) + .append("=EXPIRED;Path=/;Domain=").append(domain) + .append(";Expires=Mon, 01-Jan-1990 00:00:00 GMT\n") + .append("Set-Cookie: ").append(cookie) + .append("=EXPIRED;Path=/;Domain=").append(hostname) + .append(";Expires=Mon, 01-Jan-1990 00:00:00 GMT\n"); } } } } } - response += "Location: " + RequestParser.getUrlFromRequest(hostname, request) + "\n" + - "Connection: close\n\n"; + responseBuilder.append("Location: ") + .append(RequestParser.getUrlFromRequest(hostname, request)) + .append("\n") + .append("Connection: close\n\n"); - return response; + return responseBuilder.toString(); } public void addCleaned(String client, String hostname){ diff --git a/cSploit/src/org/csploit/android/net/http/proxy/DNSCache.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java similarity index 63% rename from cSploit/src/org/csploit/android/net/http/proxy/DNSCache.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java index b8f474e264..3303ae0f5d 100644 --- a/cSploit/src/org/csploit/android/net/http/proxy/DNSCache.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java @@ -18,30 +18,60 @@ */ package org.csploit.android.net.http.proxy; +import org.csploit.android.core.Logger; + import java.io.IOException; import java.net.InetAddress; import java.net.Socket; +import java.util.ArrayList; import java.util.HashMap; import javax.net.SocketFactory; -import org.csploit.android.core.Logger; - public class DNSCache { - private static DNSCache mInstance = null; + private static DNSCache mInstance = new DNSCache(); - private HashMap mCache = null; + private final HashMap mCache; + private final ArrayList mRootDomainCache; public static DNSCache getInstance(){ - if(mInstance == null) - mInstance = new DNSCache(); - return mInstance; } - public DNSCache(){ - mCache = new HashMap(); + private DNSCache() { + mCache = new HashMap<>(); + mRootDomainCache = new ArrayList<>(); + } + + /** + * checks if a domain ends with an already intercepted root domain. + * + * @param hostname hostname to check + * @return String the root domain or null + */ + public String getRootDomain(String hostname){ + synchronized (mRootDomainCache) { + for (String rootDomain : mRootDomainCache) { + if (hostname.endsWith(rootDomain)) { + return rootDomain; + } + } + } + + return null; + } + + /** + * Adds a root domain extracted from the domain of a request, + * to the list of intercepted root domains. + * + * @param rootdomain Root domain to add to the list + */ + public void addRootDomain(String rootdomain){ + synchronized (mRootDomainCache) { + mRootDomainCache.add(rootdomain); + } } private InetAddress getAddress(String server) throws IOException{ diff --git a/cSploit/src/org/csploit/android/net/http/proxy/HTTPSMonitor.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSMonitor.java similarity index 100% rename from cSploit/src/org/csploit/android/net/http/proxy/HTTPSMonitor.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSMonitor.java diff --git a/cSploit/src/org/csploit/android/net/http/proxy/HTTPSRedirector.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java similarity index 98% rename from cSploit/src/org/csploit/android/net/http/proxy/HTTPSRedirector.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java index 6ac823861d..09fadf5cef 100644 --- a/cSploit/src/org/csploit/android/net/http/proxy/HTTPSRedirector.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java @@ -133,6 +133,7 @@ public void run(){ while((line = bReader.readLine()) != null){ if(headersProcessed == false){ + //FIXME: It had been modified, but it had not been used further. Is this a bug? headers.add(line); // \r\n\r\n received ? diff --git a/cSploit/src/org/csploit/android/net/http/proxy/Proxy.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/Proxy.java similarity index 100% rename from cSploit/src/org/csploit/android/net/http/proxy/Proxy.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/Proxy.java diff --git a/cSploit/src/org/csploit/android/net/http/proxy/ProxyThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/ProxyThread.java similarity index 99% rename from cSploit/src/org/csploit/android/net/http/proxy/ProxyThread.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/ProxyThread.java index 40fa54e6f7..3819307fd6 100644 --- a/cSploit/src/org/csploit/android/net/http/proxy/ProxyThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/ProxyThread.java @@ -168,8 +168,6 @@ else if(header.equals(RequestParser.HOST_HEADER)) mServer = DNSCache.getInstance().connect(mServerName, HTTP_SERVER_PORT); Logger.debug(client + " > " + mServerName + " [�" + (java.lang.System.currentTimeMillis() - millis) + " ms ]"); - - millis = java.lang.System.currentTimeMillis(); } } // just redirect requests diff --git a/cSploit/src/org/csploit/android/net/http/proxy/StreamThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java similarity index 80% rename from cSploit/src/org/csploit/android/net/http/proxy/StreamThread.java rename to cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java index 54928d2b94..3a30e32e42 100644 --- a/cSploit/src/org/csploit/android/net/http/proxy/StreamThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java @@ -18,16 +18,17 @@ */ package org.csploit.android.net.http.proxy; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - +import org.csploit.android.core.Logger; import org.csploit.android.core.Profiler; import org.csploit.android.core.System; -import org.csploit.android.core.Logger; import org.csploit.android.net.ByteBuffer; import org.csploit.android.net.http.RequestParser; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + public class StreamThread implements Runnable { private final static String[] FILTERED_CONTENT_TYPES = new String[] @@ -35,12 +36,13 @@ public class StreamThread implements Runnable "/html", "/css", "/javascript", - "/javascript", - "/x-javascript" + "/json", + "/x-javascript", + "/x-json" }; private final static String HEAD_SEPARATOR = "\r\n\r\n"; - private final static int CHUNK_SIZE = 1024; + private final static int CHUNK_SIZE = 64 * 1024; private String mClient = null; private InputStream mReader = null; @@ -146,20 +148,41 @@ public void run(){ HTTPSMonitor.getInstance().addURL(mClient, location.replace("https://", "http://").replace("&", "&")); } - String body = (split.length > 1 ? split[1] : ""), - patched = ""; + String body = (split.length > 1 ? split[1] : ""); + + final StringBuilder patchedBuilder = new StringBuilder(); body = mFilter.onDataReceived(headers, body); // remove explicit content length, just in case the body changed after filtering for(String header : headers.split("\n")){ if(header.toLowerCase().contains("content-length") == false) - patched += header + "\n"; + patchedBuilder.append(header).append("\n"); } - headers = patched; + headers = patchedBuilder.toString(); + + // try to get the charset encoding from the HTTP headers. + String charset = RequestParser.getCharsetFromHeaders(contentType); + + // if we haven't found the charset encoding on the HTTP headers, try it out on the body. + if (charset == null) { + charset = RequestParser.getCharsetFromBody(body); + } - mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes()); + if (charset != null) { + try { + mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes(charset)); + } + catch (UnsupportedEncodingException e){ + Logger.error("UnsupportedEncoding: " + e.getLocalizedMessage()); + mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes()); + } + } + else { + // if we haven't found the charset encoding, just handle it on ByteBuffer() + mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes()); + } mWriter.write(mBuffer.getData()); mWriter.flush(); diff --git a/cSploit/src/org/csploit/android/net/http/server/Server.java b/cSploit/src/main/java/org/csploit/android/net/http/server/Server.java similarity index 100% rename from cSploit/src/org/csploit/android/net/http/server/Server.java rename to cSploit/src/main/java/org/csploit/android/net/http/server/Server.java diff --git a/cSploit/src/org/csploit/android/net/http/server/ServerThread.java b/cSploit/src/main/java/org/csploit/android/net/http/server/ServerThread.java similarity index 97% rename from cSploit/src/org/csploit/android/net/http/server/ServerThread.java rename to cSploit/src/main/java/org/csploit/android/net/http/server/ServerThread.java index 852b6eff02..4d73509b66 100644 --- a/cSploit/src/org/csploit/android/net/http/server/ServerThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/server/ServerThread.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.Socket; +import java.util.Arrays; import org.csploit.android.core.System; import org.csploit.android.core.Logger; @@ -42,7 +43,7 @@ public ServerThread(Socket socket, byte[] data, String contentType) throws IOExc mSocket = socket; mWriter = new BufferedOutputStream(mSocket.getOutputStream()); mReader = mSocket.getInputStream(); - mData = data; + mData = Arrays.copyOf(data, data.length); mContentType = contentType; } diff --git a/cSploit/src/org/csploit/android/net/metasploit/Author.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/Author.java similarity index 100% rename from cSploit/src/org/csploit/android/net/metasploit/Author.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/Author.java diff --git a/cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java similarity index 98% rename from cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java index 1fc398ef98..d1b2ff6573 100644 --- a/cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java +++ b/cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java @@ -283,6 +283,11 @@ public boolean launch() throws RPCClient.MSFException { if(res.get("job_id") == null) { Logger.info("exploit launch failed: 'job_id' not found or null"); + + for (final Map.Entry entry : res.entrySet()) { + Logger.debug(String.format("res[%s] = %s", entry.getKey(), entry.getValue())); + } + return false; } diff --git a/cSploit/src/org/csploit/android/net/metasploit/Option.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java similarity index 93% rename from cSploit/src/org/csploit/android/net/metasploit/Option.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java index 31d7381c61..d20d6de2df 100644 --- a/cSploit/src/org/csploit/android/net/metasploit/Option.java +++ b/cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java @@ -5,6 +5,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Map; /** @@ -94,7 +95,7 @@ public boolean isEvasion() { } public String[] getEnum() { - return enums; + return Arrays.copyOf(enums, enums.length); } // TODO: make more setValue methods each with the corresponding type. @@ -126,11 +127,11 @@ public void setValue(String value) throws NumberFormatException { //TODO: handle integer enums ArrayList valid = ((ArrayList)mAttributes.get("enums")); if(!valid.contains(value)) { - String valid_line = ""; + final StringBuilder validLineBuilder = new StringBuilder(); for(String v : valid) { - valid_line+=" " + v; + validLineBuilder.append(" ").append(v); } - Logger.warning("expected: (" + valid_line + ") got: " + value); + Logger.warning("expected: (" + validLineBuilder.toString() + ") got: " + value); throw new NumberFormatException("invalid choice"); } mValue = value; diff --git a/cSploit/src/org/csploit/android/net/metasploit/Payload.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/Payload.java similarity index 100% rename from cSploit/src/org/csploit/android/net/metasploit/Payload.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/Payload.java diff --git a/cSploit/src/org/csploit/android/net/metasploit/RPCClient.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/RPCClient.java similarity index 99% rename from cSploit/src/org/csploit/android/net/metasploit/RPCClient.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/RPCClient.java index 5f861d867a..0e3fc6dacf 100644 --- a/cSploit/src/org/csploit/android/net/metasploit/RPCClient.java +++ b/cSploit/src/main/java/org/csploit/android/net/metasploit/RPCClient.java @@ -35,7 +35,7 @@ public class RPCClient private URL u; private URLConnection huc; private String token; - private static MessagePack msgpack = null; + private static volatile MessagePack msgpack = null; private final Map callCache = new HashMap(); private final Lock lock = new ReentrantLock(); private final boolean mRemote; diff --git a/cSploit/src/org/csploit/android/net/metasploit/Session.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/Session.java similarity index 100% rename from cSploit/src/org/csploit/android/net/metasploit/Session.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/Session.java diff --git a/cSploit/src/org/csploit/android/net/metasploit/ShellSession.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/ShellSession.java similarity index 99% rename from cSploit/src/org/csploit/android/net/metasploit/ShellSession.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/ShellSession.java index 9e74c22662..ceacd8b050 100644 --- a/cSploit/src/org/csploit/android/net/metasploit/ShellSession.java +++ b/cSploit/src/main/java/org/csploit/android/net/metasploit/ShellSession.java @@ -27,7 +27,7 @@ public static abstract class RpcShellReceiver extends Raw.RawReceiver { public abstract void onTimedOut(); } - private class CmdAndReceiver { + private static class CmdAndReceiver { public final String command; public final RpcShellReceiver receiver; diff --git a/cSploit/src/org/csploit/android/net/reference/CVE.java b/cSploit/src/main/java/org/csploit/android/net/reference/CVE.java similarity index 92% rename from cSploit/src/org/csploit/android/net/reference/CVE.java rename to cSploit/src/main/java/org/csploit/android/net/reference/CVE.java index 8fb8504a50..95223d40f7 100644 --- a/cSploit/src/org/csploit/android/net/reference/CVE.java +++ b/cSploit/src/main/java/org/csploit/android/net/reference/CVE.java @@ -73,7 +73,11 @@ public String toString() { @Override public boolean equals(Object o) { - return o.getClass() == CVE.class && id.equals(((CVE) o).id); + if (o == null) { + return false; + } + + return o.getClass() == this.getClass() && id.equals(((CVE) o).id); } public static boolean owns(String url) { diff --git a/cSploit/src/org/csploit/android/net/reference/Link.java b/cSploit/src/main/java/org/csploit/android/net/reference/Link.java similarity index 84% rename from cSploit/src/org/csploit/android/net/reference/Link.java rename to cSploit/src/main/java/org/csploit/android/net/reference/Link.java index dfb804d05c..70158ae23f 100644 --- a/cSploit/src/org/csploit/android/net/reference/Link.java +++ b/cSploit/src/main/java/org/csploit/android/net/reference/Link.java @@ -38,6 +38,10 @@ public String toString() { @Override public boolean equals(Object o) { - return o.getClass() == Link.class && url.equals(((Link) o).url); + if (o == null) { + return false; + } + + return o.getClass() == this.getClass() && url.equals(((Link) o).url); } } diff --git a/cSploit/src/org/csploit/android/net/reference/OSVDB.java b/cSploit/src/main/java/org/csploit/android/net/reference/OSVDB.java similarity index 89% rename from cSploit/src/org/csploit/android/net/reference/OSVDB.java rename to cSploit/src/main/java/org/csploit/android/net/reference/OSVDB.java index 6c10f2b101..f1cbffb7be 100644 --- a/cSploit/src/org/csploit/android/net/reference/OSVDB.java +++ b/cSploit/src/main/java/org/csploit/android/net/reference/OSVDB.java @@ -52,7 +52,11 @@ public String toString() { @Override public boolean equals(Object o) { - return o.getClass() == OSVDB.class && id == ((OSVDB) o).id; + if (o == null) { + return false; + } + + return o.getClass() == this.getClass() && id == ((OSVDB) o).id; } public static boolean owns(String url) { diff --git a/cSploit/src/org/csploit/android/net/reference/Reference.java b/cSploit/src/main/java/org/csploit/android/net/reference/Reference.java similarity index 100% rename from cSploit/src/org/csploit/android/net/reference/Reference.java rename to cSploit/src/main/java/org/csploit/android/net/reference/Reference.java diff --git a/cSploit/src/org/csploit/android/net/reference/Url.java b/cSploit/src/main/java/org/csploit/android/net/reference/Url.java similarity index 100% rename from cSploit/src/org/csploit/android/net/reference/Url.java rename to cSploit/src/main/java/org/csploit/android/net/reference/Url.java diff --git a/cSploit/src/org/csploit/android/net/reference/Vulnerability.java b/cSploit/src/main/java/org/csploit/android/net/reference/Vulnerability.java similarity index 100% rename from cSploit/src/org/csploit/android/net/reference/Vulnerability.java rename to cSploit/src/main/java/org/csploit/android/net/reference/Vulnerability.java diff --git a/cSploit/src/org/csploit/android/plugins/ExploitFinder.java b/cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java similarity index 97% rename from cSploit/src/org/csploit/android/plugins/ExploitFinder.java rename to cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java index 88b7e15200..d2a54b43f1 100644 --- a/cSploit/src/org/csploit/android/plugins/ExploitFinder.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java @@ -24,8 +24,8 @@ import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.content.ContextCompat; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.core.content.ContextCompat; import android.text.Html; import android.view.LayoutInflater; import android.view.Menu; @@ -266,6 +266,8 @@ private void setStartedState() { mSearchProgress.setVisibility(View.VISIBLE); final Target target = System.getCurrentTarget(); + mSearchFloatingActionButton.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_stop_24dp)); + buttonPlayed = true; job = Search.searchExploitForServices(target, new Search.Receiver() { @@ -299,8 +301,8 @@ public void onEnd() { @Override public void run() { mSearchProgress.setVisibility(View.GONE); - mSearchFloatingActionButton.setImageDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.ic_stop_24dp)); - buttonPlayed = true; + mSearchFloatingActionButton.setImageDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.ic_play_arrow_24dp)); + buttonPlayed = false; if (System.getCurrentExploits().size() == 0) { new FinishDialog(getString(R.string.warning), getString(R.string.no_exploits_found), ExploitFinder.this).show(); } else if (!somethingFound) { diff --git a/cSploit/src/org/csploit/android/plugins/Inspector.java b/cSploit/src/main/java/org/csploit/android/plugins/Inspector.java similarity index 98% rename from cSploit/src/org/csploit/android/plugins/Inspector.java rename to cSploit/src/main/java/org/csploit/android/plugins/Inspector.java index a3850c882b..16c2ed182a 100644 --- a/cSploit/src/org/csploit/android/plugins/Inspector.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/Inspector.java @@ -20,8 +20,8 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.content.ContextCompat; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.core.content.ContextCompat; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; diff --git a/cSploit/src/org/csploit/android/plugins/LoginCracker.java b/cSploit/src/main/java/org/csploit/android/plugins/LoginCracker.java similarity index 99% rename from cSploit/src/org/csploit/android/plugins/LoginCracker.java rename to cSploit/src/main/java/org/csploit/android/plugins/LoginCracker.java index b97110089c..19d559821a 100644 --- a/cSploit/src/org/csploit/android/plugins/LoginCracker.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/LoginCracker.java @@ -25,8 +25,8 @@ import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.content.ContextCompat; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.core.content.ContextCompat; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; diff --git a/cSploit/src/org/csploit/android/plugins/PacketForger.java b/cSploit/src/main/java/org/csploit/android/plugins/PacketForger.java similarity index 95% rename from cSploit/src/org/csploit/android/plugins/PacketForger.java rename to cSploit/src/main/java/org/csploit/android/plugins/PacketForger.java index 8051ebc589..394aeb4a16 100644 --- a/cSploit/src/org/csploit/android/plugins/PacketForger.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/PacketForger.java @@ -142,13 +142,13 @@ else if (data.isEmpty()) BufferedReader reader = new BufferedReader( new InputStreamReader(mSocket .getInputStream())); - String response = "", line = null; - + String line; + final StringBuilder responseBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { - response += line + "\n"; + responseBuilder.append(line).append("\n"); } - final String text = response; + final String text = responseBuilder.toString(); PacketForger.this .runOnUiThread(new Runnable() { public void run() { @@ -240,14 +240,12 @@ public void run() { mac.length); } - String hex = ""; - + final StringBuilder hexBuilder = new StringBuilder(); for (i = 0; i < mBinaryData.length; i++) - hex += "\\x" - + Integer.toHexString(0xFF & mBinaryData[i]) - .toUpperCase(); + hexBuilder.append("\\x") + .append(Integer.toHexString(0xFF & mBinaryData[i]).toUpperCase()); - mData.setText(hex); + mData.setText(hexBuilder.toString()); Toast.makeText(this, getString(R.string.customize_wol_port), diff --git a/cSploit/src/org/csploit/android/plugins/PortScanner.java b/cSploit/src/main/java/org/csploit/android/plugins/PortScanner.java similarity index 99% rename from cSploit/src/org/csploit/android/plugins/PortScanner.java rename to cSploit/src/main/java/org/csploit/android/plugins/PortScanner.java index 73e86639e8..6a789e9b9d 100644 --- a/cSploit/src/org/csploit/android/plugins/PortScanner.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/PortScanner.java @@ -23,8 +23,8 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.content.ContextCompat; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.core.content.ContextCompat; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; diff --git a/cSploit/src/org/csploit/android/plugins/RouterPwn.java b/cSploit/src/main/java/org/csploit/android/plugins/RouterPwn.java similarity index 94% rename from cSploit/src/org/csploit/android/plugins/RouterPwn.java rename to cSploit/src/main/java/org/csploit/android/plugins/RouterPwn.java index b4f000b3d4..1422a042d1 100644 --- a/cSploit/src/org/csploit/android/plugins/RouterPwn.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/RouterPwn.java @@ -18,7 +18,6 @@ */ package org.csploit.android.plugins; -import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -30,6 +29,8 @@ import org.csploit.android.gui.dialogs.ErrorDialog; import org.csploit.android.net.Target; +import androidx.fragment.app.FragmentActivity; + public class RouterPwn extends Plugin{ public RouterPwn(){ super( @@ -64,7 +65,7 @@ public void onActionClick(Context context){ } catch(ActivityNotFoundException e){ System.errorLogging(e); - new ErrorDialog(getString(R.string.error), getString(R.string.no_activities_for_url), (Activity) context).show(); + new ErrorDialog(getString(R.string.error), getString(R.string.no_activities_for_url), (FragmentActivity) context).show(); } } } diff --git a/cSploit/src/org/csploit/android/plugins/Sessions.java b/cSploit/src/main/java/org/csploit/android/plugins/Sessions.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/Sessions.java rename to cSploit/src/main/java/org/csploit/android/plugins/Sessions.java diff --git a/cSploit/src/org/csploit/android/plugins/Traceroute.java b/cSploit/src/main/java/org/csploit/android/plugins/Traceroute.java similarity index 98% rename from cSploit/src/org/csploit/android/plugins/Traceroute.java rename to cSploit/src/main/java/org/csploit/android/plugins/Traceroute.java index a790a7f17e..f48878f8a4 100644 --- a/cSploit/src/org/csploit/android/plugins/Traceroute.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/Traceroute.java @@ -20,8 +20,8 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.content.ContextCompat; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import androidx.core.content.ContextCompat; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; diff --git a/cSploit/src/org/csploit/android/plugins/mitm/DNSSpoofing.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/DNSSpoofing.java similarity index 99% rename from cSploit/src/org/csploit/android/plugins/mitm/DNSSpoofing.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/DNSSpoofing.java index cf0fc832cf..ac6ffb84f1 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/DNSSpoofing.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/DNSSpoofing.java @@ -20,7 +20,7 @@ import android.content.SharedPreferences; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.MenuItem; import android.view.View; import android.widget.Button; diff --git a/cSploit/src/org/csploit/android/plugins/mitm/MITM.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java similarity index 94% rename from cSploit/src/org/csploit/android/plugins/mitm/MITM.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java index 8497d3cd26..5381b35959 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/MITM.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java @@ -42,6 +42,7 @@ import org.csploit.android.R; import org.csploit.android.SettingsActivity; +import org.csploit.android.SettingsFragment; import org.csploit.android.core.Child; import org.csploit.android.core.ChildManager; import org.csploit.android.core.Logger; @@ -95,16 +96,22 @@ static class Action{ public String name; public String description; public OnClickListener listener; + public ActionEnabler enabler; - public Action(String name, String description, int resourceId, OnClickListener listener){ + public Action(String name, String description, int resourceId, OnClickListener listener, ActionEnabler enabler){ this.resourceId = resourceId; this.name = name; this.description = description; this.listener = listener; + this.enabler = enabler; } public Action(String name, String description, OnClickListener listener){ - this(name, description, R.drawable.action_plugin, listener); + this(name, description, R.drawable.action_plugin, listener, null); + } + + public interface ActionEnabler { + boolean isEnabled(); } } @@ -138,11 +145,11 @@ public View getView(int position, View convertView, ViewGroup parent){ if (getSharedPreferences("THEME", 0).getBoolean("isDark", false)) row.setBackgroundResource(R.drawable.card_background_dark); holder = new ActionHolder(); - holder.icon = (ImageView) (row != null ? row.findViewById(R.id.actionIcon) : null); - holder.name = (TextView) (row != null ? row.findViewById(R.id.itemName) : null); - holder.description = (TextView) (row != null ? row.findViewById(R.id.itemDescription) : null); - holder.activity = (ProgressBar) (row != null ? row.findViewById(R.id.itemActivity) : null); - if(row != null) row.setTag(holder); + holder.icon = (ImageView) row.findViewById(R.id.actionIcon); + holder.name = (TextView) row.findViewById(R.id.itemName); + holder.description = (TextView) row.findViewById(R.id.itemDescription); + holder.activity = (ProgressBar) row.findViewById(R.id.itemActivity); + row.setTag(holder); } else holder = (ActionHolder) row.getTag(); @@ -152,7 +159,8 @@ public View getView(int position, View convertView, ViewGroup parent){ holder.name.setText(action.name); holder.description.setText(action.description); - if(row != null) row.setOnClickListener(action.listener); + row.setOnClickListener(action.listener); + row.setEnabled(action.enabler == null || action.enabler.isEnabled()); return row; } @@ -302,7 +310,7 @@ public void onError(String error, int resId){ new ErrorDialog(getString(R.string.error), getString(R.string.unexpected_file_error) + e.getMessage(), MITM.this).show(); } } - } else if(request == SettingsActivity.SETTINGS_DONE){ + } else if(request == SettingsFragment.SETTINGS_DONE){ new CheckForOpenPortsTask().execute(); } } @@ -336,7 +344,7 @@ protected void onPostExecute(Boolean result){ new ConfirmDialog( getString(R.string.warning), mMessage, MITM.this, new ConfirmDialogListener(){ @Override public void onConfirm(){ - startActivityForResult(new Intent(MITM.this, SettingsActivity.class), SettingsActivity.SETTINGS_DONE); + startActivityForResult(new Intent(MITM.this, SettingsActivity.class), SettingsFragment.SETTINGS_DONE); } @Override @@ -442,7 +450,7 @@ public void onClick(View v) { ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action ( @@ -452,7 +460,7 @@ public void onClick(View v) { new OnClickListener(){ @Override public void onClick(View v){ - if(System.checkNetworking(MITM.this) == false) + if(!System.checkNetworking(MITM.this)) return; setStoppedState(); @@ -467,7 +475,7 @@ public void onClick(View v){ ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action @@ -478,7 +486,7 @@ public void onClick(View v){ new OnClickListener() { @Override public void onClick(View v) { - if (System.checkNetworking(MITM.this) == false) + if (!System.checkNetworking(MITM.this)) return; setStoppedState(); @@ -493,7 +501,7 @@ public void onClick(View v) { ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action ( @@ -503,7 +511,7 @@ public void onClick(View v) { new OnClickListener(){ @Override public void onClick(View v){ - if(System.checkNetworking(MITM.this) == false) + if (!System.checkNetworking(MITM.this)) return; setStoppedState(); @@ -518,7 +526,7 @@ public void onClick(View v){ ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action ( @@ -528,19 +536,21 @@ public void onClick(View v){ new OnClickListener(){ @Override public void onClick(View v){ - if(System.checkNetworking(MITM.this) == false) + if (!System.checkNetworking(MITM.this)) return; final ProgressBar activity = (ProgressBar) v.findViewById(R.id.itemActivity); if(activity.getVisibility() == View.INVISIBLE){ - if(System.getCurrentTarget().getType() != Target.Type.ENDPOINT) + if (System.getCurrentTarget().getType() != Target.Type.ENDPOINT) { new ErrorDialog(getString(R.string.error), getString(R.string.mitm_connection_kill_error), MITM.this).show(); - - else{ + } else if(!System.getNetwork().haveGateway() && !System.getNetwork().isTetheringEnabled()) { + new ErrorDialog(getString(R.string.error), "Connection killer requires a gateway or active Tethering", MITM.this).show(); + } else { setStoppedState(); try { + if(System.getNetwork().haveGateway()) { mConnectionKillerProcess = System.getTools().arpSpoof.spoof(System.getCurrentTarget(), new ArpSpoof.ArpSpoofReceiver() { @Override @@ -560,6 +570,10 @@ public void run() { }); } }); + } else { + mConnectionKillerProcess = null; + System.setForwarding(false); + } activity.setVisibility(View.VISIBLE); @@ -575,10 +589,19 @@ public void run() { mConnectionKillerProcess = null; } + if(!System.getNetwork().haveGateway() && System.getNetwork().isTetheringEnabled()) { + System.setForwarding(true); + } + activity.setVisibility(View.INVISIBLE); } } - })); + }, new Action.ActionEnabler() { + @Override + public boolean isEnabled() { + return System.getNetwork().haveGateway() || System.getNetwork().isTetheringEnabled(); + } + })); mActions.add(new Action ( @@ -643,7 +666,7 @@ public void onError(String error, int resId){ } else setStoppedState(); } - })); + }, null)); mActions.add(new Action ( @@ -745,7 +768,7 @@ public void onError(String error, int resId){ setStoppedState(); } } - })); + }, null)); mActions.add(new Action ( @@ -825,7 +848,7 @@ public void onError(String error, int resId){ } else setStoppedState(); } - })); + }, null)); mActions.add(new Action ( @@ -835,7 +858,7 @@ public void onError(String error, int resId){ new OnClickListener(){ @Override public void onClick(View v){ - if(System.checkNetworking(MITM.this) == false) + if(!System.checkNetworking(MITM.this)) return; final ProgressBar activity = (ProgressBar) v.findViewById(R.id.itemActivity); @@ -912,7 +935,7 @@ public void onError(String error, int resId){ setStoppedState(); } } - })); + }, null)); mActions.add(new Action ( @@ -921,7 +944,7 @@ public void onError(String error, int resId){ new OnClickListener(){ @Override public void onClick(View v){ - if(System.checkNetworking(MITM.this) == false) + if(!System.checkNetworking(MITM.this)) return; final ProgressBar activity = (ProgressBar) v.findViewById(R.id.itemActivity); diff --git a/cSploit/src/org/csploit/android/plugins/mitm/PasswordSniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/PasswordSniffer.java similarity index 99% rename from cSploit/src/org/csploit/android/plugins/mitm/PasswordSniffer.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/PasswordSniffer.java index 7fc5552553..31ca6563f9 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/PasswordSniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/PasswordSniffer.java @@ -23,7 +23,7 @@ import android.content.SharedPreferences; import android.graphics.Typeface; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; diff --git a/cSploit/src/org/csploit/android/plugins/mitm/Sniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java similarity index 78% rename from cSploit/src/org/csploit/android/plugins/mitm/Sniffer.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java index 0a3ab1f76b..e3087af77e 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/Sniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java @@ -22,7 +22,8 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import android.os.FileObserver; +import androidx.appcompat.app.AppCompatActivity; import android.text.Html; import android.view.LayoutInflater; import android.view.MenuItem; @@ -38,6 +39,7 @@ import android.widget.Toast; import android.widget.ToggleButton; +import org.apache.commons.compress.utils.IOUtils; import org.csploit.android.ActionActivity; import org.csploit.android.R; import org.csploit.android.core.Child; @@ -49,7 +51,7 @@ import org.csploit.android.plugins.mitm.SpoofSession.OnSessionReadyListener; import org.csploit.android.tools.TcpDump; -import java.io.File; +import java.io.*; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; @@ -79,6 +81,7 @@ public class Sniffer extends AppCompatActivity implements AdapterView.OnItemClic private boolean mDumpToFile = false; private String mPcapFileName = null; private Child mTcpdumpProcess = null; + private FileObserver mFileActivity = null; public class AddressStats implements Comparable{ public String mAddress = ""; @@ -334,7 +337,7 @@ public void onClick(View v){ @Override public void onConfirm(){ mDumpToFile = true; - mPcapFileName = (new File(System.getStoragePath(), "csploit-sniff-" + java.lang.System.currentTimeMillis() + ".pcap")).getAbsolutePath(); + mPcapFileName = (new File(Sniffer.this.getCacheDir(), "csploit-sniff-" + java.lang.System.currentTimeMillis() + ".pcap")).getAbsolutePath(); } @Override @@ -397,11 +400,38 @@ public boolean onOptionsItemSelected(MenuItem item){ } } + private void movePcapFileFromCacheToStorage() { + File inputFile = new File(mPcapFileName); + InputStream in = null; + OutputStream out = null; + + try { + in = new FileInputStream(inputFile); + out = new FileOutputStream(new File(System.getStoragePath(),new File(mPcapFileName).getName())); + IOUtils.copy(in, out); + } catch (IOException e) { + System.errorLogging(e); + } finally { + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(out); + inputFile.delete(); + } + } + private void setStoppedState(){ if(mTcpdumpProcess != null) { mTcpdumpProcess.kill(); mTcpdumpProcess = null; } + + if(mDumpToFile) { + if (mFileActivity != null) { + mFileActivity.stopWatching(); + mFileActivity = null; + movePcapFileFromCacheToStorage(); + } + } + Sniffer.this.runOnUiThread(new Runnable() { @Override public void run() { @@ -415,6 +445,44 @@ public void run() { }); } + private void addNewTarget (final AddressStats stats){ + Sniffer.this.runOnUiThread(new Runnable() { + @Override + public void run() { + mAdapter.addStats(stats); + mAdapter.notifyDataSetChanged(); + } + }); + } + + private void updateStats (final AddressStats stats, final long len){ + Sniffer.this.runOnUiThread(new Runnable() { + @Override + public void run() { + long deltat; + stats.mBytes += len; + + deltat = (java.lang.System.currentTimeMillis() - stats.mSampledTime); + + if (deltat >= mSampleTime) { + stats.mBandwidth = (stats.mBytes - stats.mSampledBytes) / deltat; + stats.mSampledTime = java.lang.System.currentTimeMillis(); + stats.mSampledBytes = stats.mBytes; + } + mAdapter.notifyDataSetChanged(); + } + }); + } + + private void showMessage (final String text){ + Sniffer.this.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(Sniffer.this, text, Toast.LENGTH_LONG).show(); + } + }); + } + private void setSpoofErrorState(final String error){ Sniffer.this.runOnUiThread(new Runnable(){ @Override @@ -425,10 +493,59 @@ public void run(){ }); } + /** + * Monitor a pcap file for changes, in order to let the user know that the capture is running. + */ + private void startMonitoringPcapFile(){ + final String str_address = (System.getCurrentTarget().getType() == Target.Type.NETWORK) ? System.getCurrentTarget().getDisplayAddress().split("/")[0] : System.getCurrentTarget().getDisplayAddress(); + + final File pcapfile = new File(mPcapFileName); + try{ + pcapfile.createNewFile(); + }catch(IOException io) + { + Toast.makeText(this, "File not created: " + io.getLocalizedMessage(), Toast.LENGTH_LONG).show(); + return; + } + + mFileActivity = new FileObserver(mPcapFileName) { + @Override + public void onEvent(int event, String s) { + switch (event){ + case FileObserver.CLOSE_WRITE: + showMessage(getString(R.string.saved) + ":\n" + mPcapFileName); + break; + case FileObserver.MODIFY: + + AddressStats stats = mAdapter.getStats(str_address); + updateStats(stats, pcapfile.length()); + break; + case FileObserver.OPEN: + showMessage(getString(R.string.dumping_traffic_to) + mPcapFileName); + break; + default: + break; + } + } + }; + final AddressStats stats = new AddressStats(str_address); + stats.mBytes = 0; + stats.mSampledTime = java.lang.System.currentTimeMillis(); + addNewTarget(stats); + // android docs: The monitored file or directory must exist at this time,or else no events will be reported + mFileActivity.startWatching(); + } + private void setStartedState(){ + if (mRunning) + setStoppedState(); - if(mDumpToFile) - Toast.makeText(Sniffer.this, getString(R.string.dumping_traffic_to) + mPcapFileName, Toast.LENGTH_SHORT).show(); + if(mDumpToFile) { + mSampleTime = 100; + startMonitoringPcapFile(); + } + else + mSampleTime = 1000; try { mSpoofSession.start(new OnSessionReadyListener(){ @@ -453,7 +570,6 @@ public void onSessionReady(){ @Override public void onPacket(InetAddress src, InetAddress dst, int len) { long now = java.lang.System.currentTimeMillis(); - long deltat; AddressStats stats = null; String stringAddress = null; @@ -472,25 +588,11 @@ public void onPacket(InetAddress src, InetAddress dst, int len) { stats.mBytes = len; stats.mSampledTime = now; } else { - stats.mBytes += len; - - deltat = (now - stats.mSampledTime); - - if (deltat >= mSampleTime) { - stats.mBandwidth = (stats.mBytes - stats.mSampledBytes) / deltat; - stats.mSampledTime = java.lang.System.currentTimeMillis(); - stats.mSampledBytes = stats.mBytes; - } + updateStats(stats, len); } final AddressStats fstats = stats; - Sniffer.this.runOnUiThread(new Runnable() { - @Override - public void run() { - mAdapter.addStats(fstats); - mAdapter.notifyDataSetChanged(); - } - }); + addNewTarget(fstats); } }); } catch( ChildManager.ChildNotStartedException e ) { diff --git a/cSploit/src/org/csploit/android/plugins/mitm/SpoofSession.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/SpoofSession.java similarity index 82% rename from cSploit/src/org/csploit/android/plugins/mitm/SpoofSession.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/SpoofSession.java index ea18565fad..b78fda6e4f 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/SpoofSession.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/SpoofSession.java @@ -89,12 +89,16 @@ public void start(Target target, final OnSessionReadyListener listener) throws C } } - mArpSpoofProcess = System.getTools().arpSpoof.spoof(target, new ArpSpoof.ArpSpoofReceiver() { - @Override - public void onError(String line) { - listener.onError(line, 0); - } - }); + if(System.getNetwork().haveGateway()) { + mArpSpoofProcess = System.getTools().arpSpoof.spoof(target, new ArpSpoof.ArpSpoofReceiver() { + @Override + public void onError(String line) { + listener.onError(line, 0); + } + }); + } else { + mArpSpoofProcess = null; + } System.setForwarding(true); @@ -112,13 +116,17 @@ public void start(final Target target, final OnAccountListener listener) throws this.stop(); - mArpSpoofProcess = - System.getTools().arpSpoof.spoof(target, new ArpSpoof.ArpSpoofReceiver() { - @Override - public void onError(String line) { - SpoofSession.this.stop(); - } - }); + if(System.getNetwork().haveGateway()) { + mArpSpoofProcess = + System.getTools().arpSpoof.spoof(target, new ArpSpoof.ArpSpoofReceiver() { + @Override + public void onError(String line) { + SpoofSession.this.stop(); + } + }); + } else { + mArpSpoofProcess = null; + } //System.setForwarding(true); @@ -133,15 +141,18 @@ public void onError(String line) { public void start(final OnDNSSpoofedReceiver listener) throws ChildManager.ChildNotStartedException { - mArpSpoofProcess = - System.getTools().arpSpoof.spoof(System.getCurrentTarget(), new ArpSpoof.ArpSpoofReceiver() { - @Override - public void onError(String line) { - SpoofSession.this.stop(); - listener.onError(line); - } - }); - + if(System.getNetwork().haveGateway()) { + mArpSpoofProcess = + System.getTools().arpSpoof.spoof(System.getCurrentTarget(), new ArpSpoof.ArpSpoofReceiver() { + @Override + public void onError(String line) { + SpoofSession.this.stop(); + listener.onError(line); + } + }); + } else { + mArpSpoofProcess = null; + } try { mEttercapProcess = System.getTools().ettercap.dnsSpoof(System.getCurrentTarget(), listener); diff --git a/cSploit/src/org/csploit/android/plugins/mitm/hijacker/Hijacker.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java similarity index 98% rename from cSploit/src/org/csploit/android/plugins/mitm/hijacker/Hijacker.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java index 26f24cc2ef..f175174440 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/hijacker/Hijacker.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java @@ -26,7 +26,7 @@ import android.graphics.Canvas; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -148,15 +148,15 @@ private String getUserName(String uri) { InputStream input = conn.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(input)); - String line, data = ""; - + String line; + final StringBuilder dataBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) - data += line; + dataBuilder.append(line); reader.close(); input.close(); - JSONObject response = new JSONObject(data); + JSONObject response = new JSONObject(dataBuilder.toString()); username = response.getString("name"); } catch (Exception e) { diff --git a/cSploit/src/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java similarity index 99% rename from cSploit/src/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java index 863b9da859..04188dbb7a 100644 --- a/cSploit/src/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java @@ -22,7 +22,7 @@ import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.util.Patterns; import android.view.KeyEvent; import android.view.Menu; diff --git a/cSploit/src/org/csploit/android/plugins/mitm/hijacker/Session.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Session.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/mitm/hijacker/Session.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Session.java diff --git a/cSploit/src/org/csploit/android/services/MenuControllableService.java b/cSploit/src/main/java/org/csploit/android/services/MenuControllableService.java similarity index 100% rename from cSploit/src/org/csploit/android/services/MenuControllableService.java rename to cSploit/src/main/java/org/csploit/android/services/MenuControllableService.java diff --git a/cSploit/src/org/csploit/android/services/MsfRpcdService.java b/cSploit/src/main/java/org/csploit/android/services/MsfRpcdService.java similarity index 100% rename from cSploit/src/org/csploit/android/services/MsfRpcdService.java rename to cSploit/src/main/java/org/csploit/android/services/MsfRpcdService.java diff --git a/cSploit/src/org/csploit/android/services/NativeService.java b/cSploit/src/main/java/org/csploit/android/services/NativeService.java similarity index 100% rename from cSploit/src/org/csploit/android/services/NativeService.java rename to cSploit/src/main/java/org/csploit/android/services/NativeService.java diff --git a/cSploit/src/org/csploit/android/services/NetworkRadar.java b/cSploit/src/main/java/org/csploit/android/services/NetworkRadar.java similarity index 100% rename from cSploit/src/org/csploit/android/services/NetworkRadar.java rename to cSploit/src/main/java/org/csploit/android/services/NetworkRadar.java diff --git a/cSploit/src/org/csploit/android/services/Service.java b/cSploit/src/main/java/org/csploit/android/services/Service.java similarity index 100% rename from cSploit/src/org/csploit/android/services/Service.java rename to cSploit/src/main/java/org/csploit/android/services/Service.java diff --git a/cSploit/src/org/csploit/android/services/Services.java b/cSploit/src/main/java/org/csploit/android/services/Services.java similarity index 100% rename from cSploit/src/org/csploit/android/services/Services.java rename to cSploit/src/main/java/org/csploit/android/services/Services.java diff --git a/cSploit/src/org/csploit/android/services/UpdateChecker.java b/cSploit/src/main/java/org/csploit/android/services/UpdateChecker.java similarity index 100% rename from cSploit/src/org/csploit/android/services/UpdateChecker.java rename to cSploit/src/main/java/org/csploit/android/services/UpdateChecker.java diff --git a/cSploit/src/org/csploit/android/services/UpdateService.java b/cSploit/src/main/java/org/csploit/android/services/UpdateService.java similarity index 94% rename from cSploit/src/org/csploit/android/services/UpdateService.java rename to cSploit/src/main/java/org/csploit/android/services/UpdateService.java index 1a24cd2e22..2a6afbec62 100644 --- a/cSploit/src/org/csploit/android/services/UpdateService.java +++ b/cSploit/src/main/java/org/csploit/android/services/UpdateService.java @@ -25,7 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.support.v4.app.NotificationCompat; +import androidx.core.app.NotificationCompat; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveInputStream; @@ -243,7 +243,7 @@ private void setupNotification() { // get notification manager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // get notification builder - mBuilder = new NotificationCompat.Builder(this); + mBuilder = new NotificationCompat.Builder(this, getBaseContext().getString(R.string.csploitChannelId)); // create a broadcast receiver to get actions // performed on the notification by the user mReceiver = new BroadcastReceiver() { @@ -283,7 +283,8 @@ private void finishNotification() { } else { Logger.debug("assign '"+contentIntent.toString()+"' to notification"); if(mBuilder!=null&&mNotificationManager!=null) { - mBuilder.setContentIntent(PendingIntent.getActivity(this, DOWNLOAD_COMPLETE_CODE, contentIntent, 0)); + mBuilder.setContentIntent(PendingIntent.getActivity(this, DOWNLOAD_COMPLETE_CODE, contentIntent, 0)) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } } @@ -342,7 +343,8 @@ private void verifyArchiveIntegrity() throws RuntimeException, KeyException { .setSmallIcon(android.R.drawable.ic_popup_sync) .setContentText("") .setContentInfo("") - .setProgress(100, 0, true); + .setProgress(100, 0, true) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID,mBuilder.build()); f = new File(mCurrentTask.path); @@ -385,7 +387,8 @@ private void verifyArchiveIntegrity() throws RuntimeException, KeyException { percentage = (short) (((double) counter.getBytesRead() / total) * 100); if (percentage != old_percentage) { mBuilder.setProgress(100, percentage, false) - .setContentInfo(percentage + "%"); + .setContentInfo(percentage + "%") + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); old_percentage = percentage; } @@ -455,7 +458,8 @@ private boolean haveLocalFile() throws CancellationException, SecurityException, mBuilder.setContentTitle(getString(R.string.checking)) .setSmallIcon(android.R.drawable.ic_popup_sync) .setContentText("") - .setProgress(100, 0, false); + .setProgress(100, 0, false) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID,mBuilder.build()); md5 = (mCurrentTask.md5!=null ? MessageDigest.getInstance("MD5") : null); @@ -473,7 +477,8 @@ private boolean haveLocalFile() throws CancellationException, SecurityException, percentage = (short) (((double) read_counter / total) * 100); if (percentage != previous_percentage) { mBuilder.setProgress(100, percentage, false) - .setContentInfo(percentage + "%"); + .setContentInfo(percentage + "%") + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); previous_percentage = percentage; } @@ -542,7 +547,8 @@ private void downloadFile() throws SecurityException, KeyException, IOException, mBuilder.setContentTitle(getString(R.string.downloading_update)) .setContentText(getString(R.string.connecting)) .setSmallIcon(android.R.drawable.stat_sys_download) - .setProgress(100, 0, true); + .setProgress(100, 0, true) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID,mBuilder.build()); md5 = (mCurrentTask.md5!=null ? MessageDigest.getInstance("MD5") : null); @@ -573,7 +579,8 @@ private void downloadFile() throws SecurityException, KeyException, IOException, downloaded=0; previous_percentage=-1; - mBuilder.setContentText(file.getName()); + mBuilder.setContentText(file.getName()) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); Logger.info(String.format("downloading '%s' to '%s'", mCurrentTask.url, mCurrentTask.path)); @@ -592,7 +599,8 @@ private void downloadFile() throws SecurityException, KeyException, IOException, if (percentage != previous_percentage) { mBuilder.setProgress(100, percentage, false) - .setContentInfo(percentage + "%"); + .setContentInfo(percentage + "%") + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); previous_percentage = percentage; } @@ -663,7 +671,8 @@ private void extract() throws RuntimeException, IOException, InterruptedExceptio .setContentText("") .setContentInfo("") .setSmallIcon(android.R.drawable.ic_popup_sync) - .setProgress(100, 0, false); + .setProgress(100, 0, false) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID,mBuilder.build()); Logger.info(String.format("extracting '%s' to '%s'", mCurrentTask.path, mCurrentTask.outputDir)); @@ -782,7 +791,8 @@ else if(entry.isDirectory()) percentage = (short) (((double) counter.getBytesRead() / total) * 100); if (percentage != old_percentage) { mBuilder.setProgress(100, percentage, false) - .setContentInfo(percentage + "%"); + .setContentInfo(percentage + "%") + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); old_percentage = percentage; } @@ -823,7 +833,8 @@ else if(entry.isDirectory()) Logger.info(".nomedia created"); mBuilder.setContentInfo("") - .setProgress(100, 100, true); + .setProgress(100, 100, true) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); } finally { if(is != null) @@ -843,7 +854,8 @@ private void installGems() throws RuntimeException, IOException, InterruptedExce .setContentText(getString(R.string.installing_bundle)) .setContentInfo("") .setSmallIcon(android.R.drawable.stat_sys_download) - .setProgress(100, 0, true); + .setProgress(100, 0, true) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); Child bundleInstallTask; @@ -855,7 +867,8 @@ private void installGems() throws RuntimeException, IOException, InterruptedExce bundleInstallTask = System.getTools().ruby.async("gem install bundle", mErrorReceiver); } - mBuilder.setContentText(getString(R.string.installing_msf_gems)); + mBuilder.setContentText(getString(R.string.installing_msf_gems)) + .setChannelId(getBaseContext().getString(R.string.csploitChannelId)); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); // remove cache version file diff --git a/cSploit/src/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java b/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java similarity index 79% rename from cSploit/src/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java rename to cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java index d832e90f62..3c353ef377 100644 --- a/cSploit/src/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java +++ b/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java @@ -6,9 +6,10 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; -import android.support.design.widget.Snackbar; -import android.support.v4.app.NotificationCompat; -import android.support.v4.content.ContextCompat; +import com.google.android.material.snackbar.Snackbar; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AppCompatActivity; import org.csploit.android.R; import org.csploit.android.core.ManagedReceiver; @@ -20,7 +21,7 @@ */ public class MsfRpcdServiceReceiver extends ManagedReceiver { - final int MSF_NOTIFICATION = 1337; + final static int MSF_NOTIFICATION = 1337; private final IntentFilter filter; public MsfRpcdServiceReceiver() { @@ -63,18 +64,19 @@ public void run() { private void showToastForStatus(Context context, MsfRpcdService.Status status) { Snackbar - .make(((Activity) context).findViewById(android.R.id.content), status.getText(), status.isError() ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT) + .make(((AppCompatActivity) context).findViewById(android.R.id.content), status.getText(), status.isError() ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT) .show(); } private void updateNotificationForStatus(Context context, MsfRpcdService.Status status) { NotificationCompat.Builder mBuilder = - new NotificationCompat.Builder(context) + new NotificationCompat.Builder(context, context.getString(R.string.csploitChannelId)) .setSmallIcon(R.drawable.exploit_msf) .setContentTitle(context.getString(R.string.msf_status)) .setProgress(0, 0, status.inProgress()) .setContentText(context.getString(status.getText())) - .setColor(ContextCompat.getColor(context, status.getColor())); + .setColor(ContextCompat.getColor(context, status.getColor())) + .setChannelId(context.getString(R.string.csploitChannelId)); NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/cSploit/src/org/csploit/android/services/receivers/NetworkRadarReceiver.java b/cSploit/src/main/java/org/csploit/android/services/receivers/NetworkRadarReceiver.java similarity index 100% rename from cSploit/src/org/csploit/android/services/receivers/NetworkRadarReceiver.java rename to cSploit/src/main/java/org/csploit/android/services/receivers/NetworkRadarReceiver.java diff --git a/cSploit/src/org/csploit/android/tools/ArpSpoof.java b/cSploit/src/main/java/org/csploit/android/tools/ArpSpoof.java similarity index 85% rename from cSploit/src/org/csploit/android/tools/ArpSpoof.java rename to cSploit/src/main/java/org/csploit/android/tools/ArpSpoof.java index 5ee8e7e5c1..5b7d085961 100644 --- a/cSploit/src/org/csploit/android/tools/ArpSpoof.java +++ b/cSploit/src/main/java/org/csploit/android/tools/ArpSpoof.java @@ -55,13 +55,15 @@ public Child spoof(Target target, ArpSpoofReceiver receiver) throws ChildManager String commandLine = ""; try{ + String gw = System.getNetwork().getGatewayAddress().getHostAddress(); + String iface = System.getNetwork().getInterface().getDisplayName(); + if(target.getType() == Type.NETWORK) - commandLine = "-i " + System.getNetwork().getInterface().getDisplayName() + " " + System.getGatewayAddress(); + commandLine = "-i " + iface + " " + gw; else - commandLine = "-i " + System.getNetwork().getInterface().getDisplayName() + " -t " + target.getCommandLineRepresentation() + " " + System.getGatewayAddress(); - } - catch(Exception e){ + commandLine = "-i " + iface + " -t " + target.getCommandLineRepresentation() + " " + gw; + } catch(Exception e) { System.errorLogging(e); } diff --git a/cSploit/src/org/csploit/android/tools/Ettercap.java b/cSploit/src/main/java/org/csploit/android/tools/Ettercap.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Ettercap.java rename to cSploit/src/main/java/org/csploit/android/tools/Ettercap.java diff --git a/cSploit/src/org/csploit/android/tools/Fusemounts.java b/cSploit/src/main/java/org/csploit/android/tools/Fusemounts.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Fusemounts.java rename to cSploit/src/main/java/org/csploit/android/tools/Fusemounts.java diff --git a/cSploit/src/org/csploit/android/tools/Hydra.java b/cSploit/src/main/java/org/csploit/android/tools/Hydra.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Hydra.java rename to cSploit/src/main/java/org/csploit/android/tools/Hydra.java diff --git a/cSploit/src/org/csploit/android/tools/IPTables.java b/cSploit/src/main/java/org/csploit/android/tools/IPTables.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/IPTables.java rename to cSploit/src/main/java/org/csploit/android/tools/IPTables.java diff --git a/cSploit/src/main/java/org/csploit/android/tools/Ip.java b/cSploit/src/main/java/org/csploit/android/tools/Ip.java new file mode 100644 index 0000000000..938d03bbef --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/tools/Ip.java @@ -0,0 +1,27 @@ +package org.csploit.android.tools; + +import org.csploit.android.core.Child; +import org.csploit.android.core.ChildManager; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Ip extends Raw { + private static final Pattern defaultRoutePattern = Pattern.compile("^default\\s+via\\s+([^ \t]+)\\s", Pattern.CASE_INSENSITIVE); + + public abstract static class GatewayReceiver extends RawReceiver { + @Override + public void onNewLine(String line) { + Matcher matcher = defaultRoutePattern.matcher(line); + if(matcher.find()) { + onGatewayFound(matcher.group(1)); + } + } + + public abstract void onGatewayFound(String gateway); + } + + public Child getGatewayForIface(String iface, GatewayReceiver receiver) throws ChildManager.ChildNotStartedException { + return super.async("ip route show table " + iface, receiver); + } +} diff --git a/cSploit/src/org/csploit/android/tools/Logcat.java b/cSploit/src/main/java/org/csploit/android/tools/Logcat.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Logcat.java rename to cSploit/src/main/java/org/csploit/android/tools/Logcat.java diff --git a/cSploit/src/org/csploit/android/tools/Msf.java b/cSploit/src/main/java/org/csploit/android/tools/Msf.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Msf.java rename to cSploit/src/main/java/org/csploit/android/tools/Msf.java diff --git a/cSploit/src/org/csploit/android/tools/MsfRpcd.java b/cSploit/src/main/java/org/csploit/android/tools/MsfRpcd.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/MsfRpcd.java rename to cSploit/src/main/java/org/csploit/android/tools/MsfRpcd.java diff --git a/cSploit/src/org/csploit/android/tools/NMap.java b/cSploit/src/main/java/org/csploit/android/tools/NMap.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/NMap.java rename to cSploit/src/main/java/org/csploit/android/tools/NMap.java diff --git a/cSploit/src/org/csploit/android/tools/NetworkRadar.java b/cSploit/src/main/java/org/csploit/android/tools/NetworkRadar.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/NetworkRadar.java rename to cSploit/src/main/java/org/csploit/android/tools/NetworkRadar.java diff --git a/cSploit/src/org/csploit/android/tools/Raw.java b/cSploit/src/main/java/org/csploit/android/tools/Raw.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Raw.java rename to cSploit/src/main/java/org/csploit/android/tools/Raw.java diff --git a/cSploit/src/org/csploit/android/tools/Ruby.java b/cSploit/src/main/java/org/csploit/android/tools/Ruby.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Ruby.java rename to cSploit/src/main/java/org/csploit/android/tools/Ruby.java diff --git a/cSploit/src/org/csploit/android/tools/Shell.java b/cSploit/src/main/java/org/csploit/android/tools/Shell.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Shell.java rename to cSploit/src/main/java/org/csploit/android/tools/Shell.java diff --git a/cSploit/src/org/csploit/android/tools/TcpDump.java b/cSploit/src/main/java/org/csploit/android/tools/TcpDump.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/TcpDump.java rename to cSploit/src/main/java/org/csploit/android/tools/TcpDump.java diff --git a/cSploit/src/org/csploit/android/tools/Tool.java b/cSploit/src/main/java/org/csploit/android/tools/Tool.java similarity index 100% rename from cSploit/src/org/csploit/android/tools/Tool.java rename to cSploit/src/main/java/org/csploit/android/tools/Tool.java diff --git a/cSploit/src/org/csploit/android/tools/ToolBox.java b/cSploit/src/main/java/org/csploit/android/tools/ToolBox.java similarity index 97% rename from cSploit/src/org/csploit/android/tools/ToolBox.java rename to cSploit/src/main/java/org/csploit/android/tools/ToolBox.java index 0eee68a92b..6548c77660 100644 --- a/cSploit/src/org/csploit/android/tools/ToolBox.java +++ b/cSploit/src/main/java/org/csploit/android/tools/ToolBox.java @@ -36,6 +36,7 @@ public class ToolBox { public final NetworkRadar networkRadar; public final MsfRpcd msfrpcd; public final Logcat logcat; + public final Ip ip; public ToolBox() { raw = new Raw(); @@ -52,6 +53,7 @@ public ToolBox() { networkRadar = new NetworkRadar(); msfrpcd = new MsfRpcd(); logcat = new Logcat(); + ip = new Ip(); } public void reload() { @@ -66,6 +68,7 @@ public void reload() { tcpDump.setEnabled(); networkRadar.setEnabled(); logcat.setEnabled(); + ip.setEnabled(); ruby.init(); msf.init(); diff --git a/cSploit/src/org/csploit/android/update/ApkUpdate.java b/cSploit/src/main/java/org/csploit/android/update/ApkUpdate.java similarity index 100% rename from cSploit/src/org/csploit/android/update/ApkUpdate.java rename to cSploit/src/main/java/org/csploit/android/update/ApkUpdate.java diff --git a/cSploit/src/org/csploit/android/update/CoreUpdate.java b/cSploit/src/main/java/org/csploit/android/update/CoreUpdate.java similarity index 100% rename from cSploit/src/org/csploit/android/update/CoreUpdate.java rename to cSploit/src/main/java/org/csploit/android/update/CoreUpdate.java diff --git a/cSploit/src/org/csploit/android/update/MsfUpdate.java b/cSploit/src/main/java/org/csploit/android/update/MsfUpdate.java similarity index 100% rename from cSploit/src/org/csploit/android/update/MsfUpdate.java rename to cSploit/src/main/java/org/csploit/android/update/MsfUpdate.java diff --git a/cSploit/src/org/csploit/android/update/RubyUpdate.java b/cSploit/src/main/java/org/csploit/android/update/RubyUpdate.java similarity index 100% rename from cSploit/src/org/csploit/android/update/RubyUpdate.java rename to cSploit/src/main/java/org/csploit/android/update/RubyUpdate.java diff --git a/cSploit/src/org/csploit/android/update/Update.java b/cSploit/src/main/java/org/csploit/android/update/Update.java similarity index 100% rename from cSploit/src/org/csploit/android/update/Update.java rename to cSploit/src/main/java/org/csploit/android/update/Update.java diff --git a/cSploit/src/org/csploit/android/wifi/Keygen.java b/cSploit/src/main/java/org/csploit/android/wifi/Keygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/Keygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/Keygen.java diff --git a/cSploit/src/org/csploit/android/wifi/NetworkManager.java b/cSploit/src/main/java/org/csploit/android/wifi/NetworkManager.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/NetworkManager.java rename to cSploit/src/main/java/org/csploit/android/wifi/NetworkManager.java diff --git a/cSploit/src/org/csploit/android/wifi/WirelessMatcher.java b/cSploit/src/main/java/org/csploit/android/wifi/WirelessMatcher.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/WirelessMatcher.java rename to cSploit/src/main/java/org/csploit/android/wifi/WirelessMatcher.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/AliceKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/AliceKeygen.java similarity index 92% rename from cSploit/src/org/csploit/android/wifi/algorithms/AliceKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/AliceKeygen.java index dd80cf5a27..9bf9c291af 100644 --- a/cSploit/src/org/csploit/android/wifi/algorithms/AliceKeygen.java +++ b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/AliceKeygen.java @@ -63,16 +63,18 @@ public List getKeys(){ setErrorMessage("This phone cannot process a SHA256 hash."); return null; } + final StringBuilder serialStrBuilder = new StringBuilder(); for(int j = 0; j < supportedAlice.size(); ++j){/*For pre AGPF 4.5.0sx*/ - String serialStr = supportedAlice.get(j).getSerial() + "X"; + serialStrBuilder.append(supportedAlice.get(j).getSerial()).append("X"); + int Q = supportedAlice.get(j).getMagic()[0]; int k = supportedAlice.get(j).getMagic()[1]; int serial = (Integer.valueOf(ssidIdentifier) - Q) / k; String tmp = Integer.toString(serial); for(int i = 0; i < 7 - tmp.length(); i++){ - serialStr += "0"; + serialStrBuilder.append("0"); } - serialStr += tmp; + serialStrBuilder.append(tmp); byte[] mac = new byte[6]; String key = ""; @@ -88,7 +90,7 @@ public List getKeys(){ md.reset(); md.update(specialSeq); try{ - md.update(serialStr.getBytes("ASCII")); + md.update(serialStrBuilder.toString().getBytes("ASCII")); } catch(UnsupportedEncodingException e){ e.printStackTrace(); } @@ -121,7 +123,7 @@ public List getKeys(){ md.reset(); md.update(specialSeq); try{ - md.update(serialStr.getBytes("ASCII")); + md.update(serialStrBuilder.toString().getBytes("ASCII")); } catch(UnsupportedEncodingException e){ e.printStackTrace(); } diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/AndaredKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/AndaredKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/AndaredKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/AndaredKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/ComtrendKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/ComtrendKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/ComtrendKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/ComtrendKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/ConnKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/ConnKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/ConnKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/ConnKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/DiscusKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/DiscusKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/DiscusKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/DiscusKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/DlinkKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/DlinkKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/DlinkKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/DlinkKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/EasyBoxKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/EasyBoxKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/EasyBoxKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/EasyBoxKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/EircomKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/EircomKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/EircomKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/EircomKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/HuaweiKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/HuaweiKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/HuaweiKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/HuaweiKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/InfostradaKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/InfostradaKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/InfostradaKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/InfostradaKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/MegaredKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/MegaredKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/MegaredKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/MegaredKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/OnoKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/OnoKeygen.java similarity index 93% rename from cSploit/src/org/csploit/android/wifi/algorithms/OnoKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/OnoKeygen.java index 91f0ca0e86..f48167837e 100644 --- a/cSploit/src/org/csploit/android/wifi/algorithms/OnoKeygen.java +++ b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/OnoKeygen.java @@ -24,6 +24,8 @@ import org.csploit.android.wifi.Keygen; +import android.text.TextUtils; + /* * The algorithm for the type of network * whose SSID must be in the form of [pP]1XXXXXX0000X @@ -91,11 +93,13 @@ public List getKeys(){ private String padto64(String val){ - if(val.equals("")) + if (TextUtils.isEmpty(val)) return ""; - String ret = ""; + + final StringBuilder retBuilder = new StringBuilder(); for(int i = 0; i < (1 + (64 / (val.length()))); ++i) - ret += val; - return ret.substring(0, 64); + retBuilder.append(val); + + return retBuilder.toString().substring(0, 64); } } diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/OteKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/OteKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/OteKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/OteKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/PBSKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/PBSKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/PBSKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/PBSKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/PirelliKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/PirelliKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/PirelliKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/PirelliKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/SkyV1Keygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/SkyV1Keygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/SkyV1Keygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/SkyV1Keygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/TecomKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/TecomKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/TecomKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/TecomKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/TelseyKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/TelseyKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/TelseyKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/TelseyKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/ThomsonKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/ThomsonKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/ThomsonKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/ThomsonKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/VerizonKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/VerizonKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/VerizonKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/VerizonKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/Wlan2Keygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/Wlan2Keygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/Wlan2Keygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/Wlan2Keygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/Wlan6Keygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/Wlan6Keygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/Wlan6Keygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/Wlan6Keygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/ZyxelKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/ZyxelKeygen.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/ZyxelKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/ZyxelKeygen.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/helpers/AliceHandle.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceHandle.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/helpers/AliceHandle.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceHandle.java diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java similarity index 94% rename from cSploit/src/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java index c6ffaf6e85..142fd7d2ca 100644 --- a/cSploit/src/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java +++ b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java @@ -21,6 +21,8 @@ import android.os.Parcel; import android.os.Parcelable; +import java.util.Arrays; + public class AliceMagicInfo implements Parcelable{ final private String alice; final private int[] magic; @@ -29,7 +31,7 @@ public class AliceMagicInfo implements Parcelable{ public AliceMagicInfo(String alice, int[] magic, String serial, String mac){ this.alice = alice; - this.magic = magic; + this.magic = Arrays.copyOf(magic, magic.length); this.serial = serial; this.mac = mac; } @@ -39,7 +41,7 @@ public String getAlice(){ } public int[] getMagic(){ - return magic; + return Arrays.copyOf(magic, magic.length); } public String getSerial(){ diff --git a/cSploit/src/org/csploit/android/wifi/algorithms/helpers/JenkinsHash.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/JenkinsHash.java similarity index 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/helpers/JenkinsHash.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/JenkinsHash.java diff --git a/cSploit/src/org/csploit/android/jniLibs/README b/cSploit/src/main/jniLibs/README similarity index 100% rename from cSploit/src/org/csploit/android/jniLibs/README rename to cSploit/src/main/jniLibs/README diff --git a/cSploit/res/anim/fadein.xml b/cSploit/src/main/res/anim/fadein.xml similarity index 100% rename from cSploit/res/anim/fadein.xml rename to cSploit/src/main/res/anim/fadein.xml diff --git a/cSploit/res/anim/fadeout.xml b/cSploit/src/main/res/anim/fadeout.xml similarity index 100% rename from cSploit/res/anim/fadeout.xml rename to cSploit/src/main/res/anim/fadeout.xml diff --git a/cSploit/res/anim/slide_in_left.xml b/cSploit/src/main/res/anim/slide_in_left.xml similarity index 100% rename from cSploit/res/anim/slide_in_left.xml rename to cSploit/src/main/res/anim/slide_in_left.xml diff --git a/cSploit/res/anim/slide_out_left.xml b/cSploit/src/main/res/anim/slide_out_left.xml similarity index 100% rename from cSploit/res/anim/slide_out_left.xml rename to cSploit/src/main/res/anim/slide_out_left.xml diff --git a/cSploit/res/drawable-hdpi/action_back.png b/cSploit/src/main/res/drawable-hdpi/action_back.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_back.png rename to cSploit/src/main/res/drawable-hdpi/action_back.png diff --git a/cSploit/res/drawable-hdpi/action_backward.png b/cSploit/src/main/res/drawable-hdpi/action_backward.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_backward.png rename to cSploit/src/main/res/drawable-hdpi/action_backward.png diff --git a/cSploit/res/drawable-hdpi/action_exploit.png b/cSploit/src/main/res/drawable-hdpi/action_exploit.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_exploit.png rename to cSploit/src/main/res/drawable-hdpi/action_exploit.png diff --git a/cSploit/res/drawable-hdpi/action_exploit_finder.png b/cSploit/src/main/res/drawable-hdpi/action_exploit_finder.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_exploit_finder.png rename to cSploit/src/main/res/drawable-hdpi/action_exploit_finder.png diff --git a/cSploit/res/drawable-hdpi/action_forge.png b/cSploit/src/main/res/drawable-hdpi/action_forge.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_forge.png rename to cSploit/src/main/res/drawable-hdpi/action_forge.png diff --git a/cSploit/res/drawable-hdpi/action_forward.png b/cSploit/src/main/res/drawable-hdpi/action_forward.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_forward.png rename to cSploit/src/main/res/drawable-hdpi/action_forward.png diff --git a/cSploit/res/drawable-hdpi/action_hijack.png b/cSploit/src/main/res/drawable-hdpi/action_hijack.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_hijack.png rename to cSploit/src/main/res/drawable-hdpi/action_hijack.png diff --git a/cSploit/res/drawable-hdpi/action_image.png b/cSploit/src/main/res/drawable-hdpi/action_image.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_image.png rename to cSploit/src/main/res/drawable-hdpi/action_image.png diff --git a/cSploit/res/drawable-hdpi/action_injection.png b/cSploit/src/main/res/drawable-hdpi/action_injection.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_injection.png rename to cSploit/src/main/res/drawable-hdpi/action_injection.png diff --git a/cSploit/res/drawable-hdpi/action_inspect.png b/cSploit/src/main/res/drawable-hdpi/action_inspect.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_inspect.png rename to cSploit/src/main/res/drawable-hdpi/action_inspect.png diff --git a/cSploit/res/drawable-hdpi/action_kill.png b/cSploit/src/main/res/drawable-hdpi/action_kill.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_kill.png rename to cSploit/src/main/res/drawable-hdpi/action_kill.png diff --git a/cSploit/res/drawable-hdpi/action_login.png b/cSploit/src/main/res/drawable-hdpi/action_login.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_login.png rename to cSploit/src/main/res/drawable-hdpi/action_login.png diff --git a/cSploit/res/drawable-hdpi/action_mitm.png b/cSploit/src/main/res/drawable-hdpi/action_mitm.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_mitm.png rename to cSploit/src/main/res/drawable-hdpi/action_mitm.png diff --git a/cSploit/res/drawable-hdpi/action_monitor.png b/cSploit/src/main/res/drawable-hdpi/action_monitor.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_monitor.png rename to cSploit/src/main/res/drawable-hdpi/action_monitor.png diff --git a/cSploit/res/drawable-hdpi/action_open.png b/cSploit/src/main/res/drawable-hdpi/action_open.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_open.png rename to cSploit/src/main/res/drawable-hdpi/action_open.png diff --git a/cSploit/res/drawable-hdpi/action_passwords.png b/cSploit/src/main/res/drawable-hdpi/action_passwords.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_passwords.png rename to cSploit/src/main/res/drawable-hdpi/action_passwords.png diff --git a/cSploit/res/drawable-hdpi/action_plugin.png b/cSploit/src/main/res/drawable-hdpi/action_plugin.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_plugin.png rename to cSploit/src/main/res/drawable-hdpi/action_plugin.png diff --git a/cSploit/res/drawable-hdpi/action_redirect.png b/cSploit/src/main/res/drawable-hdpi/action_redirect.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_redirect.png rename to cSploit/src/main/res/drawable-hdpi/action_redirect.png diff --git a/cSploit/res/drawable-hdpi/action_refresh.png b/cSploit/src/main/res/drawable-hdpi/action_refresh.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_refresh.png rename to cSploit/src/main/res/drawable-hdpi/action_refresh.png diff --git a/cSploit/res/drawable-hdpi/action_routerpwn.png b/cSploit/src/main/res/drawable-hdpi/action_routerpwn.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_routerpwn.png rename to cSploit/src/main/res/drawable-hdpi/action_routerpwn.png diff --git a/cSploit/res/drawable-hdpi/action_scan.png b/cSploit/src/main/res/drawable-hdpi/action_scan.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_scan.png rename to cSploit/src/main/res/drawable-hdpi/action_scan.png diff --git a/cSploit/res/drawable-hdpi/action_scanner.png b/cSploit/src/main/res/drawable-hdpi/action_scanner.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_scanner.png rename to cSploit/src/main/res/drawable-hdpi/action_scanner.png diff --git a/cSploit/res/drawable-hdpi/action_session.png b/cSploit/src/main/res/drawable-hdpi/action_session.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_session.png rename to cSploit/src/main/res/drawable-hdpi/action_session.png diff --git a/cSploit/res/drawable-hdpi/action_sniffer.png b/cSploit/src/main/res/drawable-hdpi/action_sniffer.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_sniffer.png rename to cSploit/src/main/res/drawable-hdpi/action_sniffer.png diff --git a/cSploit/res/drawable-hdpi/action_traceroute.png b/cSploit/src/main/res/drawable-hdpi/action_traceroute.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_traceroute.png rename to cSploit/src/main/res/drawable-hdpi/action_traceroute.png diff --git a/cSploit/res/drawable-hdpi/action_youtube.png b/cSploit/src/main/res/drawable-hdpi/action_youtube.png similarity index 100% rename from cSploit/res/drawable-hdpi/action_youtube.png rename to cSploit/src/main/res/drawable-hdpi/action_youtube.png diff --git a/cSploit/res/drawable-hdpi/actionbar_gradient.xml b/cSploit/src/main/res/drawable-hdpi/actionbar_gradient.xml similarity index 100% rename from cSploit/res/drawable-hdpi/actionbar_gradient.xml rename to cSploit/src/main/res/drawable-hdpi/actionbar_gradient.xml diff --git a/cSploit/res/drawable-hdpi/arrow_right.png b/cSploit/src/main/res/drawable-hdpi/arrow_right.png similarity index 100% rename from cSploit/res/drawable-hdpi/arrow_right.png rename to cSploit/src/main/res/drawable-hdpi/arrow_right.png diff --git a/cSploit/res/drawable-hdpi/dsploit_icon.png b/cSploit/src/main/res/drawable-hdpi/dsploit_icon.png similarity index 100% rename from cSploit/res/drawable-hdpi/dsploit_icon.png rename to cSploit/src/main/res/drawable-hdpi/dsploit_icon.png diff --git a/cSploit/res/drawable-hdpi/exploit.png b/cSploit/src/main/res/drawable-hdpi/exploit.png similarity index 100% rename from cSploit/res/drawable-hdpi/exploit.png rename to cSploit/src/main/res/drawable-hdpi/exploit.png diff --git a/cSploit/res/drawable-hdpi/exploit_msf.png b/cSploit/src/main/res/drawable-hdpi/exploit_msf.png similarity index 100% rename from cSploit/res/drawable-hdpi/exploit_msf.png rename to cSploit/src/main/res/drawable-hdpi/exploit_msf.png diff --git a/cSploit/res/drawable-hdpi/favicon_amazon.png b/cSploit/src/main/res/drawable-hdpi/favicon_amazon.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_amazon.png rename to cSploit/src/main/res/drawable-hdpi/favicon_amazon.png diff --git a/cSploit/res/drawable-hdpi/favicon_blogger.png b/cSploit/src/main/res/drawable-hdpi/favicon_blogger.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_blogger.png rename to cSploit/src/main/res/drawable-hdpi/favicon_blogger.png diff --git a/cSploit/res/drawable-hdpi/favicon_facebook.png b/cSploit/src/main/res/drawable-hdpi/favicon_facebook.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_facebook.png rename to cSploit/src/main/res/drawable-hdpi/favicon_facebook.png diff --git a/cSploit/res/drawable-hdpi/favicon_generic.png b/cSploit/src/main/res/drawable-hdpi/favicon_generic.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_generic.png rename to cSploit/src/main/res/drawable-hdpi/favicon_generic.png diff --git a/cSploit/res/drawable-hdpi/favicon_google.png b/cSploit/src/main/res/drawable-hdpi/favicon_google.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_google.png rename to cSploit/src/main/res/drawable-hdpi/favicon_google.png diff --git a/cSploit/res/drawable-hdpi/favicon_tumblr.png b/cSploit/src/main/res/drawable-hdpi/favicon_tumblr.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_tumblr.png rename to cSploit/src/main/res/drawable-hdpi/favicon_tumblr.png diff --git a/cSploit/res/drawable-hdpi/favicon_twitter.png b/cSploit/src/main/res/drawable-hdpi/favicon_twitter.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_twitter.png rename to cSploit/src/main/res/drawable-hdpi/favicon_twitter.png diff --git a/cSploit/res/drawable-hdpi/favicon_xda.png b/cSploit/src/main/res/drawable-hdpi/favicon_xda.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_xda.png rename to cSploit/src/main/res/drawable-hdpi/favicon_xda.png diff --git a/cSploit/res/drawable-hdpi/favicon_youtube.png b/cSploit/src/main/res/drawable-hdpi/favicon_youtube.png similarity index 100% rename from cSploit/res/drawable-hdpi/favicon_youtube.png rename to cSploit/src/main/res/drawable-hdpi/favicon_youtube.png diff --git a/cSploit/res/drawable-hdpi/https_session.png b/cSploit/src/main/res/drawable-hdpi/https_session.png similarity index 100% rename from cSploit/res/drawable-hdpi/https_session.png rename to cSploit/src/main/res/drawable-hdpi/https_session.png diff --git a/cSploit/res/drawable-hdpi/ic_done_white_24dp.png b/cSploit/src/main/res/drawable-hdpi/ic_done_white_24dp.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_done_white_24dp.png rename to cSploit/src/main/res/drawable-hdpi/ic_done_white_24dp.png diff --git a/cSploit/res/drawable-hdpi/ic_impossible.png b/cSploit/src/main/res/drawable-hdpi/ic_impossible.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_impossible.png rename to cSploit/src/main/res/drawable-hdpi/ic_impossible.png diff --git a/cSploit/res/drawable-hdpi/ic_launcher.png b/cSploit/src/main/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_launcher.png rename to cSploit/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/cSploit/res/drawable-hdpi/ic_possible.png b/cSploit/src/main/res/drawable-hdpi/ic_possible.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_possible.png rename to cSploit/src/main/res/drawable-hdpi/ic_possible.png diff --git a/cSploit/res/drawable-hdpi/ic_refresh.png b/cSploit/src/main/res/drawable-hdpi/ic_refresh.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_refresh.png rename to cSploit/src/main/res/drawable-hdpi/ic_refresh.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_lock_signal_1.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_1.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_lock_signal_1.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_1.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_lock_signal_2.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_2.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_lock_signal_2.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_2.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_lock_signal_3.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_3.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_lock_signal_3.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_3.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_lock_signal_4.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_4.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_lock_signal_4.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_lock_signal_4.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_signal_1.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_1.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_signal_1.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_1.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_signal_2.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_2.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_signal_2.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_2.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_signal_3.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_3.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_signal_3.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_3.png diff --git a/cSploit/res/drawable-hdpi/ic_wifi_signal_4.png b/cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_4.png similarity index 100% rename from cSploit/res/drawable-hdpi/ic_wifi_signal_4.png rename to cSploit/src/main/res/drawable-hdpi/ic_wifi_signal_4.png diff --git a/cSploit/res/drawable-hdpi/target_add.png b/cSploit/src/main/res/drawable-hdpi/target_add.png similarity index 100% rename from cSploit/res/drawable-hdpi/target_add.png rename to cSploit/src/main/res/drawable-hdpi/target_add.png diff --git a/cSploit/res/drawable-hdpi/target_endpoint.png b/cSploit/src/main/res/drawable-hdpi/target_endpoint.png similarity index 100% rename from cSploit/res/drawable-hdpi/target_endpoint.png rename to cSploit/src/main/res/drawable-hdpi/target_endpoint.png diff --git a/cSploit/res/drawable-hdpi/target_network.png b/cSploit/src/main/res/drawable-hdpi/target_network.png similarity index 100% rename from cSploit/res/drawable-hdpi/target_network.png rename to cSploit/src/main/res/drawable-hdpi/target_network.png diff --git a/cSploit/res/drawable-hdpi/target_remote.png b/cSploit/src/main/res/drawable-hdpi/target_remote.png similarity index 100% rename from cSploit/res/drawable-hdpi/target_remote.png rename to cSploit/src/main/res/drawable-hdpi/target_remote.png diff --git a/cSploit/res/drawable-hdpi/target_router.png b/cSploit/src/main/res/drawable-hdpi/target_router.png similarity index 100% rename from cSploit/res/drawable-hdpi/target_router.png rename to cSploit/src/main/res/drawable-hdpi/target_router.png diff --git a/cSploit/res/drawable-hdpi/target_self.png b/cSploit/src/main/res/drawable-hdpi/target_self.png similarity index 100% rename from cSploit/res/drawable-hdpi/target_self.png rename to cSploit/src/main/res/drawable-hdpi/target_self.png diff --git a/cSploit/res/drawable-mdpi/action_back.png b/cSploit/src/main/res/drawable-mdpi/action_back.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_back.png rename to cSploit/src/main/res/drawable-mdpi/action_back.png diff --git a/cSploit/res/drawable-mdpi/action_backward.png b/cSploit/src/main/res/drawable-mdpi/action_backward.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_backward.png rename to cSploit/src/main/res/drawable-mdpi/action_backward.png diff --git a/cSploit/res/drawable-mdpi/action_explo.png b/cSploit/src/main/res/drawable-mdpi/action_explo.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_explo.png rename to cSploit/src/main/res/drawable-mdpi/action_explo.png diff --git a/cSploit/res/drawable-mdpi/action_exploit_finder.png b/cSploit/src/main/res/drawable-mdpi/action_exploit_finder.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_exploit_finder.png rename to cSploit/src/main/res/drawable-mdpi/action_exploit_finder.png diff --git a/cSploit/res/drawable-mdpi/action_forge.png b/cSploit/src/main/res/drawable-mdpi/action_forge.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_forge.png rename to cSploit/src/main/res/drawable-mdpi/action_forge.png diff --git a/cSploit/res/drawable-mdpi/action_forward.png b/cSploit/src/main/res/drawable-mdpi/action_forward.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_forward.png rename to cSploit/src/main/res/drawable-mdpi/action_forward.png diff --git a/cSploit/res/drawable-mdpi/action_hijack.png b/cSploit/src/main/res/drawable-mdpi/action_hijack.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_hijack.png rename to cSploit/src/main/res/drawable-mdpi/action_hijack.png diff --git a/cSploit/res/drawable-mdpi/action_image.png b/cSploit/src/main/res/drawable-mdpi/action_image.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_image.png rename to cSploit/src/main/res/drawable-mdpi/action_image.png diff --git a/cSploit/res/drawable-mdpi/action_injection.png b/cSploit/src/main/res/drawable-mdpi/action_injection.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_injection.png rename to cSploit/src/main/res/drawable-mdpi/action_injection.png diff --git a/cSploit/res/drawable-mdpi/action_inspect.png b/cSploit/src/main/res/drawable-mdpi/action_inspect.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_inspect.png rename to cSploit/src/main/res/drawable-mdpi/action_inspect.png diff --git a/cSploit/res/drawable-mdpi/action_kill.png b/cSploit/src/main/res/drawable-mdpi/action_kill.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_kill.png rename to cSploit/src/main/res/drawable-mdpi/action_kill.png diff --git a/cSploit/res/drawable-mdpi/action_login.png b/cSploit/src/main/res/drawable-mdpi/action_login.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_login.png rename to cSploit/src/main/res/drawable-mdpi/action_login.png diff --git a/cSploit/res/drawable-mdpi/action_mitm.png b/cSploit/src/main/res/drawable-mdpi/action_mitm.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_mitm.png rename to cSploit/src/main/res/drawable-mdpi/action_mitm.png diff --git a/cSploit/res/drawable-mdpi/action_monitor.png b/cSploit/src/main/res/drawable-mdpi/action_monitor.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_monitor.png rename to cSploit/src/main/res/drawable-mdpi/action_monitor.png diff --git a/cSploit/res/drawable-mdpi/action_open.png b/cSploit/src/main/res/drawable-mdpi/action_open.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_open.png rename to cSploit/src/main/res/drawable-mdpi/action_open.png diff --git a/cSploit/res/drawable-mdpi/action_passwords.png b/cSploit/src/main/res/drawable-mdpi/action_passwords.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_passwords.png rename to cSploit/src/main/res/drawable-mdpi/action_passwords.png diff --git a/cSploit/res/drawable-mdpi/action_plugin.png b/cSploit/src/main/res/drawable-mdpi/action_plugin.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_plugin.png rename to cSploit/src/main/res/drawable-mdpi/action_plugin.png diff --git a/cSploit/res/drawable-mdpi/action_redirect.png b/cSploit/src/main/res/drawable-mdpi/action_redirect.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_redirect.png rename to cSploit/src/main/res/drawable-mdpi/action_redirect.png diff --git a/cSploit/res/drawable-mdpi/action_refresh.png b/cSploit/src/main/res/drawable-mdpi/action_refresh.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_refresh.png rename to cSploit/src/main/res/drawable-mdpi/action_refresh.png diff --git a/cSploit/res/drawable-mdpi/action_routerpwn.png b/cSploit/src/main/res/drawable-mdpi/action_routerpwn.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_routerpwn.png rename to cSploit/src/main/res/drawable-mdpi/action_routerpwn.png diff --git a/cSploit/res/drawable-mdpi/action_scan.png b/cSploit/src/main/res/drawable-mdpi/action_scan.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_scan.png rename to cSploit/src/main/res/drawable-mdpi/action_scan.png diff --git a/cSploit/res/drawable-mdpi/action_scanner.png b/cSploit/src/main/res/drawable-mdpi/action_scanner.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_scanner.png rename to cSploit/src/main/res/drawable-mdpi/action_scanner.png diff --git a/cSploit/res/drawable-mdpi/action_session.png b/cSploit/src/main/res/drawable-mdpi/action_session.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_session.png rename to cSploit/src/main/res/drawable-mdpi/action_session.png diff --git a/cSploit/res/drawable-mdpi/action_sniffer.png b/cSploit/src/main/res/drawable-mdpi/action_sniffer.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_sniffer.png rename to cSploit/src/main/res/drawable-mdpi/action_sniffer.png diff --git a/cSploit/res/drawable-mdpi/action_traceroute.png b/cSploit/src/main/res/drawable-mdpi/action_traceroute.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_traceroute.png rename to cSploit/src/main/res/drawable-mdpi/action_traceroute.png diff --git a/cSploit/res/drawable-mdpi/action_youtube.png b/cSploit/src/main/res/drawable-mdpi/action_youtube.png similarity index 100% rename from cSploit/res/drawable-mdpi/action_youtube.png rename to cSploit/src/main/res/drawable-mdpi/action_youtube.png diff --git a/cSploit/res/drawable-mdpi/actionbar_gradient.xml b/cSploit/src/main/res/drawable-mdpi/actionbar_gradient.xml similarity index 100% rename from cSploit/res/drawable-mdpi/actionbar_gradient.xml rename to cSploit/src/main/res/drawable-mdpi/actionbar_gradient.xml diff --git a/cSploit/res/drawable-mdpi/arrow_right.png b/cSploit/src/main/res/drawable-mdpi/arrow_right.png similarity index 100% rename from cSploit/res/drawable-mdpi/arrow_right.png rename to cSploit/src/main/res/drawable-mdpi/arrow_right.png diff --git a/cSploit/res/drawable-mdpi/dsploit_icon.png b/cSploit/src/main/res/drawable-mdpi/dsploit_icon.png similarity index 100% rename from cSploit/res/drawable-mdpi/dsploit_icon.png rename to cSploit/src/main/res/drawable-mdpi/dsploit_icon.png diff --git a/cSploit/res/drawable-mdpi/exploit.png b/cSploit/src/main/res/drawable-mdpi/exploit.png similarity index 100% rename from cSploit/res/drawable-mdpi/exploit.png rename to cSploit/src/main/res/drawable-mdpi/exploit.png diff --git a/cSploit/res/drawable-mdpi/exploit_msf.png b/cSploit/src/main/res/drawable-mdpi/exploit_msf.png similarity index 100% rename from cSploit/res/drawable-mdpi/exploit_msf.png rename to cSploit/src/main/res/drawable-mdpi/exploit_msf.png diff --git a/cSploit/res/drawable-mdpi/favicon_amazon.png b/cSploit/src/main/res/drawable-mdpi/favicon_amazon.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_amazon.png rename to cSploit/src/main/res/drawable-mdpi/favicon_amazon.png diff --git a/cSploit/res/drawable-mdpi/favicon_blogger.png b/cSploit/src/main/res/drawable-mdpi/favicon_blogger.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_blogger.png rename to cSploit/src/main/res/drawable-mdpi/favicon_blogger.png diff --git a/cSploit/res/drawable-mdpi/favicon_facebook.png b/cSploit/src/main/res/drawable-mdpi/favicon_facebook.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_facebook.png rename to cSploit/src/main/res/drawable-mdpi/favicon_facebook.png diff --git a/cSploit/res/drawable-mdpi/favicon_generic.png b/cSploit/src/main/res/drawable-mdpi/favicon_generic.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_generic.png rename to cSploit/src/main/res/drawable-mdpi/favicon_generic.png diff --git a/cSploit/res/drawable-mdpi/favicon_google.png b/cSploit/src/main/res/drawable-mdpi/favicon_google.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_google.png rename to cSploit/src/main/res/drawable-mdpi/favicon_google.png diff --git a/cSploit/res/drawable-mdpi/favicon_tumblr.png b/cSploit/src/main/res/drawable-mdpi/favicon_tumblr.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_tumblr.png rename to cSploit/src/main/res/drawable-mdpi/favicon_tumblr.png diff --git a/cSploit/res/drawable-mdpi/favicon_twitter.png b/cSploit/src/main/res/drawable-mdpi/favicon_twitter.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_twitter.png rename to cSploit/src/main/res/drawable-mdpi/favicon_twitter.png diff --git a/cSploit/res/drawable-mdpi/favicon_xda.png b/cSploit/src/main/res/drawable-mdpi/favicon_xda.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_xda.png rename to cSploit/src/main/res/drawable-mdpi/favicon_xda.png diff --git a/cSploit/res/drawable-mdpi/favicon_youtube.png b/cSploit/src/main/res/drawable-mdpi/favicon_youtube.png similarity index 100% rename from cSploit/res/drawable-mdpi/favicon_youtube.png rename to cSploit/src/main/res/drawable-mdpi/favicon_youtube.png diff --git a/cSploit/res/drawable-mdpi/https_session.png b/cSploit/src/main/res/drawable-mdpi/https_session.png similarity index 100% rename from cSploit/res/drawable-mdpi/https_session.png rename to cSploit/src/main/res/drawable-mdpi/https_session.png diff --git a/cSploit/res/drawable-mdpi/ic_done_white_24dp.png b/cSploit/src/main/res/drawable-mdpi/ic_done_white_24dp.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_done_white_24dp.png rename to cSploit/src/main/res/drawable-mdpi/ic_done_white_24dp.png diff --git a/cSploit/res/drawable-mdpi/ic_impossible.png b/cSploit/src/main/res/drawable-mdpi/ic_impossible.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_impossible.png rename to cSploit/src/main/res/drawable-mdpi/ic_impossible.png diff --git a/cSploit/res/drawable-mdpi/ic_launcher.png b/cSploit/src/main/res/drawable-mdpi/ic_launcher.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_launcher.png rename to cSploit/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/cSploit/res/drawable-mdpi/ic_possible.png b/cSploit/src/main/res/drawable-mdpi/ic_possible.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_possible.png rename to cSploit/src/main/res/drawable-mdpi/ic_possible.png diff --git a/cSploit/res/drawable-mdpi/ic_refresh.png b/cSploit/src/main/res/drawable-mdpi/ic_refresh.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_refresh.png rename to cSploit/src/main/res/drawable-mdpi/ic_refresh.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_lock_signal_1.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_1.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_lock_signal_1.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_1.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_lock_signal_2.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_2.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_lock_signal_2.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_2.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_lock_signal_3.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_3.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_lock_signal_3.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_3.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_lock_signal_4.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_4.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_lock_signal_4.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_lock_signal_4.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_signal_1.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_1.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_signal_1.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_1.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_signal_2.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_2.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_signal_2.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_2.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_signal_3.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_3.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_signal_3.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_3.png diff --git a/cSploit/res/drawable-mdpi/ic_wifi_signal_4.png b/cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_4.png similarity index 100% rename from cSploit/res/drawable-mdpi/ic_wifi_signal_4.png rename to cSploit/src/main/res/drawable-mdpi/ic_wifi_signal_4.png diff --git a/cSploit/res/drawable-mdpi/target_add.png b/cSploit/src/main/res/drawable-mdpi/target_add.png similarity index 100% rename from cSploit/res/drawable-mdpi/target_add.png rename to cSploit/src/main/res/drawable-mdpi/target_add.png diff --git a/cSploit/res/drawable-mdpi/target_endpoint.png b/cSploit/src/main/res/drawable-mdpi/target_endpoint.png similarity index 100% rename from cSploit/res/drawable-mdpi/target_endpoint.png rename to cSploit/src/main/res/drawable-mdpi/target_endpoint.png diff --git a/cSploit/res/drawable-mdpi/target_network.png b/cSploit/src/main/res/drawable-mdpi/target_network.png similarity index 100% rename from cSploit/res/drawable-mdpi/target_network.png rename to cSploit/src/main/res/drawable-mdpi/target_network.png diff --git a/cSploit/res/drawable-mdpi/target_remote.png b/cSploit/src/main/res/drawable-mdpi/target_remote.png similarity index 100% rename from cSploit/res/drawable-mdpi/target_remote.png rename to cSploit/src/main/res/drawable-mdpi/target_remote.png diff --git a/cSploit/res/drawable-mdpi/target_router.png b/cSploit/src/main/res/drawable-mdpi/target_router.png similarity index 100% rename from cSploit/res/drawable-mdpi/target_router.png rename to cSploit/src/main/res/drawable-mdpi/target_router.png diff --git a/cSploit/res/drawable-mdpi/target_self.png b/cSploit/src/main/res/drawable-mdpi/target_self.png similarity index 100% rename from cSploit/res/drawable-mdpi/target_self.png rename to cSploit/src/main/res/drawable-mdpi/target_self.png diff --git a/cSploit/res/drawable-xhdpi/action_back.png b/cSploit/src/main/res/drawable-xhdpi/action_back.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_back.png rename to cSploit/src/main/res/drawable-xhdpi/action_back.png diff --git a/cSploit/res/drawable-xhdpi/action_backward.png b/cSploit/src/main/res/drawable-xhdpi/action_backward.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_backward.png rename to cSploit/src/main/res/drawable-xhdpi/action_backward.png diff --git a/cSploit/res/drawable-xhdpi/action_exploit.png b/cSploit/src/main/res/drawable-xhdpi/action_exploit.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_exploit.png rename to cSploit/src/main/res/drawable-xhdpi/action_exploit.png diff --git a/cSploit/res/drawable-xhdpi/action_exploit_finder.png b/cSploit/src/main/res/drawable-xhdpi/action_exploit_finder.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_exploit_finder.png rename to cSploit/src/main/res/drawable-xhdpi/action_exploit_finder.png diff --git a/cSploit/res/drawable-xhdpi/action_forge.png b/cSploit/src/main/res/drawable-xhdpi/action_forge.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_forge.png rename to cSploit/src/main/res/drawable-xhdpi/action_forge.png diff --git a/cSploit/res/drawable-xhdpi/action_forward.png b/cSploit/src/main/res/drawable-xhdpi/action_forward.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_forward.png rename to cSploit/src/main/res/drawable-xhdpi/action_forward.png diff --git a/cSploit/res/drawable-xhdpi/action_hijack.png b/cSploit/src/main/res/drawable-xhdpi/action_hijack.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_hijack.png rename to cSploit/src/main/res/drawable-xhdpi/action_hijack.png diff --git a/cSploit/res/drawable-xhdpi/action_image.png b/cSploit/src/main/res/drawable-xhdpi/action_image.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_image.png rename to cSploit/src/main/res/drawable-xhdpi/action_image.png diff --git a/cSploit/res/drawable-xhdpi/action_inject.png b/cSploit/src/main/res/drawable-xhdpi/action_inject.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_inject.png rename to cSploit/src/main/res/drawable-xhdpi/action_inject.png diff --git a/cSploit/res/drawable-xhdpi/action_inspect.png b/cSploit/src/main/res/drawable-xhdpi/action_inspect.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_inspect.png rename to cSploit/src/main/res/drawable-xhdpi/action_inspect.png diff --git a/cSploit/res/drawable-xhdpi/action_kill.png b/cSploit/src/main/res/drawable-xhdpi/action_kill.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_kill.png rename to cSploit/src/main/res/drawable-xhdpi/action_kill.png diff --git a/cSploit/res/drawable-xhdpi/action_login.png b/cSploit/src/main/res/drawable-xhdpi/action_login.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_login.png rename to cSploit/src/main/res/drawable-xhdpi/action_login.png diff --git a/cSploit/res/drawable-xhdpi/action_mitm.png b/cSploit/src/main/res/drawable-xhdpi/action_mitm.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_mitm.png rename to cSploit/src/main/res/drawable-xhdpi/action_mitm.png diff --git a/cSploit/res/drawable-xhdpi/action_monitor.png b/cSploit/src/main/res/drawable-xhdpi/action_monitor.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_monitor.png rename to cSploit/src/main/res/drawable-xhdpi/action_monitor.png diff --git a/cSploit/res/drawable-xhdpi/action_open.png b/cSploit/src/main/res/drawable-xhdpi/action_open.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_open.png rename to cSploit/src/main/res/drawable-xhdpi/action_open.png diff --git a/cSploit/res/drawable-xhdpi/action_passwords.png b/cSploit/src/main/res/drawable-xhdpi/action_passwords.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_passwords.png rename to cSploit/src/main/res/drawable-xhdpi/action_passwords.png diff --git a/cSploit/res/drawable-xhdpi/action_plugin.png b/cSploit/src/main/res/drawable-xhdpi/action_plugin.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_plugin.png rename to cSploit/src/main/res/drawable-xhdpi/action_plugin.png diff --git a/cSploit/res/drawable-xhdpi/action_redirect.png b/cSploit/src/main/res/drawable-xhdpi/action_redirect.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_redirect.png rename to cSploit/src/main/res/drawable-xhdpi/action_redirect.png diff --git a/cSploit/res/drawable-xhdpi/action_refresh.png b/cSploit/src/main/res/drawable-xhdpi/action_refresh.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_refresh.png rename to cSploit/src/main/res/drawable-xhdpi/action_refresh.png diff --git a/cSploit/res/drawable-xhdpi/action_routerpwn.png b/cSploit/src/main/res/drawable-xhdpi/action_routerpwn.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_routerpwn.png rename to cSploit/src/main/res/drawable-xhdpi/action_routerpwn.png diff --git a/cSploit/res/drawable-xhdpi/action_scan.png b/cSploit/src/main/res/drawable-xhdpi/action_scan.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_scan.png rename to cSploit/src/main/res/drawable-xhdpi/action_scan.png diff --git a/cSploit/res/drawable-xhdpi/action_scanner.png b/cSploit/src/main/res/drawable-xhdpi/action_scanner.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_scanner.png rename to cSploit/src/main/res/drawable-xhdpi/action_scanner.png diff --git a/cSploit/res/drawable-xhdpi/action_session.png b/cSploit/src/main/res/drawable-xhdpi/action_session.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_session.png rename to cSploit/src/main/res/drawable-xhdpi/action_session.png diff --git a/cSploit/res/drawable-xhdpi/action_sniffer.png b/cSploit/src/main/res/drawable-xhdpi/action_sniffer.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_sniffer.png rename to cSploit/src/main/res/drawable-xhdpi/action_sniffer.png diff --git a/cSploit/res/drawable-xhdpi/action_traceroute.png b/cSploit/src/main/res/drawable-xhdpi/action_traceroute.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_traceroute.png rename to cSploit/src/main/res/drawable-xhdpi/action_traceroute.png diff --git a/cSploit/res/drawable-xhdpi/action_youtube.png b/cSploit/src/main/res/drawable-xhdpi/action_youtube.png similarity index 100% rename from cSploit/res/drawable-xhdpi/action_youtube.png rename to cSploit/src/main/res/drawable-xhdpi/action_youtube.png diff --git a/cSploit/res/drawable-xhdpi/arrow_right.png b/cSploit/src/main/res/drawable-xhdpi/arrow_right.png similarity index 100% rename from cSploit/res/drawable-xhdpi/arrow_right.png rename to cSploit/src/main/res/drawable-xhdpi/arrow_right.png diff --git a/cSploit/res/drawable-xhdpi/exploit.png b/cSploit/src/main/res/drawable-xhdpi/exploit.png similarity index 100% rename from cSploit/res/drawable-xhdpi/exploit.png rename to cSploit/src/main/res/drawable-xhdpi/exploit.png diff --git a/cSploit/res/drawable-xhdpi/exploit_msf.png b/cSploit/src/main/res/drawable-xhdpi/exploit_msf.png similarity index 100% rename from cSploit/res/drawable-xhdpi/exploit_msf.png rename to cSploit/src/main/res/drawable-xhdpi/exploit_msf.png diff --git a/cSploit/res/drawable-xhdpi/https_session.png b/cSploit/src/main/res/drawable-xhdpi/https_session.png similarity index 100% rename from cSploit/res/drawable-xhdpi/https_session.png rename to cSploit/src/main/res/drawable-xhdpi/https_session.png diff --git a/cSploit/res/drawable-xhdpi/ic_done_white_24dp.png b/cSploit/src/main/res/drawable-xhdpi/ic_done_white_24dp.png similarity index 100% rename from cSploit/res/drawable-xhdpi/ic_done_white_24dp.png rename to cSploit/src/main/res/drawable-xhdpi/ic_done_white_24dp.png diff --git a/cSploit/res/drawable-xhdpi/target_add.png b/cSploit/src/main/res/drawable-xhdpi/target_add.png similarity index 100% rename from cSploit/res/drawable-xhdpi/target_add.png rename to cSploit/src/main/res/drawable-xhdpi/target_add.png diff --git a/cSploit/res/drawable-xhdpi/target_endpoint.png b/cSploit/src/main/res/drawable-xhdpi/target_endpoint.png similarity index 100% rename from cSploit/res/drawable-xhdpi/target_endpoint.png rename to cSploit/src/main/res/drawable-xhdpi/target_endpoint.png diff --git a/cSploit/res/drawable-xhdpi/target_network.png b/cSploit/src/main/res/drawable-xhdpi/target_network.png similarity index 100% rename from cSploit/res/drawable-xhdpi/target_network.png rename to cSploit/src/main/res/drawable-xhdpi/target_network.png diff --git a/cSploit/res/drawable-xhdpi/target_remote.png b/cSploit/src/main/res/drawable-xhdpi/target_remote.png similarity index 100% rename from cSploit/res/drawable-xhdpi/target_remote.png rename to cSploit/src/main/res/drawable-xhdpi/target_remote.png diff --git a/cSploit/res/drawable-xhdpi/target_router.png b/cSploit/src/main/res/drawable-xhdpi/target_router.png similarity index 100% rename from cSploit/res/drawable-xhdpi/target_router.png rename to cSploit/src/main/res/drawable-xhdpi/target_router.png diff --git a/cSploit/res/drawable-xhdpi/target_self.png b/cSploit/src/main/res/drawable-xhdpi/target_self.png similarity index 100% rename from cSploit/res/drawable-xhdpi/target_self.png rename to cSploit/src/main/res/drawable-xhdpi/target_self.png diff --git a/cSploit/res/drawable-xxhdpi/action_back.png b/cSploit/src/main/res/drawable-xxhdpi/action_back.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_back.png rename to cSploit/src/main/res/drawable-xxhdpi/action_back.png diff --git a/cSploit/res/drawable-xxhdpi/action_backwards.png b/cSploit/src/main/res/drawable-xxhdpi/action_backwards.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_backwards.png rename to cSploit/src/main/res/drawable-xxhdpi/action_backwards.png diff --git a/cSploit/res/drawable-xxhdpi/action_exploit.png b/cSploit/src/main/res/drawable-xxhdpi/action_exploit.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_exploit.png rename to cSploit/src/main/res/drawable-xxhdpi/action_exploit.png diff --git a/cSploit/res/drawable-xxhdpi/action_exploit_finder.png b/cSploit/src/main/res/drawable-xxhdpi/action_exploit_finder.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_exploit_finder.png rename to cSploit/src/main/res/drawable-xxhdpi/action_exploit_finder.png diff --git a/cSploit/res/drawable-xxhdpi/action_forge.png b/cSploit/src/main/res/drawable-xxhdpi/action_forge.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_forge.png rename to cSploit/src/main/res/drawable-xxhdpi/action_forge.png diff --git a/cSploit/res/drawable-xxhdpi/action_forward.png b/cSploit/src/main/res/drawable-xxhdpi/action_forward.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_forward.png rename to cSploit/src/main/res/drawable-xxhdpi/action_forward.png diff --git a/cSploit/res/drawable-xxhdpi/action_hijack.png b/cSploit/src/main/res/drawable-xxhdpi/action_hijack.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_hijack.png rename to cSploit/src/main/res/drawable-xxhdpi/action_hijack.png diff --git a/cSploit/res/drawable-xxhdpi/action_image.png b/cSploit/src/main/res/drawable-xxhdpi/action_image.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_image.png rename to cSploit/src/main/res/drawable-xxhdpi/action_image.png diff --git a/cSploit/res/drawable-xxhdpi/action_injection.png b/cSploit/src/main/res/drawable-xxhdpi/action_injection.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_injection.png rename to cSploit/src/main/res/drawable-xxhdpi/action_injection.png diff --git a/cSploit/res/drawable-xxhdpi/action_inspect.png b/cSploit/src/main/res/drawable-xxhdpi/action_inspect.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_inspect.png rename to cSploit/src/main/res/drawable-xxhdpi/action_inspect.png diff --git a/cSploit/res/drawable-xxhdpi/action_kill.png b/cSploit/src/main/res/drawable-xxhdpi/action_kill.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_kill.png rename to cSploit/src/main/res/drawable-xxhdpi/action_kill.png diff --git a/cSploit/res/drawable-xxhdpi/action_login.png b/cSploit/src/main/res/drawable-xxhdpi/action_login.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_login.png rename to cSploit/src/main/res/drawable-xxhdpi/action_login.png diff --git a/cSploit/res/drawable-xxhdpi/action_mitm.png b/cSploit/src/main/res/drawable-xxhdpi/action_mitm.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_mitm.png rename to cSploit/src/main/res/drawable-xxhdpi/action_mitm.png diff --git a/cSploit/res/drawable-xxhdpi/action_monitor.png b/cSploit/src/main/res/drawable-xxhdpi/action_monitor.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_monitor.png rename to cSploit/src/main/res/drawable-xxhdpi/action_monitor.png diff --git a/cSploit/res/drawable-xxhdpi/action_open.png b/cSploit/src/main/res/drawable-xxhdpi/action_open.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_open.png rename to cSploit/src/main/res/drawable-xxhdpi/action_open.png diff --git a/cSploit/res/drawable-xxhdpi/action_passwords.png b/cSploit/src/main/res/drawable-xxhdpi/action_passwords.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_passwords.png rename to cSploit/src/main/res/drawable-xxhdpi/action_passwords.png diff --git a/cSploit/res/drawable-xxhdpi/action_plugin.png b/cSploit/src/main/res/drawable-xxhdpi/action_plugin.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_plugin.png rename to cSploit/src/main/res/drawable-xxhdpi/action_plugin.png diff --git a/cSploit/res/drawable-xxhdpi/action_redirect.png b/cSploit/src/main/res/drawable-xxhdpi/action_redirect.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_redirect.png rename to cSploit/src/main/res/drawable-xxhdpi/action_redirect.png diff --git a/cSploit/res/drawable-xxhdpi/action_refresh.png b/cSploit/src/main/res/drawable-xxhdpi/action_refresh.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_refresh.png rename to cSploit/src/main/res/drawable-xxhdpi/action_refresh.png diff --git a/cSploit/res/drawable-xxhdpi/action_routerpwn.png b/cSploit/src/main/res/drawable-xxhdpi/action_routerpwn.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_routerpwn.png rename to cSploit/src/main/res/drawable-xxhdpi/action_routerpwn.png diff --git a/cSploit/res/drawable-xxhdpi/action_scan.png b/cSploit/src/main/res/drawable-xxhdpi/action_scan.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_scan.png rename to cSploit/src/main/res/drawable-xxhdpi/action_scan.png diff --git a/cSploit/res/drawable-xxhdpi/action_scanner.png b/cSploit/src/main/res/drawable-xxhdpi/action_scanner.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_scanner.png rename to cSploit/src/main/res/drawable-xxhdpi/action_scanner.png diff --git a/cSploit/res/drawable-xxhdpi/action_session.png b/cSploit/src/main/res/drawable-xxhdpi/action_session.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_session.png rename to cSploit/src/main/res/drawable-xxhdpi/action_session.png diff --git a/cSploit/res/drawable-xxhdpi/action_sniffer.png b/cSploit/src/main/res/drawable-xxhdpi/action_sniffer.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_sniffer.png rename to cSploit/src/main/res/drawable-xxhdpi/action_sniffer.png diff --git a/cSploit/res/drawable-xxhdpi/action_traceroute.png b/cSploit/src/main/res/drawable-xxhdpi/action_traceroute.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_traceroute.png rename to cSploit/src/main/res/drawable-xxhdpi/action_traceroute.png diff --git a/cSploit/res/drawable-xxhdpi/action_youtube.png b/cSploit/src/main/res/drawable-xxhdpi/action_youtube.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/action_youtube.png rename to cSploit/src/main/res/drawable-xxhdpi/action_youtube.png diff --git a/cSploit/res/drawable-xxhdpi/arrow_right.png b/cSploit/src/main/res/drawable-xxhdpi/arrow_right.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/arrow_right.png rename to cSploit/src/main/res/drawable-xxhdpi/arrow_right.png diff --git a/cSploit/res/drawable-xxhdpi/exploit.png b/cSploit/src/main/res/drawable-xxhdpi/exploit.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/exploit.png rename to cSploit/src/main/res/drawable-xxhdpi/exploit.png diff --git a/cSploit/res/drawable-xxhdpi/exploit_msf.png b/cSploit/src/main/res/drawable-xxhdpi/exploit_msf.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/exploit_msf.png rename to cSploit/src/main/res/drawable-xxhdpi/exploit_msf.png diff --git a/cSploit/res/drawable-xxhdpi/https_session.png b/cSploit/src/main/res/drawable-xxhdpi/https_session.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/https_session.png rename to cSploit/src/main/res/drawable-xxhdpi/https_session.png diff --git a/cSploit/res/drawable-xxhdpi/ic_done_white_24dp.png b/cSploit/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/ic_done_white_24dp.png rename to cSploit/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png diff --git a/cSploit/res/drawable-xxhdpi/target_add.png b/cSploit/src/main/res/drawable-xxhdpi/target_add.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/target_add.png rename to cSploit/src/main/res/drawable-xxhdpi/target_add.png diff --git a/cSploit/res/drawable-xxhdpi/target_endpoint.png b/cSploit/src/main/res/drawable-xxhdpi/target_endpoint.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/target_endpoint.png rename to cSploit/src/main/res/drawable-xxhdpi/target_endpoint.png diff --git a/cSploit/res/drawable-xxhdpi/target_network.png b/cSploit/src/main/res/drawable-xxhdpi/target_network.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/target_network.png rename to cSploit/src/main/res/drawable-xxhdpi/target_network.png diff --git a/cSploit/res/drawable-xxhdpi/target_remote.png b/cSploit/src/main/res/drawable-xxhdpi/target_remote.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/target_remote.png rename to cSploit/src/main/res/drawable-xxhdpi/target_remote.png diff --git a/cSploit/res/drawable-xxhdpi/target_router.png b/cSploit/src/main/res/drawable-xxhdpi/target_router.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/target_router.png rename to cSploit/src/main/res/drawable-xxhdpi/target_router.png diff --git a/cSploit/res/drawable-xxhdpi/target_self.png b/cSploit/src/main/res/drawable-xxhdpi/target_self.png similarity index 100% rename from cSploit/res/drawable-xxhdpi/target_self.png rename to cSploit/src/main/res/drawable-xxhdpi/target_self.png diff --git a/cSploit/res/drawable-xxxhdpi/ic_done_white_24dp.png b/cSploit/src/main/res/drawable-xxxhdpi/ic_done_white_24dp.png similarity index 100% rename from cSploit/res/drawable-xxxhdpi/ic_done_white_24dp.png rename to cSploit/src/main/res/drawable-xxxhdpi/ic_done_white_24dp.png diff --git a/cSploit/res/drawable/actionbar_gradient.xml b/cSploit/src/main/res/drawable/actionbar_gradient.xml similarity index 100% rename from cSploit/res/drawable/actionbar_gradient.xml rename to cSploit/src/main/res/drawable/actionbar_gradient.xml diff --git a/cSploit/res/drawable/card_background.9.png b/cSploit/src/main/res/drawable/card_background.9.png similarity index 100% rename from cSploit/res/drawable/card_background.9.png rename to cSploit/src/main/res/drawable/card_background.9.png diff --git a/cSploit/res/drawable/card_background_dark.9.png b/cSploit/src/main/res/drawable/card_background_dark.9.png similarity index 100% rename from cSploit/res/drawable/card_background_dark.9.png rename to cSploit/src/main/res/drawable/card_background_dark.9.png diff --git a/cSploit/res/drawable/card_background_shadow.9.png b/cSploit/src/main/res/drawable/card_background_shadow.9.png similarity index 100% rename from cSploit/res/drawable/card_background_shadow.9.png rename to cSploit/src/main/res/drawable/card_background_shadow.9.png diff --git a/cSploit/res/drawable/card_shadow.9.png b/cSploit/src/main/res/drawable/card_shadow.9.png similarity index 100% rename from cSploit/res/drawable/card_shadow.9.png rename to cSploit/src/main/res/drawable/card_shadow.9.png diff --git a/cSploit/res/drawable/ic_play_arrow_24dp.xml b/cSploit/src/main/res/drawable/ic_play_arrow_24dp.xml similarity index 100% rename from cSploit/res/drawable/ic_play_arrow_24dp.xml rename to cSploit/src/main/res/drawable/ic_play_arrow_24dp.xml diff --git a/cSploit/res/drawable/ic_stop_24dp.xml b/cSploit/src/main/res/drawable/ic_stop_24dp.xml similarity index 100% rename from cSploit/res/drawable/ic_stop_24dp.xml rename to cSploit/src/main/res/drawable/ic_stop_24dp.xml diff --git a/cSploit/res/drawable/rounded_square.xml b/cSploit/src/main/res/drawable/rounded_square.xml similarity index 100% rename from cSploit/res/drawable/rounded_square.xml rename to cSploit/src/main/res/drawable/rounded_square.xml diff --git a/cSploit/res/drawable/rounded_square_grey.xml b/cSploit/src/main/res/drawable/rounded_square_grey.xml similarity index 100% rename from cSploit/res/drawable/rounded_square_grey.xml rename to cSploit/src/main/res/drawable/rounded_square_grey.xml diff --git a/cSploit/res/drawable/selectable_background_cardbank.xml b/cSploit/src/main/res/drawable/selectable_background_cardbank.xml similarity index 100% rename from cSploit/res/drawable/selectable_background_cardbank.xml rename to cSploit/src/main/res/drawable/selectable_background_cardbank.xml diff --git a/cSploit/res/drawable/top_shadow.png b/cSploit/src/main/res/drawable/top_shadow.png similarity index 100% rename from cSploit/res/drawable/top_shadow.png rename to cSploit/src/main/res/drawable/top_shadow.png diff --git a/cSploit/res/layout/about_dialog.xml b/cSploit/src/main/res/layout/about_dialog.xml similarity index 100% rename from cSploit/res/layout/about_dialog.xml rename to cSploit/src/main/res/layout/about_dialog.xml diff --git a/cSploit/res/layout/actions_layout.xml b/cSploit/src/main/res/layout/actions_layout.xml similarity index 100% rename from cSploit/res/layout/actions_layout.xml rename to cSploit/src/main/res/layout/actions_layout.xml diff --git a/cSploit/res/layout/actions_list_item.xml b/cSploit/src/main/res/layout/actions_list_item.xml similarity index 95% rename from cSploit/res/layout/actions_list_item.xml rename to cSploit/src/main/res/layout/actions_list_item.xml index 547fb06425..aca8520a7b 100644 --- a/cSploit/res/layout/actions_list_item.xml +++ b/cSploit/src/main/res/layout/actions_list_item.xml @@ -1,6 +1,7 @@ + app:srcCompat="@drawable/action_plugin" /> - + \ No newline at end of file diff --git a/cSploit/res/layout/plugin_exploit_finder.xml b/cSploit/src/main/res/layout/plugin_exploit_finder.xml similarity index 94% rename from cSploit/res/layout/plugin_exploit_finder.xml rename to cSploit/src/main/res/layout/plugin_exploit_finder.xml index 295781e447..c1ac9b7e11 100644 --- a/cSploit/res/layout/plugin_exploit_finder.xml +++ b/cSploit/src/main/res/layout/plugin_exploit_finder.xml @@ -4,18 +4,6 @@ android:layout_height="fill_parent" android:orientation="vertical"> - - + + \ No newline at end of file diff --git a/cSploit/res/layout/plugin_exploit_finder_item.xml b/cSploit/src/main/res/layout/plugin_exploit_finder_item.xml similarity index 93% rename from cSploit/res/layout/plugin_exploit_finder_item.xml rename to cSploit/src/main/res/layout/plugin_exploit_finder_item.xml index fac11969f0..8f77cf6965 100644 --- a/cSploit/res/layout/plugin_exploit_finder_item.xml +++ b/cSploit/src/main/res/layout/plugin_exploit_finder_item.xml @@ -1,5 +1,6 @@ @@ -12,7 +13,7 @@ android:layout_marginBottom="4dp" android:layout_marginRight="16dp" android:gravity="center_vertical" - android:src="@android:drawable/ic_menu_edit" + app:srcCompat="@android:drawable/ic_menu_edit" android:layout_centerVertical="true" /> - - + + + \ No newline at end of file diff --git a/cSploit/res/layout/plugin_login_cracker.xml b/cSploit/src/main/res/layout/plugin_login_cracker.xml similarity index 99% rename from cSploit/res/layout/plugin_login_cracker.xml rename to cSploit/src/main/res/layout/plugin_login_cracker.xml index 045b8d0d9c..64a166445c 100644 --- a/cSploit/res/layout/plugin_login_cracker.xml +++ b/cSploit/src/main/res/layout/plugin_login_cracker.xml @@ -207,7 +207,7 @@ - @@ -20,7 +21,7 @@ android:layout_centerVertical="true" android:layout_marginRight="8dp" android:gravity="center_vertical" - android:src="@drawable/action_plugin" + app:srcCompat="@drawable/action_plugin" android:contentDescription="@string/app_name" /> - - - + + diff --git a/cSploit/res/layout/plugin_sessions_layout.xml b/cSploit/src/main/res/layout/plugin_sessions_layout.xml similarity index 100% rename from cSploit/res/layout/plugin_sessions_layout.xml rename to cSploit/src/main/res/layout/plugin_sessions_layout.xml diff --git a/cSploit/res/layout/plugin_sessions_list_item.xml b/cSploit/src/main/res/layout/plugin_sessions_list_item.xml similarity index 100% rename from cSploit/res/layout/plugin_sessions_list_item.xml rename to cSploit/src/main/res/layout/plugin_sessions_list_item.xml diff --git a/cSploit/res/layout/plugin_traceroute.xml b/cSploit/src/main/res/layout/plugin_traceroute.xml similarity index 94% rename from cSploit/res/layout/plugin_traceroute.xml rename to cSploit/src/main/res/layout/plugin_traceroute.xml index 87219b024f..8ea01a9340 100644 --- a/cSploit/res/layout/plugin_traceroute.xml +++ b/cSploit/src/main/res/layout/plugin_traceroute.xml @@ -5,18 +5,6 @@ android:orientation="vertical" android:padding="8dp"> - - + + \ No newline at end of file diff --git a/cSploit/src/main/res/layout/target_empty.xml b/cSploit/src/main/res/layout/target_empty.xml new file mode 100644 index 0000000000..fc98985f9e --- /dev/null +++ b/cSploit/src/main/res/layout/target_empty.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/cSploit/res/layout/target_layout.xml b/cSploit/src/main/res/layout/target_layout.xml similarity index 74% rename from cSploit/res/layout/target_layout.xml rename to cSploit/src/main/res/layout/target_layout.xml index 0f07f7ffea..dbcf347382 100644 --- a/cSploit/res/layout/target_layout.xml +++ b/cSploit/src/main/res/layout/target_layout.xml @@ -15,6 +15,16 @@ android:layout_below="@+id/textView" android:animateLayoutChanges="true" /> + + + app:srcCompat="@drawable/ic_impossible" /> + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cSploit/res/raw/webdic.zip b/cSploit/src/main/res/raw/webdic.zip similarity index 100% rename from cSploit/res/raw/webdic.zip rename to cSploit/src/main/res/raw/webdic.zip diff --git a/cSploit/res/values-ar/strings.xml b/cSploit/src/main/res/values-ar/strings.xml similarity index 100% rename from cSploit/res/values-ar/strings.xml rename to cSploit/src/main/res/values-ar/strings.xml diff --git a/cSploit/res/values-cs/strings.xml b/cSploit/src/main/res/values-cs/strings.xml similarity index 95% rename from cSploit/res/values-cs/strings.xml rename to cSploit/src/main/res/values-cs/strings.xml index 00ae9776c3..358ad81298 100644 --- a/cSploit/res/values-cs/strings.xml +++ b/cSploit/src/main/res/values-cs/strings.xml @@ -7,6 +7,7 @@ Vyplňte přesměrovací údaje: Adresa Port + Porty Cíl neznámé Služby @@ -79,7 +80,7 @@ Opravdu zavřít? Pro ukončení aplikace stiskněte znovu ZPĚT - Vybráno  + Vybráno:   Na SD kartě nebyl nalezen žádný spoubor ze sezení Vyberte soubor ze sezení na SD kartě : Vyberte sezení @@ -293,6 +294,9 @@ Odeslat zprávu o chybě O aplikaci + Vyberte síťové rozhraní + Nejsou dostupná žádná síťová rozhraní + Vyberte vlastní porty Připravuji … @@ -371,6 +375,8 @@ Složka Povolit MSF Povolit the Metasploit Framework + Upozornění o stavu MSF + Zobrazit stav připojení MSF RPC Odtranit MSF Odstranit Metasploit Framework z vašeho zařízení Přejete si skutečně odstranit Metasploit Framework? @@ -385,9 +391,12 @@ Velikost Bufferu musí být mezi 1024 a 104857600. stálé sledování sítě nechat monitor sítě sledovat síť + Automatický sken portů + Vždy provést SYN sken k nalezení otevřených portů, když je objeven nový hostitel Hledač Exploitů Hledat chyby které souhlasí se slabinami + Spustit vše Sezení Sezení na PWNutém cíly. Spustit @@ -489,4 +498,11 @@ Dobrý Skvělý Excellentní + Zvolte cíl + Zvolit %s ? + Před nahlášením nového problému se, prosím, podívejte na již sepsané otevřené problémy, pravděpodobně byl již někým nahlášen. Pokud ještě nhlášen nebyl, budeme potřebovat co nejvíce informací, které můžete sehnat, takže si, prosím, přečtěte tuto příručku, kde se dozvíte, jak správně ohlásit Váš problém.

]]>
+ připojení ztraceno + smazat aktuální sezení a začít nové? + jakékoliv rozhraní + Chyba při načítání %s diff --git a/cSploit/res/values-de/strings.xml b/cSploit/src/main/res/values-de/strings.xml similarity index 100% rename from cSploit/res/values-de/strings.xml rename to cSploit/src/main/res/values-de/strings.xml diff --git a/cSploit/res/values-el/strings.xml b/cSploit/src/main/res/values-el/strings.xml similarity index 100% rename from cSploit/res/values-el/strings.xml rename to cSploit/src/main/res/values-el/strings.xml diff --git a/cSploit/res/values-es/strings.xml b/cSploit/src/main/res/values-es/strings.xml similarity index 100% rename from cSploit/res/values-es/strings.xml rename to cSploit/src/main/res/values-es/strings.xml diff --git a/cSploit/res/values-fi/strings.xml b/cSploit/src/main/res/values-fi/strings.xml similarity index 100% rename from cSploit/res/values-fi/strings.xml rename to cSploit/src/main/res/values-fi/strings.xml diff --git a/cSploit/res/values-fr/strings.xml b/cSploit/src/main/res/values-fr/strings.xml similarity index 100% rename from cSploit/res/values-fr/strings.xml rename to cSploit/src/main/res/values-fr/strings.xml diff --git a/cSploit/res/values-hr/strings.xml b/cSploit/src/main/res/values-hr/strings.xml similarity index 100% rename from cSploit/res/values-hr/strings.xml rename to cSploit/src/main/res/values-hr/strings.xml diff --git a/cSploit/res/values-it/strings.xml b/cSploit/src/main/res/values-it/strings.xml similarity index 99% rename from cSploit/res/values-it/strings.xml rename to cSploit/src/main/res/values-it/strings.xml index cb07f63da3..47c3817641 100644 --- a/cSploit/res/values-it/strings.xml +++ b/cSploit/src/main/res/values-it/strings.xml @@ -404,7 +404,7 @@ connetti a MetaSploit disconnetti da MetaSploit - connecsso a MetaSploit + connesso a MetaSploit connessione FALLITA! Il nuovo tema sarà applicato al prossimo riavvio dell\'applicazione diff --git a/cSploit/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml similarity index 74% rename from cSploit/res/values-nl/strings.xml rename to cSploit/src/main/res/values-nl/strings.xml index 14c3b62c0f..97287b4e03 100644 --- a/cSploit/res/values-nl/strings.xml +++ b/cSploit/src/main/res/values-nl/strings.xml @@ -8,23 +8,23 @@ Het lijkt erop dat je apparaat geen ARM ondersteund, helaas word je apparaat niet ondersteund door cSploit.

]]>
Voor meer informatie ga naar requirements section.

]]>
Het locale bestand dat je geselecteerd hebt, heeft cSploit geen toegang tot, we kunnen het niet lezen/in schrijven. - Build informatie + App informatie Complete BusyBox instalatie verplicht, killall binary is niet gevonden(misschien heb je een verouderde busybox) Annuleer Annuleer - Kan de core niet downloaden voor jou apparaat + De core kan niet gedownload worden voor jou apparaat Controleren… - Bestand is beschadigd - Kan het process niet starten + Het bestand is beschadigd + Het proces kan niet gestart worden Kies - Kies een aangepaste pad + Kies een aangepast pad Kies een optie Kies een branche: Kies  Kies een methode: Kies een bron: Verschoon - Verschoon het activitieiten log + Verschoon de activitieiten logboek Klik hier om te upgraden Dit zal cSploit afsluiten, weet je het zeker? Opdracht @@ -35,25 +35,25 @@ met sleutel ]]> !]]>
Verbinden… - Verbinding VERBROKEN! + Verbinding verbroken! ]]> GEFAALD.]]> - Kan de inhoud van de map niet lezen. - Kan geen WOL paket sturen naar het doelwit zonder gedetecteed te worden. + De inhoud van de map kan niet gelezen worden + Er kan geen WOL pakket gestuurd worden naar het doelwit zonder gedetecteed te worden. Crack - Voeg een beschrijving toe wat leidde naar de crash. - Een onverwachte fout trad toe, waardoor de app moest stoppen. Je kunt ons helpen door de crash-date naar ons toe te sturen door op OKE te drukken/ + Voeg een beschrijving toe over wat leidde tot de crash. + Er was een oververwachte fout opgetreden, waardoor de app moest stoppen. Je kunt ons helpen door de crash-data naar ons toe te sturen door op OKE te drukken/ cSploit is gecrashed. Oeps! Ik ben gecrashed, maar een report is onderweg naar onze ontwikkelaars om dit op te lossen. cSploit - Een Android netwerk pentesting applicatie Copyleft van Simone Margaritelli AKA evilsocket. - Deze applicatie mag alleen maar gebruikt worden om zijn functies te tonen, alleen op netwerken waarvan je toestemming heb gekregen om acties met deze applicatie uit te voeren. De ontwikkelaars van deze applicatie zijn voor niks aansprakelijk. Andere woorden: Doe geen domme dingen en stuur geen bozen mensen naar ons - Voeg een WiFi sleutel in of probeer het te kraken - Voeg de port lijst in + Deze applicatie mag alleen maar gebruikt worden om zijn functies te tonen op netwerken waarvan je toestemming heb gekregen om acties met deze applicatie uit te voeren. De ontwikkelaars van deze applicatie zijn voor niks aansprakelijk. Met andere woorden: Doe geen domme dingen en stuur geen bozen mensen naar ons + Voer een WiFi sleutel in of probeer het te kraken + Voer de port lijst in Aangepaste karakterset Java code - Aangepaste filter - Pas WOL poort aan en druk op Verstuurt + Aangepast filter + Pas WOL poort aan en druk op Verstuur Verwijder Verwijder vorige locatie? Apparaat Type: @@ -62,14 +62,14 @@ Update aan het downloaden… Dump verkeer naar Legen port lijst - Enter de karakters die je wilt gebruiken in het aangepaste karakterset: - Enter de url in van de afbeelding : - Plaats de js code in om te injecteren : - Voeg de omleidings details in: + Voer de karakters in die je wilt gebruiken in de aangepaste karakterset: + Voer de url in van de afbeelding : + Voer de js code in die je wilt injecteren: + Voer de omleidings details in: Voeg het sessie bestand toe : - Voeg een URL, host naam of IP adress in : - Voeg de gebruikersnaam in die je wilt gebruiken. - Voeg de URL in van de video : + Voer een URL, host naam of IP adress in : + Voer de gebruikersnaam in die je wilt gebruiken. + Voer de URL in van de video : Voeg de WiFi sleutel toe : Foutmelding Het lijkt erop dat je geen bestandbeheerder hebt die in je bestanden kan kijken, installeer er een. @@ -81,13 +81,13 @@ Ongeldige afbeelding URL. Ongeldige adress en/of port gespecificeerd. eindiging tags te gebruiken.]]> - Niet in staat om de HTTPS herleider te starten, kijk of je internet het wel doet + Niet in staat om de HTTPS herleider te starten, kijk of je een internet verbinding hebt Wat nodig is voor de MITM server word gebruikt door een ander proces, wil je applicatiebeheer opstarten? MITM modules hebben alle porten nodig. - Niet in staat om een proxy te creëren, kijk of je internet het goed doet. - Niet in staat om de bronnen server te bereiken, kijk of je internet het goed doet. + Niet in staat om een proxy te creëren, kijk of je een internet verbinding hebt. + Niet in staat om de bronnen server te bereiken, kijk of je een internet verbinding hebt. Een fout is voorgekomen tijdens het downloaden van de update. - Port is buiten bereik. + De port is buiten bereik. Wat nodig is voor de transparante proxy wordt gebruikt door een ander proces, wil je applicatiebeheer opstarten? Er is een fatale fout opgetreden. RPC fout @@ -97,30 +97,30 @@ Ongeldige YouTube video. ontduiking Afsluiten - Kies Payload - Kies Doelwit - Bewerk Opties + Kies een Payload + Kies een Doelwit + Bewerk de Opties Exploit vinder - Zoek voor een exploit dat passen bij de zwakbaarheden. + Zoek voor een exploit dat past bij de zwakke plekken. Lanceer Lanceer alles Uitpakken… - Uitpakken gefaald + Uitpakken mislukt Het lijkt erop dat je ROM het LD_LIBRARY_PATH bug, Het spijt me maar je apparaat wordt niet ondersteund door cSploit

]]>
Voor meer informatie ga naar FAQ.

]]>
Gelogde bestand - Voeg een aangepaste vervangings filter toe, inclusief simple string replacement or regular expressions. + Voeg een aangepast vervangings filter toe, inclusief simple string vervanging of reguliere expressies. Van (Jouw netwerk router) Sleutels aan het genereren… - Dit programma is vrije software: je kunt het herdistribueren en / of onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation, ofwel versie 3 van de Licentie, of (naar keuze) een latere versie. Dit programma wordt verspreid in de hoop dat het nuttig zal zijn, maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de GNU General Public License voor meer details. U moet een kopie van de GNU General Public License hebben ontvangen samen met dit programma. Zo niet, zie http://www.gnu.org/licenses/. + Dit programma is vrije software: je kunt het herdistribueren en/of onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation, ofwel versie 3 van de Licentie, of (naar keuze) een latere versie. Dit programma wordt verspreid in de hoop dat het nuttig zal zijn, maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de GNU General Public License voor meer details. U moet een kopie van de GNU General Public License hebben ontvangen samen met dit programma. Zo niet, zie http://www.gnu.org/licenses/. Heart aanval Heart aanval is opgedoken, de applicatie zou nu gaan kijken voor updates.#STATUS# - Hijack Sessie - Laad van bestand + Hijack sessie + Laad vanuit bestand Afbeelding Initialisatie Fout - Initialisatiestring… + Initialiseren… Service Inspecteur Voer een besturingssyteem en service inspectie uit op doelwit.(langzamer dan port scanner, maar specifieker) Fout opgetreden tijdens installatie! @@ -132,12 +132,12 @@ Ongeldige port \' Ongeldige poorten genoemd. Ongeldige sessie naam. - Ongeldige doelwit. + Ongeldig doelwit. links Licentie Veranderingen aan het laden… - Locale bestand - Locale afbeeldingen + Lokale bestanden + Lokale afbeeldingen Login Kraker Een erg snele netwerk login kraker die verschillende services ondersteund. Wachtwoordenlijst @@ -146,65 +146,65 @@ Maximale lengte Over Voeg toe - Gefocusde scan + Gefocuste scan Multi Actie Nieuwe Sessie Achterhaal hostnaam - Herstel Sessie - Sla Sessie op + Herstel sessie + Sla sessie op Scan Instellingen Stop Netwerk Monitor Stop MSFRPCD Raporteer een fout - WiFi Scan + WiFi scan Minimale lengte - de Core is niet geinstalleerd, de applicatie zal nu kijken voor updates. #STATUS# + de Core is niet geinstalleerd, de applicatie zal nu checken voor updates. #STATUS# MITM - Verbreek Connecties + Verbreek connecties Dit zal het doelwit weerhouden om alle sites te bereiken. Connectie verbreken zal alleen maar werken tegen één persoon. Aangepaste Filter Vervang een specifieke tekst op pagina\'s met een andere specifieke tekst. Voer diverse man-in-the-middle aanvallen uit, zoals netwerk sniffing, verkeer manipulatie, ect… - DNS Spoofing - Herleid alle domeinen naar een website/IP + DNS spoofing + Herleid alle domeinen naar een website of IP. Opgeslagen - Vervang Afbeeldingen + Vervang afbeeldingen Vervang alle afbeeldingen op een website met één specifieke afbeelding. - Wachtwoord Sniffer + Wachtwoord sniffer Sniff wachtwoorden van diverse protocole zoals https, ftp, imap, irc, msn, ect van doelwit - Gebruikersnaam/wachtwoorden velden + Gebruikersnaam/Wachtwoorden velden Herleid HTTP Herleid al het https verkeer naar een ander IP/website. Herleiding - Script Injectie + Script injectie Injecteer een javascript in elke website. - Sessie Hijacker + Sessie hijacker Luister naar cookies op het netwerk en hijack dan de sessie. - Simpele Sniffer + Simpele sniffer Herleid doelwit\'s verkeer door dit apparaat en laat wat statastieken zien terwijl hij dat in een pcap bestand zet. - Vervang Videos + Vervang videos Vervang alle YouTube video\'s op een website met één specifieke video. - Verbinding met MSF RPC Daemon maken GEFAALD! - Metasploit Status - MSF RPC Daemon heeft gefaald om het te starten + Verbinding met MSF RPC Daemon maken mislukt! + Metasploit status + Het is MSF RPC Daemon niet gelukt om te starten MSF RPC heeft de verbinding verbroken - MSF RPC Daemon afgesloten + MSF RPC Daemon is afgesloten Meerdere aanvallen - Netwerk Discovery heeft GEFAALD om te starten! + Het is Netwerk discovery niet gelukt om te starten! Netwerk discovery is gestart. - Netwerk discovery is gestopd. + Netwerk discovery is gestopt. Dit is jou netwerk subnet mask. App versie %s is beschikbaar, wil je updaten? Core versie %s is beschikbaar, wil je updaten? - Een update voor ruby gems + Een update voor Ruby Gems Een nieuwe MSF versie is beschikbaar, wil je updaten? Een MetasploitFramework update Een nieuwe versie van Ruby is beschikbaar, wil je updaten? Een update voor Ruby is beschikbaar Nieuwe sessie is gestart - een nieuwe update voor versie + Een nieuwe update voor versie is beschikbaar, wil je updaten? Nieuwe versie beschikbaar! @@ -215,21 +215,21 @@ De core is niet geinstalleerd, een netwerk connectie is nodig voor de eerste initialisatie Geen exploit is gestart. Geen exploits gevonden. - Geen specifieke informatie over de services op doelwits machine gevonden, voer eerst een service inspectie uit. + Geen specifieke informatie over de services op de doelwit machine(s) gevonden, voer eerst een service inspectie uit. Geen geopenende ports gedetecteed op dit doelwit, voer eerst een service inspectie uit. - Geen exploits gevonden op dit doelwit, voer Exploit vinder eerst. - Geen geopenende ports gevonden, voer eerst een port scanner uit voordat je een gefocusde scan selecteer. + Geen exploits gevonden op dit doelwit, voer de Exploit vinder eerst uit. + Geen geopenende ports gevonden, voer eerst een port scanner uit voordat je een gefocusde scan selecteerd. Er is geen geopende sessie voor dit doelwit Geen sessie bestand gevonden op jouw sd kaart. Geen updates beschikbaar. - Geen zwakbaarheden gevonden op dit doelwit, voer eerst de Exploit vinder uit - Geen WiFi connecties beschikbaar, the applicatie zal nu kijken voor updates, #STATUS# - Niets gevonden + Geen zwakke plekken gevonden op dit doelwit, voer eerst de Exploit vinder uit + Geen WiFi connecties beschikbaar, de applicatie zal nu kijken voor updates, #STATUS# + Niets gevonden]]> Deze applicatie kan alleen werken op apparaaten die ROOT hebben. Open shell Open URL - OS: - Paket Maker + OS + Pakket maker Maak en verstuur een aangepaste TCP of UDP packet naar het doelwit. Patching shebang Bewerk payload instellingen @@ -243,16 +243,16 @@ Kijk voor updates elke keer als de applicatie opstart Activeer het donkere thema, dat is makelijker voor de ogen Debug Error Logging - Activeer of deactiveer foutmelding logen voor een debug bestand. + Activeer of deactiveer foutmelding loggen voor een debug bestand. Code Profiler Activeer of deactiveer netwerk code profiler loggen. - Buffer groote moet zijn tussen 1024 en 104857600. - Een ander proces is aan het luisteren op dit port, gebruik een andere port. - het staat geen creaties van executables toe. - het bestaat niet. + Buffer groote moet tussen 1024 en 104857600 zijn. + Een ander proces heeft deze port ingebruik, gebruik een andere port. + Het staat geen creaties van executables toe. + bestaat niet. Ongeldig nummer. - Het port moet tussen 1024 en 65535 zijn. - Voorbeeld tijd moet zijn tussen 0.4 en 1.0. + De port moet tussen 1024 en 65535 zijn. + Voorbeeld tijd moet tussen 0.4 en 1.0 zijn. is niet schrijfbaar Map Algemeen @@ -260,23 +260,23 @@ Maximale buffer grote van de HTTP aanvraag wordt geregeld door de proxy HTTP Proxy Port MITM transparent proxy port om naar te luisteren, verander dit als je problemen hebt met de proxy - HTTP Server Port - MITM http server port om naar to luisteren, verander dit als je problemen hebt met het starten van de server + HTTP server port + MITM http server port om naar te luisteren, verander dit als je problemen hebt met het starten van de server SSL Stripping Herleid verkeer van HTTPS naar HTTP HTTPS herleider Port - MITM https herleidings server port om naar te luisteren + MITM HTTPS herleidings server port om naar te luisteren Modules Metasploit Framework De Metasploit Framework branch om te gebruiken - MSF Branch + MSF branch Kijk voor MSF updates Check voor MSF updates elke keer als de applicatie opstart Verwijder MSF Verwijder de Metasploit Framework van je apparaat Activeer MSF Activeer de Metasploit Framework - Aangepaste manifest + Aangepast manifest aangepaste MSF manifest URL MSF status notificaties Kijk naar de MSF RPC connectie status @@ -284,32 +284,32 @@ In deze map zit de Metasploit Framework. Wil je echt de Metasploit Framework verwijderen? Ongeveer %d MB zal verwijderd worden - Wachtwoord Sniffer Bestand + Wachtwoord sniffer bestand Naam van het bestand om de wachtwoord en cookies te loggen. Prestatie Zoek voor exploits Zoek naar zwakheden met Zoek voorkeuren - Wide host scan + Breede host scan Scan voor host buiten je netwerk mask - persistent network monitor - Zorgt ervoor de de netwerk monitor het netwerk blijft monitoren + Persistent network monitor + Zorg ervoor de de netwerk monitor het netwerk blijft monitoren RPC host Host waar de Metasploit RPC server is in RPC port - Port waarmee je verbind met Metasploit RPCD + Port waarmee je verbindt met Metasploit RPCD RPC wachtwoord Wachtwoord om te verbinden met Metasploit RPCD RPC gebruikt SSL - Specifikeer of Metasploit RPC SLL gebruikt + Specificeer of Metasploit RPC SSL gebruikt RPC gebruikersnaam Gebruikersnaam om te verbinden met Metasploit RPCD. Ruby map - Map waarin de ruby interpreters inzitten. + Map waarin de ruby interpreters in zitten. Sla pad op - Globale pad waar alle log bestanden worden opgeslagen - Sniffer Voorbeeld Tijd - Voorbeeld tijd is in secondens wanneer de sniffer modules het netwerk statastieken. + Global pad waar alle log bestanden worden opgeslagen + Sniffer voorbeeld tijd + Voorbeeld tijd is in seconden wanneer de sniffer modules het netwerk in kaart moet brengen. Donker Thema Updates App @@ -327,7 +327,7 @@ Klik nog een keer op terug om de app te sluiten Protocol Wil je het gesniffde verkeer opslaan in een pcap bestand? - aanvraag + Aanvraag De aanvraag kan niet leeg zijn. Aanvraag verstuurd. Verplicht @@ -342,16 +342,16 @@ Metasploit RPCD reageert niet Uitvoeren Opslaan - Sla Sessie op + Sla sessie op Opgeslagen Selecteer Specifieke Ports Scannen… Exacte versie matched Selecteer een module Selecteer Porten - Selecteer Sessie + Selecteer sessie Selecteer een sessie bestand van je sd kaart : - Selecteer een doelwit beneden , of druk er lang op om ze bijnamen te geven of om meerde aanvallen in een keer uit te voeren. + Selecteer een doelwit van beneden en druk er lang op om ze bijnamen te geven of om meerde aanvallen in een keer uit te voeren. Selecteer Woordenlijst Geselecteerd Geselecteerd:   @@ -359,7 +359,7 @@ Service Services Sessie opgeslagen naar %#160; - Sessie Sniffer + Sessie sniffer Sessies Sessie op doelwit Open een shell door te klikken op sessie , of see meer opties door er lang op te drukken. @@ -367,7 +367,7 @@ Geef de sessie bestand een naam : Bestand bevoegdheden aan het opzetten.. Beschrijving Exploit - Iets ging fout, selecteer opnieuw een geldige doelwit + Iets ging fout, selecteer opnieuw een geldig doelwit

Iets ging fout terwijl ik de changelog aan het ophalen was:

{DESCRIPTION}

]]>
Soort : Start @@ -398,16 +398,16 @@ Niet in staat om de update service te starten Een onverwachte fout gebeurde tijdens het lezen van het bestand : Geen informatie - untraced hops + Ongetraceerde hops Update Beschikbaar Update geannuleerd Updating RubyGems - Bebruikersnaam + Gebruikersnaam Video Exploits Vinder - Zoeken voor herkende zwakbaarheden op het doelwit die servieces draaien in de Nationale Zwakbaarheden Database. + Zoek voor bekende zwakke plekken van servieces die draaien op het doelwit in de Nationale Zakheden Database. Wachten op een antwoord - Wake on lan + Wordt wakker door lan Waarschuwing Een nieuwe sessie starten zou deze sessie verwijderen, doorgaan? WiFi geactiveerd @@ -419,10 +419,10 @@ WiFi sleutel gekopieerd naar plakbord Gescaned. Aan het scannen … - WiFi connectie ging weg. + WiFi connectie weg gevallen. Met sleutel Ja - Voordat je een problem reporteerd, lees alstublieft Raporteerd een probleem, Waarschijnlijk is het probleem al raporteerd, als dat niet zo is reporteer het dan met zo veel mogelijk informatie. Leesdit artikel Om te weten hoe je een probleem zo goed mogelijk te raporteren.

]]>
+ Voordat je een problem reporteerd, lees alstublieft raporteer een probleem, waarschijnlijk is het probleem al raporteerd, als dat niet zo is reporteer het dan met zo veel mogelijk informatie. Leesdit artikel om te weten hoe je een probleem zo goed mogelijk kan raporteren.

]]>
Selecteer %s ? Selecteer doelwit Beoordeling: %s @@ -434,7 +434,14 @@ Handmatig Normaal Ports - Automatische poort-scan + Automatische port-scan Scan altijd een doelwit met SYNC scanner als een doelwit gevonden word Aangepaste parameters + Elke interface + Verbinding verloren + Fout tijdens initialiseren %s + Verwijder huidige sessie en begin een nieuwe? + Kies een netwerk interface + Er zijn geen netwerk interface\'s beschikbaar + Net interfaces diff --git a/cSploit/res/values-no/strings.xml b/cSploit/src/main/res/values-no/strings.xml similarity index 100% rename from cSploit/res/values-no/strings.xml rename to cSploit/src/main/res/values-no/strings.xml diff --git a/cSploit/res/values-pl/strings.xml b/cSploit/src/main/res/values-pl/strings.xml similarity index 100% rename from cSploit/res/values-pl/strings.xml rename to cSploit/src/main/res/values-pl/strings.xml diff --git a/cSploit/res/values-pt/strings.xml b/cSploit/src/main/res/values-pt/strings.xml similarity index 92% rename from cSploit/res/values-pt/strings.xml rename to cSploit/src/main/res/values-pt/strings.xml index 16e9a3bac0..2033befc20 100644 --- a/cSploit/res/values-pt/strings.xml +++ b/cSploit/src/main/res/values-pt/strings.xml @@ -456,6 +456,42 @@ Ocorreu um erro inesperado forçando a aplicação ou um componente para parar. Por favor, ajude-nos a corrigir isso , enviando-nos os dados de erro , tudo que você tem a fazer é clicar \'OK\'. Você pode adicionar o seu comentário sobre o problema abaixo Biblioteca JNI já havia deixado de funcionar, eu espero que você envie o relatório. - - - + Qualquer Interface + Conexão Perdida + Deletar Sessão Atual e Iniciar Outra? + Erro ao Inicializar %s + Escolha uma interface de Rede + Não Há Interface de rede Disponível + Interfaces de rede + Resolver Nomes de Host + Spoofing de DNS + Salvo + Redirecionar Domínio para uma Web/IP Diferente. + Campos de Usuário/Senha + Selecionar %s ? + Selecionar Alvo + A Conexão com o MSF RPC daemon FALHOU! + Classificação: %s + Média + Excelente + Bom + Ótimo + Baixo + Manual + Normal + Status do Metasploit + MSF RPC daemon falhou ao Iniciar + MSF RPC daemon Morto + Descoberta de Rede Falhou ao Iniciar! + Versão do App %s está Disponível, Deseja Atualizar ? + Uma Nova Versão do MSF está disponível, deseja atualizar ? + Uma nova versão do Ruby está disponível,Deseja atualizar ? + Portas + Scan automático de portas + Sempre Usar SYS scan para portas abertas quando novos hosts forem descobertos + Notificação de estado do MSF + Visualizar estado de conexão do MSF RPC + Salvar + Salvo + Parametros personalizados + \ No newline at end of file diff --git a/cSploit/res/values-ru/strings.xml b/cSploit/src/main/res/values-ru/strings.xml similarity index 98% rename from cSploit/res/values-ru/strings.xml rename to cSploit/src/main/res/values-ru/strings.xml index 0218ed8b8e..b39b0271bc 100644 --- a/cSploit/res/values-ru/strings.xml +++ b/cSploit/src/main/res/values-ru/strings.xml @@ -203,9 +203,9 @@ Нажмите еще раз для остановки. Неизвестная ошибка при чтении файла: Порт - , который необходим для работы прозрачного прокси взят из другого процесса, откройте настройки приложения для исправления ошибки. - , который необходим для работы mitm сервера взят из другого процесса, откройте настройки приложения для исправления ошибки. - , который необходим для работы https редиректа взят из другого процесса, откройте настройки приложения для исправления ошибки. + , который необходим для работы прозрачного прокси занят другим процессом, откройте настройки приложения для исправления ошибки. + , который необходим для работы mitm сервера занят другим процессом, откройте настройки приложения для исправления ошибки. + , который необходим для работы https редиректа занят другим процессом, откройте настройки приложения для исправления ошибки. MITM модули требуют доступности всех портов. @@ -490,4 +490,8 @@ Выбрать цель Выбрать %s ? Перед открытием новой проблемы поищите посмотрите список в открытых проблем, возможно она уже открыта. Если нету сообщения о проблеме нам нужны как можно больше данных, так что пожайлуста прочитайте это руководство, чтобы знать как правильно сообщить о баге.

]]>
+ соединение потеряно + удалить текущую сессию и начать другую? + любой интерфейс + Ошибка инициализации %s diff --git a/cSploit/res/values-tr/strings.xml b/cSploit/src/main/res/values-tr/strings.xml similarity index 100% rename from cSploit/res/values-tr/strings.xml rename to cSploit/src/main/res/values-tr/strings.xml diff --git a/cSploit/res/values-zh-rCN/strings.xml b/cSploit/src/main/res/values-zh-rCN/strings.xml similarity index 99% rename from cSploit/res/values-zh-rCN/strings.xml rename to cSploit/src/main/res/values-zh-rCN/strings.xml index f530a16d5e..5fb8d86055 100644 --- a/cSploit/res/values-zh-rCN/strings.xml +++ b/cSploit/src/main/res/values-zh-rCN/strings.xml @@ -359,6 +359,8 @@ If not, see http://www.gnu.org/licenses/. 暗色主题 启用暗色主题,更加护眼 新的主题将在您重新启动应用后生效 + 端口自动扫描 + 自动使用SYN扫描发现的新主机端口 规避 精确版本 单击会话打开终端,或长按以查看更多选项。 diff --git a/cSploit/res/values/colors.xml b/cSploit/src/main/res/values/colors.xml similarity index 100% rename from cSploit/res/values/colors.xml rename to cSploit/src/main/res/values/colors.xml diff --git a/cSploit/res/values/strings.xml b/cSploit/src/main/res/values/strings.xml similarity index 97% rename from cSploit/res/values/strings.xml rename to cSploit/src/main/res/values/strings.xml index d03780c5c9..076cb5bdb7 100644 --- a/cSploit/res/values/strings.xml +++ b/cSploit/src/main/res/values/strings.xml @@ -190,7 +190,7 @@ (slower than port scanner, but more accurate).
Login cracker - A very fast network logon cracker which support many different + A very fast network logon cracker which supports many different services. Packet forger @@ -306,6 +306,9 @@ Submit issue About cSploit + Choose a network interface + There\'re no network interfaces available + Select Custom Ports Custom parameters @@ -320,7 +323,7 @@ Scanning finished. DNS spoofing - Redirect domains to a different web/IP + Redirect domains to a different web/IP. Saved @@ -435,6 +438,7 @@ Add Scan + Net interfaces WiFi scan Stop MSFRPCD @@ -529,4 +533,16 @@ Select %s ? https://github.com/cSploit/android/issues Before opening a new issue, please, take the time to read the already open issues, probably it\' s already open. If it\' s not open we\'ll need as much information as you can get, so please, read this guide in order to know how to report a bug properly.

]]>
+ connection lost + delete current session and start another? + any interface + Error initializing %s + + + csploit_channel + cSploit-related messages + + + Sorry, you need to approve all permission requests. + Thanks! diff --git a/cSploit/res/values/style.xml b/cSploit/src/main/res/values/style.xml similarity index 79% rename from cSploit/res/values/style.xml rename to cSploit/src/main/res/values/style.xml index 391ade399d..2f7ae26288 100644 --- a/cSploit/res/values/style.xml +++ b/cSploit/src/main/res/values/style.xml @@ -1,7 +1,7 @@ - - - diff --git a/cSploit/res/xml/preferences.xml b/cSploit/src/main/res/xml/preferences.xml similarity index 98% rename from cSploit/res/xml/preferences.xml rename to cSploit/src/main/res/xml/preferences.xml index 3d3e039ead..10abb995bf 100644 --- a/cSploit/res/xml/preferences.xml +++ b/cSploit/src/main/res/xml/preferences.xml @@ -1,5 +1,5 @@ - @@ -234,4 +234,4 @@ android:title="@string/pref_msf_delete" /> - + diff --git a/cSploit/src/org/csploit/android/ActionActivity.java b/cSploit/src/org/csploit/android/ActionActivity.java deleted file mode 100644 index 1fcba75a42..0000000000 --- a/cSploit/src/org/csploit/android/ActionActivity.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * This file is part of the dSploit. - * - * Copyleft of Simone Margaritelli aka evilsocket - * - * dSploit is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * dSploit is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with dSploit. If not, see . - */ -package org.csploit.android; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; - -import org.csploit.android.core.Plugin; -import org.csploit.android.core.System; -import org.csploit.android.gui.dialogs.FinishDialog; -import org.csploit.android.net.Target; - -import java.util.ArrayList; - -public class ActionActivity extends AppCompatActivity { - private ArrayList mAvailable = null; - private ListView theList; - private Target mTarget; - - @Override - public void onCreate(Bundle savedInstanceState) { - SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - Boolean isDark = themePrefs.getBoolean("isDark", false); - - if (isDark) - setTheme(R.style.DarkTheme); - else - setTheme(R.style.AppTheme); - super.onCreate(savedInstanceState); - - mTarget = System.getCurrentTarget(); - - if (mTarget != null) { - setTitle("cSploit > " + mTarget); - setContentView(R.layout.actions_layout); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - theList = (ListView) findViewById(R.id.android_list); - mAvailable = System.getPluginsForTarget(); - ActionsAdapter mActionsAdapter = new ActionsAdapter(); - theList.setAdapter(mActionsAdapter); - theList.setOnItemClickListener(new ListView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - - if (System.checkNetworking(ActionActivity.this)) { - Plugin plugin = mAvailable.get(position); - System.setCurrentPlugin(plugin); - - if (plugin.hasLayoutToShow()) { - Toast.makeText(ActionActivity.this, getString(R.string.selected) + getString(plugin.getName()), Toast.LENGTH_SHORT).show(); - - startActivity(new Intent( - ActionActivity.this, - plugin.getClass() - )); - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - } else - plugin.onActionClick(getApplicationContext()); - } - } - }); - } else { - new FinishDialog(getString(R.string.warning), getString(R.string.something_went_wrong), this).show(); - } - } - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - - onBackPressed(); - - return true; - - default: - return super.onOptionsItemSelected(item); - } - } - - - @Override - public void onBackPressed() { - super.onBackPressed(); - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - } - - public class ActionsAdapter extends ArrayAdapter { - public ActionsAdapter() { - super(ActionActivity.this, R.layout.actions_list_item, mAvailable); - } - - @SuppressLint("NewApi") - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View row = convertView; - ActionHolder holder; - - if (row == null) { - LayoutInflater inflater = (LayoutInflater) ActionActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - row = inflater.inflate(R.layout.actions_list_item, parent, false); - if (getSharedPreferences("THEME", 0).getBoolean("isDark", false)) - row.setBackgroundResource(R.drawable.card_background_dark); - holder = new ActionHolder(); - - holder.icon = (ImageView) (row != null ? row.findViewById(R.id.actionIcon) : null); - holder.name = (TextView) (row != null ? row.findViewById(R.id.actionName) : null); - holder.description = (TextView) (row != null ? row.findViewById(R.id.actionDescription) : null); - if (row != null) row.setTag(holder); - - } else holder = (ActionHolder) row.getTag(); - - Plugin action = mAvailable.get(position); - - holder.icon.setImageResource(action.getIconResourceId()); - holder.name.setText(getString(action.getName())); - holder.description.setText(getString(action.getDescription())); - - return row; - } - - public class ActionHolder { - ImageView icon; - TextView name; - TextView description; - } - } -} diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java deleted file mode 100644 index 0d1a076b98..0000000000 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ /dev/null @@ -1,1150 +0,0 @@ -/* - * This file is part of the dSploit. - * - * Copyleft of Simone Margaritelli aka evilsocket - * - * dSploit is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * dSploit is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with dSploit. If not, see . - */ -package org.csploit.android; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.graphics.Typeface; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.view.ActionMode; -import android.text.Html; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.Toast; - -import org.csploit.android.core.Child; -import org.csploit.android.core.Client; -import org.csploit.android.core.CrashReporter; -import org.csploit.android.core.Logger; -import org.csploit.android.core.ManagedReceiver; -import org.csploit.android.core.MultiAttackService; -import org.csploit.android.core.Plugin; -import org.csploit.android.core.System; -import org.csploit.android.events.Event; -import org.csploit.android.gui.dialogs.AboutDialog; -import org.csploit.android.gui.dialogs.ConfirmDialog; -import org.csploit.android.gui.dialogs.ConfirmDialog.ConfirmDialogListener; -import org.csploit.android.gui.dialogs.ErrorDialog; -import org.csploit.android.gui.dialogs.FatalDialog; -import org.csploit.android.gui.dialogs.InputDialog; -import org.csploit.android.gui.dialogs.InputDialog.InputDialogListener; -import org.csploit.android.gui.dialogs.MultipleChoiceDialog; -import org.csploit.android.gui.dialogs.SpinnerDialog; -import org.csploit.android.gui.dialogs.SpinnerDialog.SpinnerDialogListener; -import org.csploit.android.helpers.ThreadHelper; -import org.csploit.android.net.Network; -import org.csploit.android.net.Target; -import org.csploit.android.plugins.ExploitFinder; -import org.csploit.android.plugins.Inspector; -import org.csploit.android.plugins.LoginCracker; -import org.csploit.android.plugins.PacketForger; -import org.csploit.android.plugins.PortScanner; -import org.csploit.android.plugins.RouterPwn; -import org.csploit.android.plugins.Sessions; -import org.csploit.android.plugins.Traceroute; -import org.csploit.android.plugins.mitm.MITM; -import org.csploit.android.services.Services; -import org.csploit.android.services.UpdateChecker; -import org.csploit.android.services.UpdateService; -import org.csploit.android.services.receivers.MsfRpcdServiceReceiver; -import org.csploit.android.services.receivers.NetworkRadarReceiver; -import org.csploit.android.update.CoreUpdate; -import org.csploit.android.update.MsfUpdate; -import org.csploit.android.update.RubyUpdate; -import org.csploit.android.update.Update; - -import java.io.IOException; -import java.net.NoRouteToHostException; -import java.util.ArrayList; -import java.util.List; -import java.util.Observable; -import java.util.Observer; - -import static org.csploit.android.services.UpdateChecker.UPDATE_AVAILABLE; -import static org.csploit.android.services.UpdateChecker.UPDATE_CHECKING; -import static org.csploit.android.services.UpdateChecker.UPDATE_NOT_AVAILABLE; - -@SuppressLint("NewApi") -public class MainActivity extends AppCompatActivity { - private String UPDATE_MESSAGE; - private static final int WIFI_CONNECTION_REQUEST = 1012; - private boolean isWifiAvailable = false; - private TargetAdapter mTargetAdapter = null; - private NetworkRadarReceiver mRadarReceiver = new NetworkRadarReceiver(); - private UpdateReceiver mUpdateReceiver = new UpdateReceiver(); - private WipeReceiver mWipeReceiver = new WipeReceiver(); - private MsfRpcdServiceReceiver mMsfReceiver = new MsfRpcdServiceReceiver(); - private Menu mMenu = null; - private TextView mUpdateStatus = null; - private Toast mToast = null; - private long mLastBackPressTime = 0; - private ActionMode mActionMode = null; - private ListView lv; - private boolean isRootMissing = false; - - private void createUpdateStatusText() { - if (mUpdateStatus != null) return; - - RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); - - mUpdateStatus = new TextView(this); - - LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT); - - mUpdateStatus.setGravity(Gravity.CENTER); - mUpdateStatus.setLayoutParams(params); - - layout.addView(mUpdateStatus); - } - - - private void createUpdateLayout() { - - lv.setVisibility(View.GONE); - findViewById(R.id.textView).setVisibility(View.GONE); - - createUpdateStatusText(); - - mUpdateStatus - .setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); - - mUpdateReceiver.register(MainActivity.this); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } - - private void createOfflineLayout() { - - lv.setVisibility(View.GONE); - findViewById(R.id.textView).setVisibility(View.GONE); - - createUpdateStatusText(); - - mUpdateStatus.setText(getString(R.string.no_connectivity)); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } - - public void createOnlineLayout() { - findViewById(R.id.textView).setVisibility(View.VISIBLE); - lv.setVisibility(View.VISIBLE); - - if (mUpdateStatus != null) - mUpdateStatus.setVisibility(View.GONE); - - if (mTargetAdapter != null) { - mTargetAdapter.notifyDataSetChanged(); - return; - } - - mTargetAdapter = new TargetAdapter(); - - lv.setAdapter(mTargetAdapter); - - lv.setOnItemLongClickListener(new OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - Target t = (Target) mTargetAdapter.getItem(position); - if (t.getType() == Target.Type.NETWORK) { - if (mActionMode == null) - targetAliasPrompt(t); - return true; - } - if (mActionMode == null) { - mTargetAdapter.clearSelection(); - mActionMode = startSupportActionMode(mActionModeCallback); - } - mTargetAdapter.toggleSelection(position); - return true; - } - }); - - mRadarReceiver.register(MainActivity.this); - mUpdateReceiver.register(MainActivity.this); - mWipeReceiver.register(MainActivity.this); - mMsfReceiver.register(MainActivity.this); - - System.setTargetListObserver(mTargetAdapter); - - StartRPCServer(); - - // if called for the second time after wifi connection - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, - Intent intent) { - if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == RESULT_OK - && intent.hasExtra(WifiScannerActivity.CONNECTED)) { - System.reloadNetworkMapping(); - if(mTargetAdapter != null) { - mTargetAdapter.notifyDataSetChanged(); - } - try { - onCreate(null); - } catch (IllegalStateException e) { - // already attached. don't reattach. - } - } - } - - private void createLayout() { - boolean wifiAvailable = Network.isWifiConnected(this); - boolean connectivityAvailable = wifiAvailable || Network.isConnectivityAvailable(this); - boolean coreBeating = System.isCoreInitialized(); - - if (coreBeating && wifiAvailable) { - createOnlineLayout(); - } else if (connectivityAvailable) { - createUpdateLayout(); - } else { - createOfflineLayout(); - } - } - - private void onInitializationError(final String message) { - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - new FatalDialog(getString(R.string.initialization_error), - message, message.contains(">"), - MainActivity.this).show(); - } - }); - } - - private boolean startCore() { - isRootMissing = false; - try { - System.initCore(); - - return true; - } catch (System.SuException e) { - onInitializationError(getString(R.string.only_4_root)); - isRootMissing = true; - } catch (System.DaemonException e) { - Logger.error(e.getMessage()); - } - - return false; - } - - private void onCoreBeating() { - if (Client.hadCrashed()) { - Logger.warning("Client has previously crashed, building a crash report."); - CrashReporter.notifyNativeLibraryCrash(); - onInitializationError(getString(R.string.JNI_crash_detected)); - } - } - - private void onCoreUpdated() { - if (startCore()) { - onCoreBeating(); - } else if (isRootMissing) { - return; - } - - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - System.reloadNetworkMapping(); - createLayout(); - if (System.isInitialized()) - startNetworkRadar(); - } - }); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - Boolean isDark = themePrefs.getBoolean("isDark", false); - boolean connectivityAvailable; - - if (isDark) - setTheme(R.style.DarkTheme); - else - setTheme(R.style.AppTheme); - super.onCreate(savedInstanceState); - setContentView(R.layout.target_layout); - - lv = (ListView) findViewById(R.id.android_list); - lv.setOnItemClickListener(new ListView.OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - - if (mActionMode != null) { - ((TargetAdapter) lv.getAdapter()).toggleSelection(position); - return; - } - - Target target = (Target) mTargetAdapter.getItem(position); - System.setCurrentTarget(target); - - new Thread(new Runnable() { - @Override - public void run() { - - startActivityForResult(new Intent(MainActivity.this, - ActionActivity.class), WIFI_CONNECTION_REQUEST); - - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - - } - }).start(); - - Toast.makeText(MainActivity.this, - getString(R.string.selected_) + System.getCurrentTarget(), - Toast.LENGTH_SHORT).show(); - - } - }); - - isWifiAvailable = Network.isWifiConnected(this); - connectivityAvailable = isWifiAvailable || Network.isConnectivityAvailable(this); - - // make sure system object was correctly initialized during application - // startup - if (!System.isInitialized()) { - // wifi available but system failed to initialize, this is a fatal - // :( - if (isWifiAvailable) { - - // retry - try { - System.init(MainActivity.this.getApplicationContext()); - - System.registerPlugin(new RouterPwn()); - System.registerPlugin(new Traceroute()); - System.registerPlugin(new PortScanner()); - System.registerPlugin(new Inspector()); - System.registerPlugin(new ExploitFinder()); - System.registerPlugin(new LoginCracker()); - System.registerPlugin(new Sessions()); - System.registerPlugin(new MITM()); - System.registerPlugin(new PacketForger()); - } catch (Exception e) { - if (!(e instanceof NoRouteToHostException)) - System.errorLogging(e); - - onInitializationError(System.getLastError()); - - return; - } - } - } else { - System.reloadNetworkMapping(); - } - - boolean coreInstalled = System.isCoreInstalled(); - boolean coreBeating = System.isCoreInitialized(); - - if (coreInstalled && !coreBeating) { - coreBeating = startCore(); - if (coreBeating) { - onCoreBeating(); - } else if (isRootMissing) { - return; - } - } - - if (!connectivityAvailable) { - if (!coreInstalled) { - onInitializationError(getString(R.string.no_core_no_connectivity)); - return; - } else if (!coreBeating) { - onInitializationError(getString(R.string.heart_attack)); - return; - } - } - - if (!coreInstalled) { - UPDATE_MESSAGE = getString(R.string.missing_core_update); - } else if (!coreBeating) { - UPDATE_MESSAGE = getString(R.string.heart_attack_update); - } else if (!isWifiAvailable) { - UPDATE_MESSAGE = getString(R.string.no_wifi_available); - } - - if (connectivityAvailable) - startUpdateChecker(); - - if (coreBeating && isWifiAvailable) - startNetworkRadar(); - - createLayout(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main, menu); - - if (!isWifiAvailable) { - menu.findItem(R.id.add).setVisible(false); - menu.findItem(R.id.scan).setVisible(false); - menu.findItem(R.id.new_session).setEnabled(false); - menu.findItem(R.id.save_session).setEnabled(false); - menu.findItem(R.id.restore_session).setEnabled(false); - menu.findItem(R.id.ss_monitor).setEnabled(false); - menu.findItem(R.id.ss_msfrpcd).setEnabled(false); - } - - mMenu = menu; - - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem item = menu.findItem(R.id.ss_monitor); - - Services.getNetworkRadar().buildMenuItem(item); - - item = menu.findItem(R.id.ss_msfrpcd); - - Services.getMsfRpcdService().buildMenuItem(item); - - mMenu = menu; - - return super.onPrepareOptionsMenu(menu); - } - - private void targetAliasPrompt(final Target target) { - - new InputDialog(getString(R.string.target_alias), - getString(R.string.set_alias), - target.hasAlias() ? target.getAlias() : "", true, - false, MainActivity.this, new InputDialogListener() { - @Override - public void onInputEntered(String input) { - target.setAlias(input); - mTargetAdapter.notifyDataSetChanged(); - } - }).show(); - } - - private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - MenuInflater inflater = mode.getMenuInflater(); - inflater.inflate(R.menu.main_multi, menu); - return true; - } - - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - int i = mTargetAdapter.getSelectedCount(); - mode.setTitle(i + " " + getString((i > 1 ? R.string.targets_selected : R.string.target_selected))); - MenuItem item = menu.findItem(R.id.multi_action); - if (item != null) - item.setIcon((i > 1 ? android.R.drawable.ic_dialog_dialer : android.R.drawable.ic_menu_edit)); - return false; - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - ArrayList commonPlugins = null; - - switch (item.getItemId()) { - case R.id.multi_action: - final int[] selected = mTargetAdapter.getSelectedPositions(); - if (selected.length > 1) { - Target target = (Target) mTargetAdapter.getItem(selected[0]); - commonPlugins = System.getPluginsForTarget(target); - for (int i = 1; i < selected.length; i++) { - target = (Target) mTargetAdapter.getItem(selected[i]); - ArrayList targetPlugins = System.getPluginsForTarget(target); - ArrayList removeThem = new ArrayList(); - for (Plugin p : commonPlugins) { - if (!targetPlugins.contains(p)) - removeThem.add(p); - } - for (Plugin p : removeThem) { - commonPlugins.remove(p); - } - } - if (commonPlugins.size() > 0) { - final int[] actions = new int[commonPlugins.size()]; - for (int i = 0; i < actions.length; i++) - actions[i] = commonPlugins.get(i).getName(); - - (new MultipleChoiceDialog(R.string.choose_method, actions, MainActivity.this, new MultipleChoiceDialog.MultipleChoiceDialogListener() { - @Override - public void onChoice(int[] choices) { - Intent intent = new Intent(MainActivity.this, MultiAttackService.class); - int[] selectedActions = new int[choices.length]; - - for (int i = 0; i < selectedActions.length; i++) - selectedActions[i] = actions[choices[i]]; - - intent.putExtra(MultiAttackService.MULTI_TARGETS, selected); - intent.putExtra(MultiAttackService.MULTI_ACTIONS, selectedActions); - - startService(intent); - } - })).show(); - } else { - (new ErrorDialog(getString(R.string.error), "no common actions found", MainActivity.this)).show(); - } - } else { - targetAliasPrompt((Target) mTargetAdapter.getItem(selected[0])); - } - mode.finish(); // Action picked, so close the CAB - return true; - default: - return false; - } - } - - // called when the user exits the action mode - public void onDestroyActionMode(ActionMode mode) { - mActionMode = null; - mTargetAdapter.clearSelection(); - } - }; - - public void startUpdateChecker() { - if (System.getSettings().getBoolean("PREF_CHECK_UPDATES", true)) { - new UpdateChecker(this).start(); - } else { - MainActivity.this.sendBroadcast(new Intent(UPDATE_NOT_AVAILABLE)); - } - } - - public void startNetworkRadar() { - new Thread(new Runnable() { - @Override - public void run() { - Services.getNetworkRadar().start(); - } - }).start(); - } - - public void stopNetworkRadar() { - new Thread(new Runnable() { - @Override - public void run() { - Services.getNetworkRadar().stop(); - } - }).start(); - } - - /** - * start MSF RPC Daemon - */ - public void StartRPCServer() { - new Thread(new Runnable() { - @Override - public void run() { - if(Services.getMsfRpcdService().isAvailable()) - Services.getMsfRpcdService().start(); - } - }).start(); - } - - /** - * stop MSF RPC Daemon - */ - public void StopRPCServer() { - new Thread(new Runnable() { - @Override - public void run() { - Services.getMsfRpcdService().stop(); - } - }).start(); - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - - case R.id.add: - new InputDialog(getString(R.string.add_custom_target), - getString(R.string.enter_url), MainActivity.this, - new InputDialogListener() { - @Override - public void onInputEntered(String input) { - final Target target = Target.getFromString(input); - if (target != null) { - ThreadHelper.getSharedExecutor().execute(new Runnable() { - @Override - public void run() { - System.addOrderedTarget(target); - mTargetAdapter.update(null, null); - } - }); - } else - new ErrorDialog(getString(R.string.error), - getString(R.string.invalid_target), - MainActivity.this).show(); - } - }).show(); - return true; - - case R.id.scan: - startNetworkRadar(); - return true; - - case R.id.wifi_scan: - stopNetworkRadar(); - - mRadarReceiver.unregister(); - mUpdateReceiver.unregister(); - - startActivityForResult(new Intent(MainActivity.this, - WifiScannerActivity.class), WIFI_CONNECTION_REQUEST); - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - return true; - - case R.id.new_session: - new ConfirmDialog(getString(R.string.warning), - getString(R.string.warning_new_session), this, - new ConfirmDialogListener() { - @Override - public void onConfirm() { - try { - System.reset(); - mTargetAdapter.notifyDataSetChanged(); - - Toast.makeText( - MainActivity.this, - getString(R.string.new_session_started), - Toast.LENGTH_SHORT).show(); - } catch (Exception e) { - new FatalDialog(getString(R.string.error), e - .toString(), MainActivity.this).show(); - } - } - - @Override - public void onCancel() { - } - - }).show(); - - return true; - - case R.id.save_session: - new InputDialog(getString(R.string.save_session), - getString(R.string.enter_session_name), - System.getSessionName(), true, false, MainActivity.this, - new InputDialogListener() { - @Override - public void onInputEntered(String input) { - String name = input.trim().replace("/", "") - .replace("..", ""); - - if (!name.isEmpty()) { - try { - String filename = System.saveSession(name); - - Toast.makeText( - MainActivity.this, - getString(R.string.session_saved_to) - + filename + " .", - Toast.LENGTH_SHORT).show(); - } catch (IOException e) { - new ErrorDialog(getString(R.string.error), - e.toString(), MainActivity.this) - .show(); - } - } else - new ErrorDialog(getString(R.string.error), - getString(R.string.invalid_session), - MainActivity.this).show(); - } - }).show(); - return true; - - case R.id.restore_session: - final ArrayList sessions = System - .getAvailableSessionFiles(); - - if (sessions != null && sessions.size() > 0) { - new SpinnerDialog(getString(R.string.select_session), - getString(R.string.select_session_file), - sessions.toArray(new String[sessions.size()]), - MainActivity.this, new SpinnerDialogListener() { - @Override - public void onItemSelected(int index) { - String session = sessions.get(index); - - try { - System.loadSession(session); - mTargetAdapter.notifyDataSetChanged(); - } catch (Exception e) { - e.printStackTrace(); - new ErrorDialog(getString(R.string.error), - e.getMessage(), MainActivity.this) - .show(); - } - } - }).show(); - } else - new ErrorDialog(getString(R.string.error), - getString(R.string.no_session_found), MainActivity.this) - .show(); - return true; - - case R.id.settings: - startActivity(new Intent(MainActivity.this, SettingsActivity.class)); - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - return true; - - case R.id.ss_monitor: - new Thread(new Runnable() { - @Override - public void run() { - Services.getNetworkRadar().onMenuClick(MainActivity.this, item); - } - }).start(); - return true; - - case R.id.ss_msfrpcd: - new Thread(new Runnable() { - @Override - public void run() { - Services.getMsfRpcdService().onMenuClick(MainActivity.this, item); - } - }).start(); - return true; - - case R.id.submit_issue: - String uri = getString(R.string.github_new_issue_url); - Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); - startActivity(browser); - // for fat-tire: - // String.format(getString(R.string.issue_message), getString(R.string.github_issues_url), getString(R.string.github_new_issue_url)); - return true; - - case R.id.about: - new AboutDialog(this).show(); - return true; - - default: - return super.onOptionsItemSelected(item); - } - } - - - @Override - public void onBackPressed() { - if (mLastBackPressTime < java.lang.System.currentTimeMillis() - 4000) { - mToast = Toast.makeText(this, getString(R.string.press_back), - Toast.LENGTH_SHORT); - mToast.show(); - mLastBackPressTime = java.lang.System.currentTimeMillis(); - } else { - if (mToast != null) - mToast.cancel(); - - new ConfirmDialog(getString(R.string.exit), - getString(R.string.close_confirm), this, - new ConfirmDialogListener() { - @Override - public void onConfirm() { - MainActivity.this.finish(); - } - - @Override - public void onCancel() { - } - }).show(); - - mLastBackPressTime = 0; - } - } - - @Override - public void onDestroy() { - stopNetworkRadar(); - StopRPCServer(); - - mRadarReceiver.unregister(); - mUpdateReceiver.unregister(); - mWipeReceiver.unregister(); - mMsfReceiver.unregister(); - - // make sure no zombie process is running before destroying the activity - System.clean(true); - - super.onDestroy(); - } - - public class TargetAdapter extends BaseAdapter implements Runnable, Observer { - - private List list = System.getTargets(); - private boolean isDark = getSharedPreferences("THEME", 0).getBoolean("isDark", false); - - @Override - public int getCount() { - return list.size(); - } - - @Override - public Object getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return R.layout.target_list_item; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View row = convertView; - TargetHolder holder; - - if (row == null) { - LayoutInflater inflater = (LayoutInflater) MainActivity.this - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - row = inflater.inflate(R.layout.target_list_item, parent, false); - - if (isDark) - row.setBackgroundResource(R.drawable.card_background_dark); - - holder = new TargetHolder(); - holder.itemImage = (ImageView) (row != null ? row - .findViewById(R.id.itemIcon) : null); - holder.itemTitle = (TextView) (row != null ? row - .findViewById(R.id.itemTitle) : null); - holder.itemDescription = (TextView) (row != null ? row - .findViewById(R.id.itemDescription) : null); - holder.portCount = (TextView) (row != null ? row - .findViewById(R.id.portCount) : null); - holder.portCountLayout = (LinearLayout) (row != null ? row - .findViewById(R.id.portCountLayout) : null); - if (isDark) - holder.portCountLayout.setBackgroundResource(R.drawable.rounded_square_grey); - if (row != null) - row.setTag(holder); - } else - holder = (TargetHolder) row.getTag(); - - final Target target = list.get(position); - - if (target.hasAlias()){ - holder.itemTitle.setText(Html.fromHtml("" - + target.getAlias() + " ( " - + target.getDisplayAddress() + " )")); - } else { - holder.itemTitle.setText(target.toString()); - } - holder.itemTitle.setTextColor(ContextCompat.getColor(getApplicationContext(), (target.isConnected() ? R.color.app_color : R.color.gray_text))); - - holder.itemTitle.setTypeface(null, Typeface.NORMAL); - holder.itemImage.setImageResource(target.getDrawableResourceId()); - holder.itemDescription.setText(target.getDescription()); - - int openedPorts = target.getOpenPorts().size(); - - holder.portCount.setText(String.format("%d", openedPorts)); - holder.portCountLayout.setVisibility(openedPorts < 1 ? View.GONE : View.VISIBLE); - return row; - } - - public void clearSelection() { - for (Target t : list) - t.setSelected(false); - notifyDataSetChanged(); - if (mActionMode != null) - mActionMode.finish(); - } - - public void toggleSelection(int position) { - Target t = list.get(position); - t.setSelected(!t.isSelected()); - notifyDataSetChanged(); - if (mActionMode != null) { - if (getSelectedCount() > 0) - mActionMode.invalidate(); - else - mActionMode.finish(); - } - } - - public int getSelectedCount() { - int i = 0; - for (Target t : list) - if (t.isSelected()) - i++; - return i; - } - - public ArrayList getSelected() { - ArrayList result = new ArrayList(); - for (Target t : list) - if (t.isSelected()) - result.add(t); - return result; - } - - public int[] getSelectedPositions() { - int[] res = new int[getSelectedCount()]; - int j = 0; - - for (int i = 0; i < list.size(); i++) - if (list.get(i).isSelected()) - res[j++] = i; - return res; - } - - @Override - public void update(Observable observable, Object data) { - final Target target = (Target) data; - - if(target == null) { - // update the whole list - MainActivity.this.runOnUiThread(this); - return; - } - - // update only a row, if it's displayed - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - if(lv == null) - return; - int start = lv.getFirstVisiblePosition(); - for(int i=start, j=lv.getLastVisiblePosition();i<=j;i++) - if(target==list.get(i)){ - View view = lv.getChildAt(i-start); - getView(i, view, lv); - break; - } - } - }); - - } - - @Override - public void run() { - list = System.getTargets(); - notifyDataSetChanged(); - } - - class TargetHolder { - ImageView itemImage; - TextView itemTitle; - TextView itemDescription; - TextView portCount; - LinearLayout portCountLayout; - } - } - - private class WipeReceiver extends ManagedReceiver { - private IntentFilter mFilter = null; - - public WipeReceiver() { - mFilter = new IntentFilter(); - - mFilter.addAction(SettingsActivity.SETTINGS_WIPE_START); - } - - public IntentFilter getFilter() { - return mFilter; - } - - @Override - public void onReceive(Context context, Intent intent) { - - if (intent.getAction().equals(SettingsActivity.SETTINGS_WIPE_START)) { - try { - String path; - - if (intent.hasExtra(SettingsActivity.SETTINGS_WIPE_DIR)) { - path = intent.getStringExtra(SettingsActivity.SETTINGS_WIPE_DIR); - } else { - path = System.getRubyPath() + "' '" + System.getMsfPath(); - } - - StopRPCServer(); - System.getTools().raw.async("rm -rf '" + path + "'", new Child.EventReceiver() { - @Override - public void onEnd(int exitCode) { - MainActivity.this.sendBroadcast(new Intent(SettingsActivity.SETTINGS_WIPE_DONE)); - } - - @Override - public void onDeath(int signal) { - MainActivity.this.sendBroadcast(new Intent(SettingsActivity.SETTINGS_WIPE_DONE)); - } - - @Override - public void onEvent(Event e) { - } - }); - } catch (Exception e) { - System.errorLogging(e); - } - } - } - } - - private class UpdateReceiver extends ManagedReceiver { - private IntentFilter mFilter = null; - - public UpdateReceiver() { - mFilter = new IntentFilter(); - - mFilter.addAction(UPDATE_CHECKING); - mFilter.addAction(UPDATE_AVAILABLE); - mFilter.addAction(UPDATE_NOT_AVAILABLE); - mFilter.addAction(UpdateService.ERROR); - mFilter.addAction(UpdateService.DONE); - } - - public IntentFilter getFilter() { - return mFilter; - } - - private void onUpdateAvailable(final Update update, final boolean mandatory) { - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - new ConfirmDialog(getString(R.string.update_available), - update.prompt, MainActivity.this, new ConfirmDialogListener() { - @Override - public void onConfirm() { - StopRPCServer(); - Intent i = new Intent(MainActivity.this, UpdateService.class); - i.setAction(UpdateService.START); - i.putExtra(UpdateService.UPDATE, update); - - startService(i); - } - - @Override - public void onCancel() { - if (!mandatory) { - return; - } - - onInitializationError(getString(R.string.mandatory_update)); - } - } - ).show(); - } - }); - } - - private void onUpdateAvailable(Update update) { - onUpdateAvailable(update, (update instanceof CoreUpdate) && !System.isCoreInstalled()); - } - - private void onUpdateDone(Update update) { - - System.reloadTools(); - - if((update instanceof MsfUpdate) || (update instanceof RubyUpdate)) { - StartRPCServer(); - } - - if(update instanceof CoreUpdate) { - onCoreUpdated(); - } - - // restart update checker after a successful update - startUpdateChecker(); - } - - private void onUpdateError(final Update update, final int message) { - - if (update instanceof CoreUpdate) { - onInitializationError(getString(message)); - return; - } - - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - new ErrorDialog(getString(R.string.error), - getString(message), MainActivity.this).show(); - } - }); - - System.reloadTools(); - } - - @SuppressWarnings("ConstantConditions") - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - Update update = null; - - if(intent.hasExtra(UpdateService.UPDATE)) { - update = (Update) intent.getSerializableExtra(UpdateService.UPDATE); - } - - switch (action) { - case UPDATE_CHECKING: - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", getString(R.string.checking))); - break; - case UPDATE_NOT_AVAILABLE: - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( - "#STATUS#", getString(R.string.no_updates_available))); - - if (!System.isCoreInstalled()) { - onInitializationError(getString(R.string.no_core_found)); - } - break; - case UPDATE_AVAILABLE: - onUpdateAvailable(update); - break; - case UpdateService.DONE: - onUpdateDone(update); - break; - case UpdateService.ERROR: - int message = intent.getIntExtra(UpdateService.MESSAGE, R.string.error_occured); - onUpdateError(update, message); - break; - } - } - } -} \ No newline at end of file diff --git a/cSploit/src/org/csploit/android/SettingsActivity.java b/cSploit/src/org/csploit/android/SettingsActivity.java deleted file mode 100644 index 4a64f9787a..0000000000 --- a/cSploit/src/org/csploit/android/SettingsActivity.java +++ /dev/null @@ -1,588 +0,0 @@ -/* - * This file is part of the dSploit. - * - * Copyleft of Simone Margaritelli aka evilsocket - * - * dSploit is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * dSploit is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with dSploit. If not, see . - */ -package org.csploit.android; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.preference.EditTextPreference; -import android.support.v7.preference.ListPreference; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceFragmentCompat; -import android.support.v7.preference.TwoStatePreference; -import android.view.MenuItem; -import android.widget.Toast; - -import org.csploit.android.core.ChildManager; -import org.csploit.android.core.ExecChecker; -import org.csploit.android.core.Logger; -import org.csploit.android.core.System; -import org.csploit.android.gui.DirectoryPicker; -import org.csploit.android.gui.dialogs.ChoiceDialog; -import org.csploit.android.gui.dialogs.ConfirmDialog; -import org.csploit.android.net.GitHubParser; -import org.csploit.android.services.Services; -import org.csploit.android.tools.Raw; -import org.json.JSONException; - -import java.io.File; -import java.io.IOException; - -public class SettingsActivity extends AppCompatActivity { - - - public static final int SETTINGS_DONE = 1285; - public static final String SETTINGS_WIPE_START = "SettingsActivity.WIPE_START"; - public static final String SETTINGS_WIPE_DIR = "SettingsActivity.data.WIPE_DIR"; - public static final String SETTINGS_WIPE_DONE = "SettingsActivity.WIPE_DONE"; - public static final String SETTINGS_MSF_CHANGED = "SettingsActivity.MSF_CHANGED"; - public static final String SETTINGS_MSF_BRANCHES_AVAILABLE = "SettingsActivity.MSF_MSF_BRANCHES_AVAILABLE"; - - @SuppressWarnings("ConstantConditions") - @Override - protected void onCreate(Bundle savedInstanceState) { - SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - if (themePrefs.getBoolean("isDark", false)) - setTheme(R.style.PrefsThemeDark); - else - setTheme(R.style.PrefsTheme); - super.onCreate(savedInstanceState); - getSupportFragmentManager().beginTransaction() - .replace(android.R.id.content, new PrefsFrag()) - .commit(); - } - - - public static class PrefsFrag extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { - - - private Preference mSavePath = null; - private Preference mWipeMSF = null; - private Preference mRubyDir = null; - private Preference mMsfDir = null; - private EditTextPreference mSnifferSampleTime = null; - private EditTextPreference mProxyPort = null; - private EditTextPreference mServerPort = null; - private EditTextPreference mRedirectorPort = null; - private EditTextPreference mMsfPort = null; - private EditTextPreference mHttpBufferSize = null; - private EditTextPreference mPasswordFilename = null; - private TwoStatePreference mThemeChooser = null; - private TwoStatePreference mMsfEnabled = null; - private ListPreference mMsfBranch = null; - private int mMsfSize = 0; - private BroadcastReceiver mReceiver = null; - private Thread mBranchesWaiter = null; - - @Override - public void onCreate(Bundle savedInstanceState) { - SharedPreferences themePrefs = getActivity().getBaseContext().getSharedPreferences("THEME", 0); - if (themePrefs.getBoolean("isDark", false)) - getContext().setTheme(R.style.PrefsThemeDark); - else - getActivity().setTheme(R.style.PrefsTheme); - super.onCreate(savedInstanceState); - - mSavePath = getPreferenceScreen().findPreference("PREF_SAVE_PATH"); - mWipeMSF = getPreferenceScreen().findPreference("PREF_MSF_WIPE"); - mRubyDir = getPreferenceScreen().findPreference("RUBY_DIR"); - mMsfDir = getPreferenceScreen().findPreference("MSF_DIR"); - mMsfPort = (EditTextPreference) getPreferenceScreen().findPreference("MSF_RPC_PORT"); - mSnifferSampleTime = (EditTextPreference) getPreferenceScreen().findPreference("PREF_SNIFFER_SAMPLE_TIME"); - mProxyPort = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTP_PROXY_PORT"); - mServerPort = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTP_SERVER_PORT"); - mRedirectorPort = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTPS_REDIRECTOR_PORT"); - mHttpBufferSize = (EditTextPreference) getPreferenceScreen().findPreference("PREF_HTTP_MAX_BUFFER_SIZE"); - mPasswordFilename = (EditTextPreference) getPreferenceScreen().findPreference("PREF_PASSWORD_FILENAME"); - mThemeChooser = (TwoStatePreference) getPreferenceScreen().findPreference("PREF_DARK_THEME"); - mMsfBranch = (ListPreference) getPreferenceScreen().findPreference("MSF_BRANCH"); - mMsfEnabled = (TwoStatePreference) getPreferenceScreen().findPreference("MSF_ENABLED"); - - mThemeChooser.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - SharedPreferences themePrefs = getActivity().getBaseContext().getSharedPreferences("THEME", 0); - themePrefs.edit().putBoolean("isDark", (Boolean) newValue).commit(); - Toast.makeText(getActivity().getBaseContext(), getString(R.string.please_restart), Toast.LENGTH_LONG).show(); - return true; - } - }); - - mSavePath.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - startDirectoryPicker(preference); - return true; - } - }); - - if (mMsfEnabled.isEnabled()) - onMsfEnabled(); - } - - @Override - public void onCreatePreferences(Bundle bundle, String s) { - addPreferencesFromResource(R.xml.preferences); - } - - private void wipe_prompt() { - String message = getString(R.string.pref_msfwipe_message); - if (mMsfSize > 0) { - message += "\n" + String.format(getString(R.string.pref_msfwipe_size), mMsfSize); - } - new ConfirmDialog(getString(R.string.warning), message, getActivity(), new ConfirmDialog.ConfirmDialogListener() { - @Override - public void onConfirm() { - getActivity().sendBroadcast(new Intent(SETTINGS_WIPE_START)); - } - - @Override - public void onCancel() { - - } - }).show(); - } - - private void wipe_prompt_older(final File oldDir) { - new ConfirmDialog(getString(R.string.warning), getString(R.string.delete_previous_location), getActivity(), new ConfirmDialog.ConfirmDialogListener() { - @Override - public void onConfirm() { - Intent i = new Intent(SETTINGS_WIPE_START); - i.putExtra(SETTINGS_WIPE_DIR, oldDir.getAbsolutePath()); - getActivity().sendBroadcast(i); - } - - @Override - public void onCancel() { - - } - }).show(); - } - - private void measureMsfSize() { - try { - System.getTools().raw.async(String.format("du -xsm '%s' '%s'", System.getRubyPath(), System.getMsfPath()), - new Raw.RawReceiver() { - private int size = 0; - - @SuppressWarnings("StatementWithEmptyBody") - @Override - public void onNewLine(String line) { - if (line.isEmpty()) - return; - try { - int start, end; - for (start = 0; start < line.length() && java.lang.Character.isSpaceChar(line.charAt(start)); start++) - ; - for (end = start + 1; end < line.length() && java.lang.Character.isDigit(line.charAt(end)); end++) - ; - size += Integer.parseInt(line.substring(start, end)); - } catch (Exception e) { - System.errorLogging(e); - } - } - - @Override - public void onEnd(int exitCode) { - if (exitCode == 0) - mMsfSize = size; - } - }); - } catch (ChildManager.ChildNotStartedException e) { - Logger.error(e.getMessage()); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent) { - if (requestCode == DirectoryPicker.PICK_DIRECTORY && resultCode != RESULT_CANCELED) { - Bundle extras = intent.getExtras(); - String path; - String key; - File folder; - String oldPath = null; - - if (extras == null) { - Logger.debug("null extra: " + intent); - return; - } - - path = (String) extras.get(DirectoryPicker.CHOSEN_DIRECTORY); - key = (String) extras.get(DirectoryPicker.AFFECTED_PREF); - - if (path == null || key == null) { - Logger.debug("null path or key: " + intent); - return; - } - - folder = new File(path); - ExecChecker checker = null; - - - if (key.equals("RUBY_DIR")) { - oldPath = System.getRubyPath(); - checker = ExecChecker.ruby(); - } else if (key.equals("MSF_DIR")) { - oldPath = System.getMsfPath(); - checker = ExecChecker.msf(); - } - - if (!folder.exists()) - Toast.makeText(getActivity(), getString(R.string.pref_folder) + " " + path + " " + getString(R.string.pref_err_exists), Toast.LENGTH_SHORT).show(); - - else if (!folder.canWrite()) - Toast.makeText(getActivity(), getString(R.string.pref_folder) + " " + path + " " + getString(R.string.pref_err_writable), Toast.LENGTH_SHORT).show(); - - else if (checker != null && !checker.canExecuteInDir(path)) - Toast.makeText(getActivity(), getString(R.string.pref_folder) + " " + path + " " + getString(R.string.pref_err_executable), Toast.LENGTH_LONG).show(); - - else { - //noinspection ConstantConditions - getPreferenceManager().getSharedPreferences().edit().putString(key, path).commit(); - if (oldPath != null && !oldPath.equals(path)) { - File current = new File(oldPath); - - if (current.exists() && current.isDirectory() && current.listFiles().length > 2) { - wipe_prompt_older(current); - } - } - } - } - } - - private void startDirectoryPicker(Preference preference) { - Intent i = new Intent(getActivity(), DirectoryPicker.class); - i.putExtra(DirectoryPicker.AFFECTED_PREF, preference.getKey()); - startActivityForResult(i, DirectoryPicker.PICK_DIRECTORY); - } - - @SuppressWarnings("ConstantConditions") - @Override - public void onResume() { - super.onResume(); - getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - } - - @SuppressWarnings("ConstantConditions") - @Override - public void onPause() { - super.onPause(); - getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - } - - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - String message = null; - - if (key.equals("PREF_SNIFFER_SAMPLE_TIME")) { - double sampleTime; - - try { - sampleTime = Double.parseDouble(mSnifferSampleTime.getText()); - if (sampleTime < 0.4 || sampleTime > 1.0) { - message = getString(R.string.pref_err_sample_time); - sampleTime = 1.0; - } - } catch (Throwable t) { - message = getString(R.string.pref_err_invalid_number); - sampleTime = 1.0; - } - - mSnifferSampleTime.setText(Double.toString(sampleTime)); - } else if (key.endsWith("_PORT")) { - int port; - - try { - port = Integer.parseInt(mProxyPort.getText()); - if (port < 1024 || port > 65536) { - message = getString(R.string.pref_err_port_range); - port = 0; - } else if (!System.isPortAvailable(port)) { - message = getString(R.string.pref_err_busy_port); - port = 0; - } - } catch (Throwable t) { - message = getString(R.string.pref_err_invalid_number); - port = 0; - } - - if (key.equals("PREF_HTTP_PROXY_PORT")) { - System.HTTP_PROXY_PORT = port; - } else if (key.equals("PREF_HTTP_SERVER_PORT")) { - System.HTTP_SERVER_PORT = port; - } else if (key.equals("PREF_HTTPS_REDIRECTOR_PORT")) { - System.HTTPS_REDIR_PORT = port; - } else if (key.equals("MSF_RPC_PORT")) { - System.MSF_RPC_PORT = port; - } - - if (port == 0) { - // reset to default value - port = getDefaultPortForKey(key); - - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(key, Integer.toString(port)); - editor.apply(); - } - } else if (key.equals("PREF_HTTP_MAX_BUFFER_SIZE")) { - int maxBufferSize; - - try { - maxBufferSize = Integer.parseInt(mHttpBufferSize.getText()); - if (maxBufferSize < 1024 || maxBufferSize > 104857600) { - message = getString(R.string.pref_err_buffer_size); - maxBufferSize = 10485760; - } - } catch (Throwable t) { - message = getString(R.string.pref_err_invalid_number); - maxBufferSize = 10485760; - } - - mHttpBufferSize.setText(Integer.toString(maxBufferSize)); - } else if (key.equals("PREF_PASSWORD_FILENAME")) { - String passFileName; - - try { - passFileName = mPasswordFilename.getText(); - if (!passFileName.matches("[^/?*:;{}\\]+]")) { - message = getString(R.string.invalid_filename); - passFileName = "csploit-password-sniff.log"; - } - } catch (Throwable t) { - message = getString(R.string.invalid_filename); - passFileName = "csploit-password-sniff.log"; - } - - mPasswordFilename.setText(passFileName); - } else if (key.equals("MSF_ENABLED")) { - if (mMsfEnabled.isChecked()) - onMsfEnabled(); - } else if (key.equals("PREF_AUTO_PORTSCAN")) { - Services.getNetworkRadar().onAutoScanChanged(); - } - - if (message != null) - Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); - - System.onSettingChanged(key); - } - - private int getDefaultPortForKey(String key) { - switch (key) { - case "PREF_HTTP_PROXY_PORT": - return 8080; - case "PREF_HTTP_SERVER_PORT": - return 8081; - case "PREF_HTTPS_REDIRECTOR_PORT": - return 8082; - case "MSF_RPC_PORT": - return 55553; - default: - return 0; - } - } - - private void onMsfEnabled() { - // use mReceiver as "already did that" - if (mReceiver != null) - return; - - // start measureMsfSize ASAP - onMsfPathChanged(); - - Preference.OnPreferenceClickListener directoryPickerWithDefaultPath = new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - - final String currentValue; - final String defaultValue; - final String key = preference.getKey(); - - switch (key) { - case "RUBY_DIR": - currentValue = System.getRubyPath(); - defaultValue = System.getDefaultRubyPath(); - break; - case "MSF_DIR": - currentValue = System.getMsfPath(); - defaultValue = System.getDefaultMsfPath(); - break; - default: - return true; - } - - if (!currentValue.equals(defaultValue)) { - final Preference fPref = preference; - (new ChoiceDialog( - getActivity(), - getString(R.string.choose_an_option), - new String[]{getString(R.string.restore_default_path), getString(R.string.choose_a_custom_path)}, - new ChoiceDialog.ChoiceDialogListener() { - @Override - public void onChoice(int choice) { - if (choice == 0) { - // create default directory if it does not exists - File f = new File(defaultValue); - if (!f.exists()) - f.mkdirs(); - // simulate directory picker - Intent i = new Intent(); - i.putExtra(DirectoryPicker.AFFECTED_PREF, key); - i.putExtra(DirectoryPicker.CHOSEN_DIRECTORY, defaultValue); - onActivityResult(DirectoryPicker.PICK_DIRECTORY, RESULT_OK, i); - } else { - startDirectoryPicker(fPref); - } - } - } - )).show(); - } else { - startDirectoryPicker(preference); - } - return true; - } - }; - - mRubyDir.setDefaultValue(System.getDefaultRubyPath()); - mRubyDir.setOnPreferenceClickListener(directoryPickerWithDefaultPath); - - mMsfDir.setDefaultValue(System.getDefaultMsfPath()); - mMsfDir.setOnPreferenceClickListener(directoryPickerWithDefaultPath); - - mWipeMSF.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - wipe_prompt(); - return true; - } - }); - - getMsfBranches(); - - mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(SETTINGS_WIPE_DONE)) { - onMsfPathChanged(); - } else if (intent.getAction().equals(SETTINGS_MSF_BRANCHES_AVAILABLE)) { - onMsfBranchesAvailable(); - } - } - }; - IntentFilter filter = new IntentFilter(); - filter.addAction(SETTINGS_WIPE_DONE); - filter.addAction(SETTINGS_MSF_BRANCHES_AVAILABLE); - getActivity().registerReceiver(mReceiver, filter); - } - - private void getMsfBranches() { - if (mBranchesWaiter != null) { // run it once per settings activity - if (mBranchesWaiter.getState() == Thread.State.TERMINATED) - try { - mBranchesWaiter.join(); - } catch (InterruptedException e) { - Logger.error(e.getMessage()); - } - return; - } - - mMsfBranch.setEnabled(false); - mBranchesWaiter = new Thread(new Runnable() { - @Override - public void run() { - try { - GitHubParser.getMsfRepo().getBranches(); - getActivity().sendBroadcast(new Intent(SETTINGS_MSF_BRANCHES_AVAILABLE)); - } catch (JSONException e) { - System.errorLogging(e); - } catch (IOException e) { - Logger.error(e.getMessage()); - } - } - }); - mBranchesWaiter.start(); - } - - private void onMsfPathChanged() { - measureMsfSize(); - boolean haveMsf = false; - File dir; - File[] content; - - if ((dir = new File(System.getRubyPath())).isDirectory() || - (dir = new File(System.getMsfPath())).isDirectory()) { - content = dir.listFiles(); - haveMsf = content != null && content.length > 2; - } - - mWipeMSF.setEnabled(haveMsf); - } - - private void onMsfBranchesAvailable() { - String[] branches; - boolean hasRelease = false; - - try { - branches = GitHubParser.getMsfRepo().getBranches(); - mMsfBranch.setEntryValues(branches); - mMsfBranch.setEntries(branches); - for (int i = 0; !hasRelease && i < branches.length; i++) { - hasRelease = branches[i].equals("release"); - } - mMsfBranch.setDefaultValue((hasRelease ? "release" : "master")); - mMsfBranch.setEnabled(true); - } catch (JSONException e) { - System.errorLogging(e); - } catch (IOException e) { - Logger.error(e.getMessage()); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - getActivity().onBackPressed(); - return true; - - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - public void onDestroy() { - if (mReceiver != null) { - getActivity().unregisterReceiver(mReceiver); - mReceiver = null; - } - super.onDestroy(); - } - } - - @Override - public void onBackPressed() { - super.onBackPressed(); - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - } -} diff --git a/cSploit/src/org/csploit/android/WifiScannerActivity.java b/cSploit/src/org/csploit/android/WifiScannerActivity.java deleted file mode 100644 index ad1fdf3195..0000000000 --- a/cSploit/src/org/csploit/android/WifiScannerActivity.java +++ /dev/null @@ -1,652 +0,0 @@ -/* - * This file is part of the dSploit. - * - * Copyleft of Simone Margaritelli aka evilsocket - * - * dSploit is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * dSploit is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with dSploit. If not, see . - */ -package org.csploit.android; - -import android.app.ListActivity; -import android.app.ProgressDialog; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.graphics.Typeface; -import android.net.wifi.ScanResult; -import android.net.wifi.SupplicantState; -import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiManager; -import android.os.Bundle; -import android.support.v4.view.MenuItemCompat; -import android.text.ClipboardManager; -import android.text.Html; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.widget.Toast; - -import org.csploit.android.core.ManagedReceiver; -import org.csploit.android.core.System; -import org.csploit.android.gui.dialogs.ErrorDialog; -import org.csploit.android.gui.dialogs.InputDialog; -import org.csploit.android.gui.dialogs.InputDialog.InputDialogListener; -import org.csploit.android.gui.dialogs.WifiCrackDialog; -import org.csploit.android.gui.dialogs.WifiCrackDialog.WifiCrackDialogListener; -import org.csploit.android.wifi.Keygen; -import org.csploit.android.wifi.NetworkManager; -import org.csploit.android.wifi.WirelessMatcher; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import static android.net.wifi.WifiManager.EXTRA_NEW_STATE; -import static android.net.wifi.WifiManager.SCAN_RESULTS_AVAILABLE_ACTION; -import static android.net.wifi.WifiManager.SUPPLICANT_STATE_CHANGED_ACTION; - -@SuppressWarnings("deprecation") -public class WifiScannerActivity extends ListActivity -{ - public static final String CONNECTED = "WifiScannerActivity.CONNECTED"; - private WifiManager mWifiManager = null; - private WirelessMatcher mWifiMatcher = null; - private TextView mStatusText = null; - private ScanReceiver mScanReceiver = null; - private ConnectionReceiver mConnectionReceiver = null; - private ScanAdapter mAdapter = null; - private boolean mConnected = false; - private boolean mScanning = false; - private Menu mMenu = null; - private ScanResult mCurrentAp = null; - private List mKeyList = null; - private String mCurrentKey = null; - private int mCurrentNetworkId = -1; - private ClipboardManager mClipboard = null; - private WifiConfiguration mPreviousConfig = null; - - private void onEnd() { - List configurations = mWifiManager.getConfiguredNetworks(); - boolean restore = false; - - if(configurations != null) { - for(WifiConfiguration config : configurations){ - mWifiManager.enableNetwork(config.networkId, false); - restore = restore || (mPreviousConfig != null && mPreviousConfig.SSID.equals(config.SSID) && - ( mCurrentKey == null || !mCurrentKey.equals(mPreviousConfig.preSharedKey) ) ); - } - } - - if(restore && !mConnected) { - restorePreviousConfig(); - } - } - - private void restorePreviousConfig() { - WifiConfiguration config = NetworkManager.getWifiConfiguration(mWifiManager, mPreviousConfig); - - if(config != null) { - mWifiManager.removeNetwork(config.networkId); - } - - if(mWifiManager.addNetwork(mPreviousConfig) != -1) { - mWifiManager.saveConfiguration(); - } - - mPreviousConfig = null; - } - - public void onSuccessfulConnection(){ - if(mCurrentKey != null){ - mStatusText.setText(Html.fromHtml(getString(R.string.connected_to) + mCurrentAp.SSID + getString(R.string.connected_to2) + mCurrentKey + getString(R.string.connected_to3))); - Toast.makeText(this, getString(R.string.wifi_key_copied), Toast.LENGTH_SHORT).show(); - mClipboard.setText(mCurrentKey); - } else - mStatusText.setText(Html.fromHtml(getString(R.string.connected_to) + mCurrentAp.SSID + " !")); - - mConnectionReceiver.unregister(); - mConnected = true; - - onEnd(); - } - - public void onFailedConnection(){ - mWifiManager.removeNetwork(mCurrentNetworkId); - - if(!mKeyList.isEmpty()) { - nextConnectionAttempt(); - return; - } - - mStatusText.setText(Html.fromHtml(getString(R.string.connection_to) + mCurrentAp.SSID + getString(R.string.connection_to2))); - - List configurations = mWifiManager.getConfiguredNetworks(); - if(configurations != null){ - for(WifiConfiguration config : configurations){ - mWifiManager.enableNetwork(config.networkId, false); - } - } - - mConnectionReceiver.unregister(); - onEnd(); - } - - @Override - public void onCreate(Bundle savedInstanceState){ - super.onCreate(savedInstanceState); - SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - Boolean isDark = themePrefs.getBoolean("isDark", false); - if (isDark) - setTheme(R.style.DarkTheme); - else - setTheme(R.style.AppTheme); - setContentView(R.layout.wifi_scanner); - - mWifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); - mClipboard = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); - mWifiMatcher = new WirelessMatcher(getResources().openRawResource(R.raw.alice)); - mScanReceiver = new ScanReceiver(); - mConnectionReceiver = new ConnectionReceiver(); - mStatusText = (TextView) findViewById(R.id.scanStatusText); - mAdapter = new ScanAdapter(); - mKeyList = new ArrayList<>(); - - getListView().setAdapter(mAdapter); - - mStatusText.setText( getString(R.string.wifi_initializing) ); - - if(!mWifiManager.isWifiEnabled()){ - mStatusText.setText( getString(R.string.wifi_activating_iface) ); - mWifiManager.setWifiEnabled(true); - mStatusText.setText(getString(R.string.wifi_activated)); - } - - mScanReceiver.register(this); - - if(mMenu != null) { - MenuItem menuScan = mMenu.findItem(R.id.scan); - MenuItemCompat.setActionView(menuScan, new ProgressBar(this)); - } - - mStatusText.setText( getString(R.string.wifi_scanning) ); - mScanning = true; - - mWifiManager.startScan(); - } - - private int performConnection(final ScanResult ap, final String key){ - mWifiManager.disconnect(); - - mCurrentKey = key; - mCurrentAp = ap; - - WifiScannerActivity.this.runOnUiThread(new Runnable(){ - @Override - public void run(){ - if(key != null) - mStatusText.setText(Html.fromHtml( getString(R.string.wifi_attempting_to) + " " + ap.SSID + " " + getString(R.string.wifi_with_key) + " " + key + " ...")); - else - mStatusText.setText(Html.fromHtml( getString(R.string.wifi_connecting_to) + " " + ap.SSID + " ...")); - } - }); - - WifiConfiguration config = new WifiConfiguration(); - int network = -1; - - config.SSID = "\"" + ap.SSID + "\""; - config.BSSID = ap.BSSID; - - /* - * Configure security. - */ - if(ap.capabilities.contains("WEP")){ - config.wepKeys[0] = "\"" + key + "\""; - config.wepTxKeyIndex = 0; - config.status = WifiConfiguration.Status.ENABLED; - config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); - config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); - } else if(ap.capabilities.contains("WPA")) - config.preSharedKey = "\"" + key + "\""; - - else - config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); - - network = mWifiManager.addNetwork(config); - if(network != -1){ - if(mWifiManager.saveConfiguration()){ - config = NetworkManager.getWifiConfiguration(mWifiManager, config); - - // Make it the highest priority. - network = config.networkId; - - int old_priority = config.priority, - max_priority = NetworkManager.getMaxPriority(mWifiManager) + 1; - - if(max_priority > 9999){ - NetworkManager.shiftPriorityAndSave(mWifiManager); - config = NetworkManager.getWifiConfiguration(mWifiManager, config); - } - - // Set highest priority to this configured network - config.priority = max_priority; - network = mWifiManager.updateNetwork(config); - - if(network != -1){ - // Do not disable others - if(mWifiManager.enableNetwork(network, false)){ - if(mWifiManager.saveConfiguration()){ - // We have to retrieve the WifiConfiguration after save. - config = NetworkManager.getWifiConfiguration(mWifiManager, config); - if(config != null){ - // Disable others, but do not save. - // Just to force the WifiManager to connect to it. - if(mWifiManager.enableNetwork(config.networkId, true)){ - return mWifiManager.reassociate() ? config.networkId : -1; - } - } - } else - config.priority = old_priority; - } else - config.priority = old_priority; - } - } - } - - return network; - } - - private void nextConnectionAttempt(){ - if(mKeyList.size() > 0){ - mCurrentKey = mKeyList.get(0); - - mKeyList.remove(0); - - mCurrentNetworkId = performConnection(mCurrentAp, mCurrentKey); - if(mCurrentNetworkId != -1) - mConnectionReceiver.register(this); - - else - mConnectionReceiver.unregister(); - } else - mConnectionReceiver.unregister(); - } - - private void performCracking(final Keygen keygen, final ScanResult ap){ - - final ProgressDialog dialog = ProgressDialog.show(this, "", getString(R.string.generating_keys), true, false); - - new Thread(new Runnable(){ - @Override - public void run(){ - dialog.show(); - - try{ - List keys = keygen.getKeys(); - - if(keys == null || keys.size() == 0){ - WifiScannerActivity.this.runOnUiThread(new Runnable(){ - @Override - public void run(){ - new ErrorDialog( getString(R.string.error), keygen.getErrorMessage().isEmpty() ? getString(R.string.wifi_error_keys) : keygen.getErrorMessage(), WifiScannerActivity.this).show(); - } - }); - } - else{ - mCurrentAp = ap; - mKeyList = keys; - - nextConnectionAttempt(); - } - } - catch(Exception e){ - System.errorLogging(e); - } finally{ - dialog.dismiss(); - } - } - }).start(); - } - - @Override - protected void onListItemClick(ListView l, View v, int position, long id){ - super.onListItemClick(l, v, position, id); - - final ScanResult result = mAdapter.getItem(position); - if(result != null){ - final Keygen keygen = mWifiMatcher.getKeygen(result); - - mPreviousConfig = NetworkManager.getWifiConfiguration(mWifiManager, result); - - if(mPreviousConfig != null ) { - mWifiManager.removeNetwork(mPreviousConfig.networkId); - } - - if(keygen != null && (result.capabilities.contains("WEP") || result.capabilities.contains("WPA"))){ - mKeyList.clear(); - new WifiCrackDialog - ( - result.SSID, - getString(R.string.enter_key_or_crack), - this, - new WifiCrackDialogListener(){ - @Override - public void onManualConnect(String key){ - mCurrentNetworkId = performConnection(result, key); - if(mCurrentNetworkId != -1) - mConnectionReceiver.register(WifiScannerActivity.this); - - else - mConnectionReceiver.unregister(); - } - - @Override - public void onCrack(){ - performCracking(keygen, result); - } - } - ).show(); - } else{ - if(result.capabilities.contains("WEP") || result.capabilities.contains("WPA")){ - new InputDialog(result.SSID, getString(R.string.enter_wifi_key), null, true, true, this, new InputDialogListener(){ - @Override - public void onInputEntered(String input){ - mCurrentNetworkId = performConnection(result, input); - if(mCurrentNetworkId != -1) - mConnectionReceiver.register(WifiScannerActivity.this); - else - mConnectionReceiver.unregister(); - } - }).show(); - } else - performConnection(result, null); - } - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu){ - mMenu = menu; - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.wifi_scanner, menu); - - if(mScanning) { - MenuItem menuScan = mMenu.findItem(R.id.scan); - MenuItemCompat.setActionView(menuScan, new ProgressBar(this)); - } - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item){ - if(item.getItemId() == R.id.scan){ - if(mMenu != null){ - MenuItem menuScan = mMenu.findItem(R.id.scan); - MenuItemCompat.setActionView(menuScan, new ProgressBar(this)); - } - - mWifiManager.startScan(); - - mStatusText.setText(getString(R.string.scanning)); - mScanning = true; - - return true; - } - if(item.getItemId() == android.R.id.home){ - onBackPressed(); - return true; - } else - return super.onOptionsItemSelected(item); - } - - @Override - public void onBackPressed(){ - mScanReceiver.unregister(); - mConnectionReceiver.unregister(); - - Bundle bundle = new Bundle(); - bundle.putBoolean(CONNECTED, mConnected); - - Intent intent = new Intent(); - intent.putExtras(bundle); - - setResult(RESULT_OK, intent); - - super.onBackPressed(); - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - } - - public class ScanAdapter extends ArrayAdapter{ - private ArrayList mResults = null; - - public ScanAdapter(){ - super(WifiScannerActivity.this, R.layout.wifi_scanner_list_item); - - mResults = new ArrayList(); - } - - public void addResult(ScanResult result){ - for(ScanResult res : mResults){ - if(res.BSSID.equals(result.BSSID)) - return; - } - - mResults.add(result); - - Collections.sort(mResults, new Comparator(){ - @Override - public int compare(ScanResult lhs, ScanResult rhs){ - if(lhs.level > rhs.level) - return -1; - - else if(rhs.level > lhs.level) - return 1; - - else - return 0; - } - }); - } - - public void reset(){ - mResults.clear(); - notifyDataSetChanged(); - } - - @Override - public int getCount(){ - return mResults.size(); - } - - @Override - public ScanResult getItem(int position){ - return mResults.get(position); - } - - public int getWifiIcon(ScanResult wifi){ - int level = Math.abs(wifi.level); - - if(wifi.capabilities.contains("WPA") || wifi.capabilities.contains("WEP")){ - if(level <= 76) - return R.drawable.ic_wifi_lock_signal_4; - - else if(level <= 87) - return R.drawable.ic_wifi_lock_signal_3; - - else if(level <= 98) - return R.drawable.ic_wifi_lock_signal_2; - - else - return R.drawable.ic_wifi_lock_signal_1; - } else{ - if(level <= 76) - return R.drawable.ic_wifi_signal_4; - - else if(level <= 87) - return R.drawable.ic_wifi_signal_3; - - else if(level <= 98) - return R.drawable.ic_wifi_signal_2; - - else - return R.drawable.ic_wifi_signal_1; - } - } - - @Override - public View getView(int position, View convertView, ViewGroup parent){ - View row = convertView; - ResultHolder holder = null; - - if(row == null){ - LayoutInflater inflater = (LayoutInflater) WifiScannerActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - row = inflater.inflate(R.layout.wifi_scanner_list_item, parent, false); - - holder = new ResultHolder(); - - holder.supported = (ImageView) (row != null ? row.findViewById(R.id.supported) : null); - holder.powerIcon = (ImageView) (row != null ? row.findViewById(R.id.powerIcon) : null); - holder.ssid = (TextView) (row != null ? row.findViewById(R.id.ssid) : null); - holder.bssid = (TextView) (row != null ? row.findViewById(R.id.bssid) : null); - - if(row != null) - row.setTag(holder); - - } else{ - holder = (ResultHolder) row.getTag(); - } - - ScanResult result = mResults.get(position); - - holder.powerIcon.setImageResource(getWifiIcon(result)); - holder.ssid.setTypeface(null, Typeface.BOLD); - holder.ssid.setText(result.SSID); - - String protection = "Open"; - boolean isOpen = true; - - List capabilities = Arrays.asList(result.capabilities.split("[\\-\\[\\]]")); - - if(capabilities.contains("WEP")){ - isOpen = false; - protection = "WEP"; - } else if(capabilities.contains("WPA2")){ - isOpen = false; - protection = "WPA2"; - } else if(capabilities.contains("WPA")){ - isOpen = false; - protection = "WPA"; - } - - if(capabilities.contains("PSK")) - protection += " PSK"; - - if(capabilities.contains("WPS")) - protection += " ( WPS )"; - - holder.bssid.setText(Html.fromHtml( - result.BSSID.toUpperCase() + " " + protection + " ( " + (Math.round((result.frequency / 1000.0) * 10.0) / 10.0) + " Ghz )") - ); - - if(mWifiMatcher.getKeygen(result) != null || isOpen) - holder.supported.setImageResource(R.drawable.ic_possible); - - else - holder.supported.setImageResource(R.drawable.ic_impossible); - - - return row; - } - - class ResultHolder{ - ImageView supported; - ImageView powerIcon; - TextView ssid; - TextView bssid; - } - } - - private class ScanReceiver extends ManagedReceiver{ - private IntentFilter mFilter = null; - - public ScanReceiver(){ - mFilter = new IntentFilter(SCAN_RESULTS_AVAILABLE_ACTION); - } - - public IntentFilter getFilter(){ - return mFilter; - } - - @SuppressWarnings("ConstantConditions") - @Override - public void onReceive(Context context, Intent intent){ - if(intent.getAction().equals(SCAN_RESULTS_AVAILABLE_ACTION)){ - if(mScanning){ - mAdapter.reset(); - - if(mMenu != null){ - MenuItem menuScan = mMenu.findItem(R.id.scan); - MenuItemCompat.setActionView(menuScan, null); - } - - List results = mWifiManager.getScanResults(); - - for(ScanResult result : results){ - mAdapter.addResult(result); - } - - mScanning = false; - mStatusText.setText(getString(R.string.wifi_scan_finished)); - } - - mAdapter.notifyDataSetChanged(); - } - } - } - - private class ConnectionReceiver extends ManagedReceiver{ - private IntentFilter mFilter = null; - - public ConnectionReceiver(){ - mFilter = new IntentFilter(SUPPLICANT_STATE_CHANGED_ACTION); - } - - public IntentFilter getFilter(){ - return mFilter; - } - - @Override - public void onReceive(Context context, Intent intent){ - SupplicantState state = intent.getParcelableExtra(EXTRA_NEW_STATE); - - if(state != null){ - if(state.equals(SupplicantState.COMPLETED)){ - onSuccessfulConnection(); - } else if(state.equals(SupplicantState.DISCONNECTED)){ - onFailedConnection(); - } - } - } - } -} diff --git a/cSploit/src/org/csploit/android/helpers/NetworkHelper.java b/cSploit/src/org/csploit/android/helpers/NetworkHelper.java deleted file mode 100644 index 11c8ab981f..0000000000 --- a/cSploit/src/org/csploit/android/helpers/NetworkHelper.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.csploit.android.helpers; - -/** - * A class that provide some useful network-related static methods - */ -public final class NetworkHelper { - /** - * translate an OUI to it's integer representation - * @param macAddress the 6-byte array that represent a mac address - * @return the OUI integer - */ - public static int getOUICode(byte[] macAddress) { - return (macAddress[0] << 16) | (macAddress[1] << 8) | macAddress[2]; - } - - /** - * translate an OUI to it's integer representation - * @param hexOui a string that hold OUI in hexadecimal form ( e.g. "ACDE48" ) - * @return the OUI integer - */ - public static int getOUICode(String hexOui) { - return Integer.parseInt(hexOui, 16); - } -} diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/org/csploit/android/net/Network.java deleted file mode 100644 index 971948a1db..0000000000 --- a/cSploit/src/org/csploit/android/net/Network.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * This file is part of the dSploit. - * - * Copyleft of Simone Margaritelli aka evilsocket - * - * dSploit is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * dSploit is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with dSploit. If not, see . - */ -package org.csploit.android.net; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.DhcpInfo; -import android.net.NetworkInfo; -import android.net.wifi.WifiInfo; -import android.net.wifi.WifiManager; - -import org.apache.commons.net.util.SubnetUtils; - -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.NoRouteToHostException; -import java.net.SocketException; -import java.net.UnknownHostException; - -import org.csploit.android.core.Logger; -import org.csploit.android.core.System; - -public class Network -{ - public enum Protocol{ - TCP, - UDP, - ICMP, - IGMP, - UNKNOWN; - - public static Protocol fromString(String proto){ - - if(proto != null){ - proto = proto.toLowerCase(); - - if(proto.equals("tcp")) - return TCP; - - else if(proto.equals("udp")) - return UDP; - - else if(proto.equals("icmp")) - return ICMP; - - else if(proto.equals("igmp")) - return IGMP; - } - - return UNKNOWN; - } - - public String toString() - { - switch(this) - { - case ICMP: - return "icmp"; - case IGMP: - return "igmp"; - case TCP: - return "tcp"; - case UDP: - return "udp"; - default: - return "unknown"; - } - } - } - - private ConnectivityManager mConnectivityManager = null; - private WifiManager mWifiManager = null; - private DhcpInfo mInfo = null; - private WifiInfo mWifiInfo = null; - private NetworkInterface mInterface = null; - private IP4Address mGateway = null; - private IP4Address mNetmask = null; - private IP4Address mLocal = null; - private IP4Address mBase = null; - - /** see http://en.wikipedia.org/wiki/Reserved_IP_addresses - */ - private static final String[] PRIVATE_NETWORKS = { - "10.0.0.0/8", - "100.64.0.0/10", - "172.16.0.0/12", - "192.168.0.0/16" - }; - - public Network(Context context) throws SocketException, UnknownHostException{ - mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - mInfo = mWifiManager.getDhcpInfo(); - mWifiInfo = mWifiManager.getConnectionInfo(); - mLocal = new IP4Address(mInfo.ipAddress); - mGateway = new IP4Address(mInfo.gateway); - mNetmask = getNetmask(); - mBase = new IP4Address(mInfo.netmask & mInfo.gateway); - - if(isConnected() == false) - throw new NoRouteToHostException("Not connected to any WiFi access point."); - - else{ - try{ - mInterface = NetworkInterface.getByInetAddress(getLocalAddress()); - if(mInterface == null) - throw new IllegalStateException("Error retrieving network interface."); - } - catch(SocketException e){ - System.errorLogging(e); - /* - * Issue #26: Initialization error in ColdFusionX ROM - * - * It seems it's a ROM issue which doesn't correctly populate device descriptors. - * This rom maps the default wifi interface to a generic usb device - * ( maybe it's missing the specific interface driver ), which is obviously not, and - * it all goes shit, use an alternative method to obtain the interface object. - */ - mInterface = NetworkInterface.getByName(java.lang.System.getProperty("wifi.interface", "wlan0")); - - if(mInterface == null) - throw e; - } - } - } - - private IP4Address getNetmask() throws UnknownHostException { - IP4Address result = new IP4Address(mInfo.netmask); - - if(System.getSettings().getBoolean("WIDE_SCAN", false)) { - SubnetUtils privateNetwork; - - for(String cidr_notation : PRIVATE_NETWORKS) { - privateNetwork = new SubnetUtils(cidr_notation); - - if(privateNetwork.getInfo().isInRange(mLocal.toString())) { - result = new IP4Address(privateNetwork.getInfo().getNetmask()); - break; - } - } - } - - return result; - } - - public boolean equals(Network network){ - return mInfo.equals(network.getInfo()); - } - - public boolean isInternal(byte[] address) { - byte[] gateway = mGateway.toByteArray(); - byte[] mask = mNetmask.toByteArray(); - - for(int i = 0; i < gateway.length; i++) - if((gateway[i] & mask[i]) != (address[i] & mask[i])) - return false; - - return true; - } - - public boolean isInternal(String ip){ - try { - return isInternal(InetAddress.getByName(ip).getAddress()); - } catch (UnknownHostException e) { - Logger.error(e.getMessage()); - } - return false; - } - - public boolean isInternal(InetAddress address) { - return isInternal(address.getAddress()); - } - - public static boolean isWifiConnected(Context context){ - ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - - return info != null && info.isConnected() && info.isAvailable(); - } - - public static boolean isConnectivityAvailable(Context context){ - ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo info = manager.getActiveNetworkInfo(); - - return info != null && info.isConnected(); - } - - public boolean isConnected(){ - return mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected(); - } - - public String getSSID(){ - return mWifiInfo.getSSID(); - } - - public int getNumberOfAddresses(){ - return IP4Address.ntohl(~mNetmask.toInteger()); - } - - public IP4Address getStartAddress(){ - return mBase; - } - - public String getNetworkMasked(){ - int network = mBase.toInteger(); - - return (network & 0xFF) + "." + ((network >> 8) & 0xFF) + "." + ((network >> 16) & 0xFF) + "." + ((network >> 24) & 0xFF); - } - - public String getNetworkRepresentation(){ - return getNetworkMasked() + "/" + mNetmask.getPrefixLength(); - } - - public DhcpInfo getInfo(){ - return mInfo; - } - - public InetAddress getNetmaskAddress(){ - return mNetmask.toInetAddress(); - } - - public InetAddress getGatewayAddress(){ - return mGateway.toInetAddress(); - } - - public byte[] getGatewayHardware(){ - return Endpoint.parseMacAddress(mWifiInfo.getBSSID()); - } - - public byte[] getLocalHardware(){ - try{ - return mInterface.getHardwareAddress(); - } - catch(SocketException e){ - System.errorLogging(e); - } - - return null; - } - - public String getLocalAddressAsString(){ - return mLocal.toString(); - } - - public InetAddress getLocalAddress(){ - return mLocal.toInetAddress(); - } - - public NetworkInterface getInterface(){ - return mInterface; - } -} diff --git a/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java b/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java new file mode 100644 index 0000000000..dc67cbfc29 --- /dev/null +++ b/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java @@ -0,0 +1,45 @@ +package org.csploit.android.helpers; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import java.net.InetAddress; + +import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +/** + * Test NetworkHelper class + */ +public class NetworkHelperTest extends TestCase { + + public void testGetOUICode() throws Exception { + byte[] address = new byte[] { 0x01, 0x02, 0x03 }; + + int fromString = NetworkHelper.getOUICode("010203"); + int fromMAC = NetworkHelper.getOUICode(address); + + Assert.assertEquals(fromString + " differs from " + fromMAC, fromString, fromMAC); + } + + public void testComapreInetAddress() throws Exception { + InetAddress a, b; + + a = InetAddress.getLocalHost(); + b = InetAddress.getByAddress("127.0.0.1", new byte[] {127, 0, 0, 1}); + + assertThat(a, is(b)); + + int res = NetworkHelper.compareInetAddresses(a, b); + + assertThat(res, is(0)); + + b = InetAddress.getByAddress(new byte[] {(byte) 192, (byte) 168, 1, 1}); + + assertThat(a, not(b)); + + res = NetworkHelper.compareInetAddresses(a, b); + + assertThat(a + " should be less than " + b, res < 0, is(true)); + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..6b5ce54ee5 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +android.enableJetifier=true +android.useAndroidX=true +android.enableR8 = true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 714c31b24f..e55a7e35d7 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Sep 24 21:38:44 PDT 2015 +#Tue Oct 17 19:27:29 PDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/nightly-build.sh b/nightly-build.sh index a738690e08..105d4deb8c 100755 --- a/nightly-build.sh +++ b/nightly-build.sh @@ -49,7 +49,7 @@ cd "${DIR}" >&3 2>&1 || die echo -n -e "${YELLOW}Cleaning old files${RESET}\n" | tee >(cat - >&3) LAST_APK=$(readlink "${NIGHTLIES_OUT_DIR}/cSploit-lastest.apk") -find $NIGHTLIES_OUT_DIR -type f -a -mtime +${MAX_DAYS} -a ! -name "${LAST_APK}" -exec rm -f "{}" \; >&3 2>&1 +# find $NIGHTLIES_OUT_DIR -type f -a -mtime +${MAX_DAYS} -a ! -name "${LAST_APK}" -exec rm -f "{}" \; >&3 2>&1 find $LOG_DIR -type f -a -mtime +${MAX_DAYS} -exec rm -f "{}" \; >&3 2>&1 echo -n -e "${CYAN}Syncing git repo...${RESET}\n" | tee >(cat - >&3)