From b0cad225410df353805452be53deae683aeb4402 Mon Sep 17 00:00:00 2001 From: ga Date: Wed, 16 Sep 2015 14:12:35 +0200 Subject: [PATCH 001/110] allow to use any configured network interface --- cSploit/res/menu/main.xml | 6 + cSploit/res/values/strings.xml | 4 + .../csploit/android/CSploitApplication.java | 3 +- .../src/org/csploit/android/MainActivity.java | 266 ++++++++++++------ .../src/org/csploit/android/core/System.java | 42 +-- .../src/org/csploit/android/net/Network.java | 130 ++++++++- 6 files changed, 340 insertions(+), 111 deletions(-) diff --git a/cSploit/res/menu/main.xml b/cSploit/res/menu/main.xml index 4c7e0ab004..fa8fb0a2f8 100644 --- a/cSploit/res/menu/main.xml +++ b/cSploit/res/menu/main.xml @@ -19,6 +19,12 @@ csploit:showAsAction="ifRoom" android:title="@string/menu_wifi_scan" /> + + Submit Issue About + Choose a network interface + There\'re no network interfaces available + Select Custom Ports Initializing … @@ -427,6 +430,7 @@ Add Scan + Net interfaces WiFi Scan Stop msfrpcd diff --git a/cSploit/src/org/csploit/android/CSploitApplication.java b/cSploit/src/org/csploit/android/CSploitApplication.java index d6e1195525..fe75da0f00 100644 --- a/cSploit/src/org/csploit/android/CSploitApplication.java +++ b/cSploit/src/org/csploit/android/CSploitApplication.java @@ -25,6 +25,7 @@ import org.acra.ReportingInteractionMode; import org.acra.annotation.ReportsCrashes; import org.acra.sender.HttpSender; +import org.csploit.android.core.Logger; import org.csploit.android.core.System; import org.csploit.android.plugins.ExploitFinder; import org.csploit.android.plugins.Inspector; @@ -66,7 +67,7 @@ public void onCreate() { // initialize the system try { - System.init(this); + System.init(this, null); } catch (Exception e) { // ignore exception when the user has wifi off if (!(e instanceof NoRouteToHostException)) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index bc1f7d2cc1..300ba2b33d 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -61,12 +61,14 @@ import org.csploit.android.core.UpdateService; 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; @@ -102,9 +104,9 @@ @SuppressLint("NewApi") public class MainActivity extends ActionBarActivity implements NetworkRadar.TargetListener { - private String UPDATE_MESSAGE; + private String UPDATE_MESSAGE = ""; private static final int WIFI_CONNECTION_REQUEST = 1012; - private boolean isWifiAvailable = false; + private boolean isAnyNetInterfaceAvailable = false; private TargetAdapter mTargetAdapter = null; private NetworkRadar mNetworkRadar = null; private Child mMsfRpcd = null; @@ -117,14 +119,15 @@ public class MainActivity extends ActionBarActivity implements NetworkRadar.Targ private long mLastBackPressTime = 0; private ActionMode mActionMode = null; private ListView lv; + private static String mIface = null; + private String[] mIfacesList = null; + private boolean mIsOnlineLayout = 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); @@ -139,10 +142,11 @@ private void createUpdateLayout() { lv.setVisibility(View.GONE); findViewById(R.id.textView).setVisibility(View.GONE); - createUpdateStatusText(); + mUpdateStatus.setVisibility(View.VISIBLE); - mUpdateStatus - .setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); + if (mUpdateStatus != null) + mUpdateStatus + .setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); mUpdateReceiver.register(MainActivity.this); @@ -155,12 +159,14 @@ private void createOfflineLayout() { lv.setVisibility(View.GONE); findViewById(R.id.textView).setVisibility(View.GONE); - createUpdateStatusText(); + mUpdateStatus.setVisibility(View.VISIBLE); mUpdateStatus.setText(getString(R.string.no_connectivity)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu(); + + mIsOnlineLayout = false; } public void createOnlineLayout() { @@ -168,7 +174,7 @@ public void createOnlineLayout() { lv.setVisibility(View.VISIBLE); if (mUpdateStatus != null) - mUpdateStatus.setVisibility(View.GONE); + mUpdateStatus.setVisibility(View.INVISIBLE); if (mTargetAdapter != null) return; @@ -202,6 +208,8 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l // if called for the second time after wifi connection if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu(); + + mIsOnlineLayout = true; } @Override @@ -209,7 +217,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == RESULT_OK && intent.hasExtra(WifiScannerActivity.CONNECTED)) { - System.reloadNetworkMapping(); + System.reloadNetworkMapping(mIface); try { onCreate(null); } catch (IllegalStateException e) { @@ -219,11 +227,10 @@ protected void onActivityResult(int requestCode, int resultCode, } private void createLayout() { - boolean wifiAvailable = Network.isWifiConnected(this); - boolean connectivityAvailable = wifiAvailable || Network.isConnectivityAvailable(this); + boolean connectivityAvailable = isAnyNetInterfaceAvailable && Network.isConnectivityAvailable(this); boolean coreBeating = System.isCoreInitialized(); - if (coreBeating && wifiAvailable) { + if (coreBeating && (isAnyNetInterfaceAvailable || Network.isConnectivityAvailable(this))) { createOnlineLayout(); } else if (connectivityAvailable) { createUpdateLayout(); @@ -247,8 +254,8 @@ private void onCoreUpdated() { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - System.reloadNetworkMapping(); - createLayout(); + System.reloadNetworkMapping(mIface); + createOnlineLayout(); startNetworkRadar(true); } }); @@ -267,6 +274,14 @@ public void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); setContentView(R.layout.target_layout); + mUpdateStatus = new TextView(this); + RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); + LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT); + mUpdateStatus.setGravity(Gravity.CENTER); + mUpdateStatus.setLayoutParams(params); + layout.addView(mUpdateStatus); + mUpdateStatus.setVisibility(View.GONE); lv = (ListView) findViewById(R.id.android_list); lv.setOnItemClickListener(new ListView.OnItemClickListener() { @@ -295,93 +310,73 @@ public void run() { 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; - } - } - } + mIfacesList = new String[Network.getAvailableInterfaces().size()]; + isAnyNetInterfaceAvailable = (mIfacesList.length > 0); + connectivityAvailable = Network.isConnectivityAvailable(this); boolean coreInstalled = System.isCoreInstalled(); boolean coreBeating = System.isCoreInitialized(); - if (coreInstalled && !coreBeating) { - try { - System.initCore(); - coreBeating = true; + // check minimum requirements for system initialization + + if (!coreInstalled) { + UPDATE_MESSAGE = getString(R.string.missing_core_update); + + createUpdateLayout(); + startUpdateChecker(); - if(Client.hadCrashed()) { - Logger.warning("Client has previously crashed, building a crash report."); - CrashReporter.notifyNativeLibraryCrash(); - onInitializationError(getString(R.string.JNI_crash_detected)); - } - } catch (System.SuException e) { - onInitializationError(getString(R.string.only_4_root)); return; - } catch (System.DaemonException e) { - Logger.error(e.getMessage()); - } } + if (!coreBeating) { + try { + System.initCore(); + coreBeating = true; - if (!connectivityAvailable) { - if (!coreInstalled) { - onInitializationError(getString(R.string.no_core_no_connectivity)); - return; - } else if (!coreBeating) { - onInitializationError(getString(R.string.heart_attack)); + if(Client.hadCrashed()) { + Logger.warning("Client has previously crashed, building a crash report."); + CrashReporter.notifyNativeLibraryCrash(); + onInitializationError(getString(R.string.JNI_crash_detected)); + } + } catch (System.SuException e) { + onInitializationError(getString(R.string.only_4_root)); return; + } catch (System.DaemonException e) { + Logger.error(e.getMessage()); + + UPDATE_MESSAGE = getString(R.string.heart_attack_update); + createOfflineLayout(); } } - - if (!coreInstalled) { - UPDATE_MESSAGE = getString(R.string.missing_core_update); - } else if (!coreBeating) { + // still not beating + if (System.isCoreInitialized() == false) { UPDATE_MESSAGE = getString(R.string.heart_attack_update); - } else if (!isWifiAvailable) { - UPDATE_MESSAGE = getString(R.string.no_wifi_available); + createOfflineLayout(); + return; } - if (connectivityAvailable) - startUpdateChecker(); + // if all is initialized, configure the network - if (coreBeating && isWifiAvailable) - startNetworkRadar(true); + // make sure system object was correctly initialized during application + // startups + if (!System.isInitialized()) { + mUpdateStatus.setText("initiating... please wait"); + displayNetworkInterfaces(false); + return; + } + if (isAnyNetInterfaceAvailable) { + mUpdateStatus.setText("initiating... please wait"); - if (!MsfRpcd.isLocal() || System.getLocalMsfVersion() != null) - StartRPCServer(); + if (!MsfRpcd.isLocal() || System.getLocalMsfVersion() != null) + StartRPCServer(); - createLayout(); + displayNetworkInterfaces(false); + return; + } else { + createOfflineLayout(); + } } @Override @@ -389,7 +384,7 @@ public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); - if (!isWifiAvailable) { + if (!isAnyNetInterfaceAvailable) { menu.findItem(R.id.add).setVisible(false); menu.findItem(R.id.scan).setVisible(false); menu.findItem(R.id.new_session).setEnabled(false); @@ -438,6 +433,95 @@ public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } + private void initSystem(){ + // retry + try { + if (mIface == null){ + Toast.makeText(this, getString(R.string.iface_error_no_available), Toast.LENGTH_LONG).show(); + return; + } + System.init(MainActivity.this.getApplicationContext(), mIface); + + 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()); + + startNetworkRadar(true); + + startUpdateChecker(); + + } catch (Exception e) { + if (!(e instanceof NoRouteToHostException)) + System.errorLogging(e); + + onInitializationError(System.getLastError()); + } + } + + public void updateStatusMessage() { + if (!isAnyNetInterfaceAvailable) + UPDATE_MESSAGE = getString(R.string.no_wifi_available); + } + + /** + * 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 + if (forceDialog) + mIfacesList = new String[Network.getAvailableInterfaces().size()]; + + Network.getAvailableInterfaces().toArray(mIfacesList); + + if (forceDialog == false && mIfacesList.length == 1){ + mIface = mIfacesList[0]; + System.reloadNetworkMapping(mIface); + createOnlineLayout(); + initSystem(); + } + else if (forceDialog == true || mIfacesList.length > 1) { + String _title = getString(R.string.iface_dialog_title); + if (mIfacesList.length == 0) + _title = getString(R.string.iface_error_no_available); + + new ListChoiceDialog(_title, mIfacesList, MainActivity.this, new ChoiceDialog.ChoiceDialogListener() { + @Override + public void onChoice(int _iface_selected) { + mIface = mIfacesList[_iface_selected]; + + if (forceDialog) { + System.reloadNetworkMapping(mIface); + stopNetworkRadar(true); + startNetworkRadar(true); + + if (mIsOnlineLayout == false) + createOnlineLayout(); + } + else { + createOnlineLayout(); + initSystem(); + } + } + }).show(); + } + else{ + isAnyNetInterfaceAvailable = false; + createOfflineLayout(); + } + } + + public static String getActiveInterface(){ + return MainActivity.mIface; + } + private void targetAliasPrompt(final Target target) { new InputDialog(getString(R.string.target_alias), @@ -539,7 +623,16 @@ public void startUpdateChecker() { public void startNetworkRadar(boolean silent) { stopNetworkRadar(silent); + if (isAnyNetInterfaceAvailable && mIface == null) { + displayNetworkInterfaces(false); + return; + } + else if (!isAnyNetInterfaceAvailable){ + return; + } + if (mNetworkRadar == null) { + Logger.info("mNetworkRadar not initialized"); mNetworkRadar = new NetworkRadar(this); } @@ -776,6 +869,10 @@ public void run() { WifiScannerActivity.class), WIFI_CONNECTION_REQUEST); return true; + case R.id.wifi_ifaces: + displayNetworkInterfaces(true); + return true; + case R.id.new_session: new ConfirmDialog(getString(R.string.warning), getString(R.string.warning_new_session), this, @@ -1019,6 +1116,9 @@ public View getView(int position, View convertView, ViewGroup parent) { holder = (TargetHolder) row.getTag(); Target target = System.getTarget(position); + if (target == null){ + return row; + } if (target.hasAlias()) holder.itemTitle.setText(Html.fromHtml("" diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index 47c7cac107..2b0c53f0dd 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -38,6 +38,7 @@ import android.os.PowerManager.WakeLock; import android.preference.PreferenceManager; import android.util.SparseIntArray; +import android.widget.Toast; import org.acra.ACRA; import org.acra.ACRAConfiguration; @@ -145,10 +146,10 @@ public class System private final static LinkedList mSettingReceivers = new LinkedList(); - public static void init(Context context) throws Exception{ + public static void init(Context context, String iface) throws Exception{ mContext = context; try{ - Logger.debug("initializing System..."); + Logger.debug("initializing System...iface: " + ((iface == null) ? "" : iface)); mStoragePath = getSettings().getString("PREF_SAVE_PATH", Environment.getExternalStorageDirectory().toString()); mSessionName = "dsploit-session-" + java.lang.System.currentTimeMillis(); mKnownIssues = new KnownIssues(); @@ -187,19 +188,11 @@ public static void init(Context context) throws Exception{ HTTPS_REDIR_PORT = 8082; } - // initialize network data at the end - mNetwork = new Network(mContext); - - Target network = new Target(mNetwork), - gateway = new Target(mNetwork.getGatewayAddress(), mNetwork.getGatewayHardware()), - device = new Target(mNetwork.getLocalAddress(), mNetwork.getLocalHardware()); - - gateway.setAlias(mNetwork.getSSID()); - device.setAlias(android.os.Build.MODEL); - - mTargets.add(network); - mTargets.add(gateway); - mTargets.add(device); + if (iface == null){ + Logger.warning("network interface null, not initiating"); + mInitialized = false; + return; + } mInitialized = true; } @@ -339,9 +332,9 @@ public static void initCore() throws DaemonException, SuException { mCoreInitialized = true; } - public static void reloadNetworkMapping(){ + public static void reloadNetworkMapping(String iface){ try{ - mNetwork = new Network(mContext); + mNetwork = new Network(mContext, iface); Target network = new Target(mNetwork), gateway = new Target(mNetwork.getGatewayAddress(), mNetwork.getGatewayHardware()), @@ -366,7 +359,11 @@ public static void reloadNetworkMapping(){ } public static boolean checkNetworking(final Activity current){ - if(!Network.isWifiConnected(mContext)){ + if(!Network.isWifiConnected(mContext) && !mNetwork.isConnectivityAvailable(mContext)){ + if (current == null){ + Toast.makeText(mContext, "Error accesing The Net", Toast.LENGTH_SHORT).show(); + return false; + } AlertDialog.Builder builder = new AlertDialog.Builder(current); builder.setCancelable(false); @@ -928,6 +925,9 @@ public static void reset() throws NoRouteToHostException, SocketException{ } public static boolean isInitialized(){ + if (mNetwork == null || mNetwork.isConnected() == false || mNetwork.getInterface() == null) + return false; + return mInitialized; } @@ -1080,7 +1080,11 @@ public static Target getTargetByAddress(InetAddress address) { } public static void registerPlugin(Plugin plugin){ - mPlugins.add(plugin); + if (mPlugins.contains(plugin)){ + Logger.warning("registerPlugin() plugin " + plugin.getName() + " already added"); + } + else + mPlugins.add(plugin); } public static ArrayList getPlugins(){ diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/org/csploit/android/net/Network.java index d80480093a..80a700a02c 100644 --- a/cSploit/src/org/csploit/android/net/Network.java +++ b/cSploit/src/org/csploit/android/net/Network.java @@ -22,16 +22,27 @@ import android.net.ConnectivityManager; import android.net.DhcpInfo; import android.net.NetworkInfo; +import android.net.RouteInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.telephony.TelephonyManager; +import android.widget.Toast; import org.apache.commons.net.util.SubnetUtils; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.Inet4Address; import java.net.InetAddress; +import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.NoRouteToHostException; import java.net.SocketException; import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; import org.csploit.android.core.Logger; import org.csploit.android.core.System; @@ -103,7 +114,7 @@ public String toString() "192.168.0.0/16" }; - public Network(Context context) throws NoRouteToHostException, SocketException, UnknownHostException{ + public Network(Context context, String iface) throws NoRouteToHostException, SocketException, UnknownHostException{ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mInfo = mWifiManager.getDhcpInfo(); @@ -113,9 +124,15 @@ public Network(Context context) throws NoRouteToHostException, SocketException, mNetmask = getNetmask(); mBase = new IP4Address(mInfo.netmask & mInfo.gateway); - if(isConnected() == false) - throw new NoRouteToHostException("Not connected to any WiFi access point."); - + if(isConnected() == false){ + if (initNetworkInterface(iface) == false) { + try { + throw new Exception("Invalid wifi or not initialized yet"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } else{ try{ mInterface = NetworkInterface.getByInetAddress(getLocalAddress()); @@ -140,6 +157,41 @@ public Network(Context context) throws NoRouteToHostException, SocketException, } } + public boolean initNetworkInterface (String _iface) throws NoRouteToHostException { + + try { + if (_iface == null) + _iface = getAvailableInterfaces().get(0); + + mInterface = NetworkInterface.getByName(_iface); + InterfaceAddress ifaceAddress; + + if (mInterface.getInterfaceAddresses().size() == 0) { + return false; + } + else { + ifaceAddress = mInterface.getInterfaceAddresses().get(1); + } + + SubnetUtils su = new SubnetUtils( + // get(1) == ipv4 + ifaceAddress.getAddress().getHostAddress() + + "/" + + Short.toString(ifaceAddress.getNetworkPrefixLength())); + + mLocal = new IP4Address(su.getInfo().getAddress()); + mGateway = new IP4Address(getSystemGateway(mInterface.getDisplayName())); + mNetmask = new IP4Address(su.getInfo().getNetmask()); + mBase = new IP4Address(su.getInfo().getNetworkAddress()); + + return true; + } + catch (Exception e) { + Logger.error("Error: " + e.getLocalizedMessage()); + throw new NoRouteToHostException("Not connected to any network."); + } + } + private IP4Address getNetmask() throws UnknownHostException { IP4Address result = new IP4Address(mInfo.netmask); @@ -206,7 +258,16 @@ public boolean isConnected(){ } public String getSSID(){ - return mWifiInfo.getSSID(); + try { + if (isConnected() == false) + return ""; + + return mWifiInfo.getSSID(); + } + catch (Exception e){ + Logger.error("get SSID error: " + e.getLocalizedMessage()); + return ""; + } } public int getNumberOfAddresses(){ @@ -218,9 +279,9 @@ public IP4Address getStartAddress(){ } public String getNetworkMasked(){ - int network = mBase.toInteger(); - - return (network & 0xFF) + "." + ((network >> 8) & 0xFF) + "." + ((network >> 16) & 0xFF) + "." + ((network >> 24) & 0xFF); + SubnetUtils sub = new SubnetUtils(mLocal.toString(), mNetmask.toString()); + return sub.getInfo().getNetworkAddress(); + //return (network & 0xFF) + "." + ((network >> 8) & 0xFF) + "." + ((network >> 16) & 0xFF) + "." + ((network >> 24) & 0xFF); } public String getNetworkRepresentation(){ @@ -262,7 +323,60 @@ public InetAddress getLocalAddress(){ return mLocal.toInetAddress(); } + /** + * Retrieves a list of ready to use network interfaces. + * + * @return list of ready to use network interfaces + */ + public static List getAvailableInterfaces() + { + List iface_list = new ArrayList(); + int numAddresses = 0; + try { + for (Enumeration inet = NetworkInterface.getNetworkInterfaces(); inet.hasMoreElements();) { + NetworkInterface iface = inet.nextElement(); + // 0 = no ip / 0.0.0.0 + numAddresses = iface.getInterfaceAddresses().size(); + + if (iface == null){ + Logger.error("ooops, iface null"); + } + // exclude ifaces with no IP assigned. + else if (iface.isUp() && !iface.isLoopback() && numAddresses > 0) { + iface_list.add(iface.getDisplayName()); + } + } + }catch(SocketException e){ + Logger.warning("get network interfaces exception: " + e.getLocalizedMessage()); + } + + return iface_list; + } + public NetworkInterface getInterface(){ return mInterface; } + + public String getSystemGateway (String _iface){ + try { + String line; + Process p = Runtime.getRuntime().exec("ip r"); + + BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); + while ((line = input.readLine()) != null) { + + // TODO: check if the default gw is inside the selected iface network + if (line.startsWith("default") && line.contains(_iface)) { + String _str_gw = line.split(" ")[2]; + return _str_gw; + } + } + + input.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } } From 745cfe03cf86d4c73cde04e6f5ea9beacae6cd9a Mon Sep 17 00:00:00 2001 From: ga Date: Thu, 17 Sep 2015 00:17:13 +0200 Subject: [PATCH 002/110] enable or disable the options menu based on the availability of network interfaces. reload correctly the network devices list. launch the network radar when selecting a new network interface from the dialog. --- .../src/org/csploit/android/MainActivity.java | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 300ba2b33d..84d10c8f22 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -166,6 +166,8 @@ private void createOfflineLayout() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu(); + configureMenu(mMenu, false); + mIsOnlineLayout = false; } @@ -176,8 +178,11 @@ public void createOnlineLayout() { if (mUpdateStatus != null) mUpdateStatus.setVisibility(View.INVISIBLE); - if (mTargetAdapter != null) + if (mIsOnlineLayout && mTargetAdapter != null) { + configureMenu(mMenu, true); + mTargetAdapter.notifyDataSetChanged(); return; + } mTargetAdapter = new TargetAdapter(); @@ -315,7 +320,7 @@ public void run() { mIfacesList = new String[Network.getAvailableInterfaces().size()]; isAnyNetInterfaceAvailable = (mIfacesList.length > 0); - connectivityAvailable = Network.isConnectivityAvailable(this); + connectivityAvailable = Network.isConnectivityAvailable(this)|| Network.isWifiConnected(this); boolean coreInstalled = System.isCoreInstalled(); boolean coreBeating = System.isCoreInitialized(); @@ -384,21 +389,24 @@ public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); - if (!isAnyNetInterfaceAvailable) { - 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; + configureMenu(mMenu, isAnyNetInterfaceAvailable); return super.onCreateOptionsMenu(menu); } + public void configureMenu (Menu menu, boolean enabled){ + if (menu != null) { + menu.findItem(R.id.add).setVisible(enabled); + menu.findItem(R.id.scan).setVisible(enabled); + menu.findItem(R.id.new_session).setEnabled(enabled); + menu.findItem(R.id.save_session).setEnabled(enabled); + menu.findItem(R.id.restore_session).setEnabled(enabled); + menu.findItem(R.id.ss_monitor).setEnabled(enabled); + menu.findItem(R.id.ss_msfrpcd).setEnabled(enabled); + } + } + @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem item = menu.findItem(R.id.ss_monitor); @@ -440,6 +448,7 @@ private void initSystem(){ Toast.makeText(this, getString(R.string.iface_error_no_available), Toast.LENGTH_LONG).show(); return; } + configureMenu(mMenu, true); System.init(MainActivity.this.getApplicationContext(), mIface); System.registerPlugin(new RouterPwn()); @@ -489,26 +498,25 @@ private void displayNetworkInterfaces (final boolean forceDialog){ } else if (forceDialog == true || mIfacesList.length > 1) { String _title = getString(R.string.iface_dialog_title); - if (mIfacesList.length == 0) + if (mIfacesList.length == 0) { _title = getString(R.string.iface_error_no_available); + isAnyNetInterfaceAvailable = false; + configureMenu(mMenu, false); + } new ListChoiceDialog(_title, mIfacesList, MainActivity.this, new ChoiceDialog.ChoiceDialogListener() { @Override public void onChoice(int _iface_selected) { mIface = mIfacesList[_iface_selected]; - if (forceDialog) { - System.reloadNetworkMapping(mIface); - stopNetworkRadar(true); - startNetworkRadar(true); + System.reloadNetworkMapping(mIface); + isAnyNetInterfaceAvailable = true; + createOnlineLayout(); - if (mIsOnlineLayout == false) - createOnlineLayout(); - } - else { - createOnlineLayout(); + if (forceDialog == false) initSystem(); - } + else + startNetworkRadar(true); } }).show(); } @@ -624,7 +632,7 @@ public void startNetworkRadar(boolean silent) { stopNetworkRadar(silent); if (isAnyNetInterfaceAvailable && mIface == null) { - displayNetworkInterfaces(false); + displayNetworkInterfaces(true); return; } else if (!isAnyNetInterfaceAvailable){ From b470506ace528a7ba146f5b6b736e38e96578837 Mon Sep 17 00:00:00 2001 From: ga Date: Thu, 17 Sep 2015 23:47:36 +0200 Subject: [PATCH 003/110] initiate and reload correctly the system (core, net, etc), when an update occurs, or when we connect to a wifi from the app. --- .../src/org/csploit/android/MainActivity.java | 191 ++++++++++++------ .../src/org/csploit/android/core/System.java | 18 +- .../src/org/csploit/android/net/Network.java | 16 +- 3 files changed, 147 insertions(+), 78 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 84d10c8f22..38104f9e26 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -39,7 +39,6 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; -import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; @@ -122,6 +121,10 @@ public class MainActivity extends ActionBarActivity implements NetworkRadar.Targ private static String mIface = null; private String[] mIfacesList = null; private boolean mIsOnlineLayout = false; + private boolean mIsCoreInstalled = false; + private boolean mIsDaemonBeating = false; + private boolean mIsConnectivityAvailable = false; + private boolean mIsUpdateDownloading = false; private void createUpdateStatusText() { if (mUpdateStatus != null) return; @@ -148,10 +151,10 @@ private void createUpdateLayout() { mUpdateStatus .setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); - mUpdateReceiver.register(MainActivity.this); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu(); + + mUpdateReceiver.register(MainActivity.this); } private void createOfflineLayout() { @@ -161,7 +164,8 @@ private void createOfflineLayout() { mUpdateStatus.setVisibility(View.VISIBLE); - mUpdateStatus.setText(getString(R.string.no_connectivity)); + if (mUpdateStatus != null) + mUpdateStatus.setText(getString(R.string.no_connectivity)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu(); @@ -188,24 +192,6 @@ public void createOnlineLayout() { lv.setAdapter(mTargetAdapter); - lv.setOnItemLongClickListener(new OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - Target t = System.getTarget(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); @@ -214,6 +200,7 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) invalidateOptionsMenu(); + configureMenu(mMenu, true); mIsOnlineLayout = true; } @@ -222,12 +209,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == RESULT_OK && intent.hasExtra(WifiScannerActivity.CONNECTED)) { - System.reloadNetworkMapping(mIface); - try { - onCreate(null); - } catch (IllegalStateException e) { - // already attached. don't reattach. - } + + init(); } } @@ -259,9 +242,7 @@ private void onCoreUpdated() { MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - System.reloadNetworkMapping(mIface); - createOnlineLayout(); - startNetworkRadar(true); + init(); } }); } @@ -271,7 +252,6 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences themePrefs = getSharedPreferences("THEME", 0); Boolean isDark = themePrefs.getBoolean("isDark", false); - boolean connectivityAvailable; if (isDark) setTheme(R.style.DarkTheme); @@ -279,14 +259,17 @@ public void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); setContentView(R.layout.target_layout); - mUpdateStatus = new TextView(this); - RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); - LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT); - mUpdateStatus.setGravity(Gravity.CENTER); - mUpdateStatus.setLayoutParams(params); - layout.addView(mUpdateStatus); - mUpdateStatus.setVisibility(View.GONE); + + if (mUpdateStatus == null) { + mUpdateStatus = new TextView(this); + RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); + LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT); + mUpdateStatus.setGravity(Gravity.CENTER); + mUpdateStatus.setLayoutParams(params); + layout.addView(mUpdateStatus); + mUpdateStatus.setVisibility(View.GONE); + } lv = (ListView) findViewById(R.id.android_list); lv.setOnItemClickListener(new ListView.OnItemClickListener() { @@ -318,27 +301,61 @@ public void run() { } }); + lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + Target t = System.getTarget(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; + } + }); + + init(); + + } + + /** + * 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(){ mIfacesList = new String[Network.getAvailableInterfaces().size()]; isAnyNetInterfaceAvailable = (mIfacesList.length > 0); - connectivityAvailable = Network.isConnectivityAvailable(this)|| Network.isWifiConnected(this); + mIsConnectivityAvailable = isConnectivityAvailable(); - boolean coreInstalled = System.isCoreInstalled(); - boolean coreBeating = System.isCoreInitialized(); + mIsCoreInstalled = System.isCoreInstalled(); + mIsDaemonBeating = System.isCoreInitialized(); // check minimum requirements for system initialization - if (!coreInstalled) { + if (!mIsCoreInstalled) { UPDATE_MESSAGE = getString(R.string.missing_core_update); - createUpdateLayout(); - startUpdateChecker(); + if (mIsConnectivityAvailable) { + createUpdateLayout(); + startUpdateChecker(); + } + else { + UPDATE_MESSAGE += "\n\n" + getString(R.string.no_connectivity); + createUpdateLayout(); + } return; } - if (!coreBeating) { + if (mIsDaemonBeating == false) { try { System.initCore(); - coreBeating = true; + mIsDaemonBeating = System.isCoreInitialized(); if(Client.hadCrashed()) { Logger.warning("Client has previously crashed, building a crash report."); @@ -347,18 +364,20 @@ public void run() { } } catch (System.SuException e) { onInitializationError(getString(R.string.only_4_root)); + mIsDaemonBeating = false; return; } catch (System.DaemonException e) { Logger.error(e.getMessage()); UPDATE_MESSAGE = getString(R.string.heart_attack_update); - createOfflineLayout(); + createUpdateLayout(); + mIsDaemonBeating = false; } } // still not beating if (System.isCoreInitialized() == false) { UPDATE_MESSAGE = getString(R.string.heart_attack_update); - createOfflineLayout(); + createUpdateLayout(); return; } @@ -383,7 +402,6 @@ public void run() { createOfflineLayout(); } } - @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); @@ -395,6 +413,15 @@ public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } + public boolean isSystemReady(){ + return mIsCoreInstalled && mIsDaemonBeating; + } + + public boolean isConnectivityAvailable(){ + mIsConnectivityAvailable = Network.isConnectivityAvailable(this)|| Network.isWifiConnected(this); + return mIsConnectivityAvailable; + } + public void configureMenu (Menu menu, boolean enabled){ if (menu != null) { menu.findItem(R.id.add).setVisible(enabled); @@ -484,7 +511,20 @@ public void updateStatusMessage() { * @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 + // this needs to be checked from this function, since it can be called from the menu + if (mIsCoreInstalled == false) { + Toast.makeText(this, getString(R.string.missing_core_update).replace("#STATUS#", ""), Toast.LENGTH_LONG).show(); + if (forceDialog && mIsUpdateDownloading == false) + startUpdateChecker(); + + return ; + } + if (mIsDaemonBeating == false){ + Toast.makeText(this, getString(R.string.heart_attack).replace("#STATUS#", "Restart the app."), Toast.LENGTH_LONG).show(); + return ; + } + + // reload the interfaces list if we've invoked the dialog from the menu if (forceDialog) mIfacesList = new String[Network.getAvailableInterfaces().size()]; @@ -492,9 +532,12 @@ private void displayNetworkInterfaces (final boolean forceDialog){ if (forceDialog == false && mIfacesList.length == 1){ mIface = mIfacesList[0]; - System.reloadNetworkMapping(mIface); - createOnlineLayout(); - initSystem(); + if (System.reloadNetworkMapping(mIface) == true) { + createOnlineLayout(); + initSystem(); + } + else + Toast.makeText(MainActivity.this, "Error initializating " + mIface, Toast.LENGTH_LONG).show(); } else if (forceDialog == true || mIfacesList.length > 1) { String _title = getString(R.string.iface_dialog_title); @@ -509,14 +552,20 @@ else if (forceDialog == true || mIfacesList.length > 1) { public void onChoice(int _iface_selected) { mIface = mIfacesList[_iface_selected]; - System.reloadNetworkMapping(mIface); - isAnyNetInterfaceAvailable = true; - createOnlineLayout(); + if (System.reloadNetworkMapping(mIface) == true) { + isAnyNetInterfaceAvailable = true; + createOnlineLayout(); - if (forceDialog == false) - initSystem(); - else - startNetworkRadar(true); + if (forceDialog == false) + initSystem(); + else + startNetworkRadar(true); + } + else{ + Toast.makeText(MainActivity.this, "Error initializating " + mIface + + ((mIfacesList.length > 0) ? ". Select another interface from the list" : ""), + Toast.LENGTH_LONG).show(); + } } }).show(); } @@ -621,16 +670,20 @@ public void onDestroyActionMode(ActionMode mode) { }; public void startUpdateChecker() { + if (isConnectivityAvailable() == false || mIsUpdateDownloading) + return; + if (System.getSettings().getBoolean("PREF_CHECK_UPDATES", true)) { new UpdateChecker(this).start(); + mIsUpdateDownloading = true; } else { MainActivity.this.sendBroadcast(new Intent(UPDATE_NOT_AVAILABLE)); + mIsUpdateDownloading = false; } } public void startNetworkRadar(boolean silent) { - stopNetworkRadar(silent); - + // in order to start the network radar, we need: 1) an interface up and configured, 2) the daemon up and listening if (isAnyNetInterfaceAvailable && mIface == null) { displayNetworkInterfaces(true); return; @@ -638,6 +691,12 @@ public void startNetworkRadar(boolean silent) { else if (!isAnyNetInterfaceAvailable){ return; } + else if (mIsDaemonBeating == false) { + Toast.makeText(this, getString(R.string.heart_attack_update).replace("#STATUS#", " Restart the app."), Toast.LENGTH_LONG).show(); + return; + } + + stopNetworkRadar(silent); if (mNetworkRadar == null) { Logger.info("mNetworkRadar not initialized"); @@ -1312,10 +1371,12 @@ public void onConfirm() { i.putExtra(UpdateService.ACTION, target); startService(i); + mIsUpdateDownloading = true; } @Override public void onCancel() { + mIsUpdateDownloading = false; if (!mandatory) { return; } @@ -1347,11 +1408,13 @@ private void onUpdateDone(UpdateService.action target) { break; } + mIsUpdateDownloading = false; // restart update checker after a successful update startUpdateChecker(); } private void onUpdateError(UpdateService.action target, final int message) { + mIsUpdateDownloading = false; if (target == UpdateService.action.core_update) { onInitializationError(getString(message)); diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index 2b0c53f0dd..d19cda47f0 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -299,7 +299,7 @@ public static void shutdownCoreDaemon(){ Client.Shutdown(); Client.Disconnect(); - mInitialized = false; + mCoreInitialized = mInitialized = false; } public static void initCore() throws DaemonException, SuException { @@ -312,16 +312,20 @@ public static void initCore() throws DaemonException, SuException { if(!Client.isConnected()) { if(!Client.Connect(socket_path)) { startCoreDaemon(); - if (!Client.Connect(socket_path)) + if (!Client.Connect(socket_path)) { + mCoreInitialized = false; throw new DaemonException("cannot connect to core daemon"); + } } } if (!Client.isAuthenticated() && !Client.Login("android", "DEADBEEF")) { + mCoreInitialized = false; throw new DaemonException("cannot login to core daemon"); } if (!Client.LoadHandlers()) { + mCoreInitialized = false; throw new DaemonException("cannot load handlers"); } @@ -332,9 +336,11 @@ public static void initCore() throws DaemonException, SuException { mCoreInitialized = true; } - public static void reloadNetworkMapping(String iface){ + public static boolean reloadNetworkMapping(String iface){ try{ mNetwork = new Network(mContext, iface); + if (mNetwork.getInterface() == null) + return false; Target network = new Target(mNetwork), gateway = new Target(mNetwork.getGatewayAddress(), mNetwork.getGatewayHardware()), @@ -349,6 +355,7 @@ public static void reloadNetworkMapping(String iface){ mTargets.add(device); mInitialized = true; + return mInitialized; } catch(NoRouteToHostException nrthe){ // swallow bitch @@ -356,6 +363,9 @@ public static void reloadNetworkMapping(String iface){ catch(Exception e){ errorLogging(e); } + + mInitialized = false; + return mInitialized; } public static boolean checkNetworking(final Activity current){ @@ -925,7 +935,7 @@ public static void reset() throws NoRouteToHostException, SocketException{ } public static boolean isInitialized(){ - if (mNetwork == null || mNetwork.isConnected() == false || mNetwork.getInterface() == null) + if (mNetwork == null || mNetwork.isConnected() == false || mNetwork.getInterface() == null && mCoreInitialized) return false; return mInitialized; diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/org/csploit/android/net/Network.java index 80a700a02c..9c6ae16951 100644 --- a/cSploit/src/org/csploit/android/net/Network.java +++ b/cSploit/src/org/csploit/android/net/Network.java @@ -22,18 +22,16 @@ import android.net.ConnectivityManager; import android.net.DhcpInfo; import android.net.NetworkInfo; -import android.net.RouteInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.telephony.TelephonyManager; -import android.widget.Toast; import org.apache.commons.net.util.SubnetUtils; +import org.csploit.android.core.Logger; +import org.csploit.android.core.System; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.net.Inet4Address; import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; @@ -44,9 +42,6 @@ import java.util.Enumeration; import java.util.List; -import org.csploit.android.core.Logger; -import org.csploit.android.core.System; - public class Network { public enum Protocol{ @@ -124,16 +119,17 @@ public Network(Context context, String iface) throws NoRouteToHostException, Soc mNetmask = getNetmask(); mBase = new IP4Address(mInfo.netmask & mInfo.gateway); - if(isConnected() == false){ + if(iface != null){ if (initNetworkInterface(iface) == false) { try { - throw new Exception("Invalid wifi or not initialized yet"); + throw new Exception("Invalid network interface or not initialized yet"); } catch (Exception e) { e.printStackTrace(); } + mInterface = null; } } - else{ + else if (iface == null || isConnected()){ try{ mInterface = NetworkInterface.getByInetAddress(getLocalAddress()); if(mInterface == null) From e3396c8efeaaf58c90a63e87d693279a8142808d Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sun, 11 Oct 2015 15:02:04 +0200 Subject: [PATCH 004/110] do not abort if no network interface is available. --- cSploit/src/org/csploit/android/MainActivity.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 98e1d7aa14..f888ba812d 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -410,11 +410,14 @@ private boolean initSystem() { try { System.init(getApplicationContext()); } catch (Exception e) { - if (!(e instanceof NoRouteToHostException)) + boolean isFatal = !(e instanceof NoRouteToHostException); + + if (isFatal) { System.errorLogging(e); + onInitializationError(System.getLastError()); + } - onInitializationError(System.getLastError()); - return false; + return !isFatal; } registerPlugins(); From c923188953710f31a68cf2af4cb8a21b691c1876 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sun, 11 Oct 2015 15:08:39 +0200 Subject: [PATCH 005/110] enable "net ifaces" menu entry if device has more than 1 interface. --- cSploit/src/org/csploit/android/MainActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index f888ba812d..0e51920901 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -385,6 +385,7 @@ public void configureMenu() { return; mMenu.findItem(R.id.add).setVisible(mIsOnlineLayout); mMenu.findItem(R.id.scan).setVisible(mHaveAnyWifiInterface); + mMenu.findItem(R.id.wifi_ifaces).setEnabled(mIfaces.length > 1); mMenu.findItem(R.id.new_session).setEnabled(mIsOnlineLayout); mMenu.findItem(R.id.save_session).setEnabled(mIsOnlineLayout); mMenu.findItem(R.id.restore_session).setEnabled(mIsOnlineLayout); From 9784b918670485d6b457ea6a73b6e48375de3d5f Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sun, 11 Oct 2015 17:05:04 +0200 Subject: [PATCH 006/110] receive network changes and acts accordingly. TODO: UI prompt before removing current targets. --- .../src/org/csploit/android/MainActivity.java | 38 +++++++++++++++++-- .../src/org/csploit/android/core/System.java | 8 +++- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 0e51920901..536e539fb8 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -24,6 +24,7 @@ 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; @@ -112,6 +113,7 @@ public class MainActivity extends AppCompatActivity { 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 mUpdateStatus = null; private Toast mToast = null; @@ -298,6 +300,7 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l mUpdateReceiver.register(this); mWipeReceiver.register(this); mMsfReceiver.register(this); + mConnectivityReceiver.register(this); init(); createLayout(); @@ -448,8 +451,7 @@ private void loadInterfaces() { } private void onNetworkInerfaceChanged() { - System.reloadNetworkMapping(); - if (!System.isInitialized()) { + if (!System.reloadNetworkMapping()) { final String msg; String ifname = System.getIfname(); @@ -707,7 +709,6 @@ public void run() { public void onConfirm() { try { System.reset(); - mTargetAdapter.notifyDataSetChanged(); Toast.makeText( MainActivity.this, @@ -774,7 +775,6 @@ public void onItemSelected(int index) { try { System.loadSession(session); - mTargetAdapter.notifyDataSetChanged(); } catch (Exception e) { e.printStackTrace(); new ErrorDialog(getString(R.string.error), @@ -866,6 +866,7 @@ public void onDestroy() { mUpdateReceiver.unregister(); mWipeReceiver.unregister(); mMsfReceiver.unregister(); + mConnectivityReceiver.unregister(); // make sure no zombie process is running before destroying the activity System.clean(true); @@ -1211,4 +1212,33 @@ public void onReceive(Context context, Intent intent) { } } } + + private class ConnectivityReceiver extends ManagedReceiver { + private final IntentFilter mFilter; + + public ConnectivityReceiver() { + mFilter = new IntentFilter(); + mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + } + + @Override + public IntentFilter getFilter() { + return mFilter; + } + + @Override + public void onReceive(Context context, Intent intent) { + loadInterfaces(); + configureMenu(); + String current = System.getIfname(); + for(String ifname : mIfaces) { + if(ifname.equals(current)) { + return; + } + } + System.setIfname(null); + onNetworkInerfaceChanged(); + createLayout(); + } + } } \ No newline at end of file diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index 393bd1e713..bd2669fdb0 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -349,9 +349,10 @@ public static String getIfname() { return mIfname; } - public static void reloadNetworkMapping(){ + public static boolean reloadNetworkMapping(){ try{ uncaughtReloadNetworkMapping(); + return true; } catch(NoRouteToHostException nrthe){ // swallow bitch @@ -359,6 +360,7 @@ public static void reloadNetworkMapping(){ catch(Exception e){ errorLogging(e); } + return false; } private static void uncaughtReloadNetworkMapping() throws UnknownHostException, SocketException { @@ -846,6 +848,8 @@ public static void loadSession(String filename) throws Exception{ reset(); reader.close(); throw e; + } finally { + notifyTargetListChanged(); } } else throw new Exception(filename + " does not exists or is empty."); @@ -954,6 +958,8 @@ public static void reset() { scanThemAll(); } + + notifyTargetListChanged(); } public static void scanThemAll() { From 43404ac9613846440663d8b83a9759ebc75d7393 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Sun, 11 Oct 2015 17:07:03 +0200 Subject: [PATCH 007/110] fix typo --- cSploit/src/org/csploit/android/MainActivity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 536e539fb8..aaebbc4761 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -450,7 +450,7 @@ private void loadInterfaces() { isAnyNetInterfaceAvailable = mIfaces.length > 0; } - private void onNetworkInerfaceChanged() { + private void onNetworkInterfaceChanged() { if (!System.reloadNetworkMapping()) { final String msg; String ifname = System.getIfname(); @@ -484,7 +484,7 @@ private void displayNetworkInterfaces(final boolean forceDialog) { if (autoload) { System.setIfname(mIfaces[0]); - onNetworkInerfaceChanged(); + onNetworkInterfaceChanged(); } else if (isAnyNetInterfaceAvailable) { String title = getString(R.string.iface_dialog_title); @@ -492,7 +492,7 @@ private void displayNetworkInterfaces(final boolean forceDialog) { @Override public void onChoice(int index) { System.setIfname(mIfaces[index]); - onNetworkInerfaceChanged(); + onNetworkInterfaceChanged(); } }).show(); } else { @@ -1237,7 +1237,7 @@ public void onReceive(Context context, Intent intent) { } } System.setIfname(null); - onNetworkInerfaceChanged(); + onNetworkInterfaceChanged(); createLayout(); } } From 99fbd9db5e646149eaa59f2f93908294bb66a3f2 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 12 Oct 2015 10:33:53 +0200 Subject: [PATCH 008/110] improve multiple interface management. --- .../src/org/csploit/android/MainActivity.java | 84 +++++++++++++++---- .../src/org/csploit/android/core/System.java | 9 ++ .../src/org/csploit/android/net/Network.java | 9 ++ 3 files changed, 84 insertions(+), 18 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index aaebbc4761..81bd6ef192 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -19,6 +19,7 @@ package org.csploit.android; import android.annotation.SuppressLint; +import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -129,6 +130,7 @@ public class MainActivity extends AppCompatActivity { private boolean mIsConnectivityAvailable = false; private boolean mIsUpdateDownloading = false; private boolean mHaveAnyWifiInterface = true; // TODO: check is device have a wifi interface + private boolean mOfflineMode = false; private void createUpdateLayout() { @@ -388,7 +390,7 @@ public void configureMenu() { return; mMenu.findItem(R.id.add).setVisible(mIsOnlineLayout); mMenu.findItem(R.id.scan).setVisible(mHaveAnyWifiInterface); - mMenu.findItem(R.id.wifi_ifaces).setEnabled(mIfaces.length > 1); + mMenu.findItem(R.id.wifi_ifaces).setEnabled(canChangeInterface()); mMenu.findItem(R.id.new_session).setEnabled(mIsOnlineLayout); mMenu.findItem(R.id.save_session).setEnabled(mIsOnlineLayout); mMenu.findItem(R.id.restore_session).setEnabled(mIsOnlineLayout); @@ -450,26 +452,75 @@ private void loadInterfaces() { isAnyNetInterfaceAvailable = mIfaces.length > 0; } + 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()) { - final String msg; String ifname = System.getIfname(); ifname = ifname == null ? "default interface" : ifname; - msg = String.format("Error initializing %s", ifname); - - runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show(); - createLayout(); - } - }); + toastMessage = String.format("Error initializing %s", ifname); } else { startNetworkRadar(); registerPlugins(); } + + final String msg = toastMessage; + + runOnUiThread(new Runnable() { + @Override + public void run() { + if(msg != null) { + Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show(); + } + createLayout(); + } + }); + } + + private void onConnectionLost() { + if(mOfflineMode) + return; + + mOfflineMode = true; + + stopNetworkRadar(); + System.disconnectAllTargets(); + + final Dialog dialog = new ConfirmDialog("connection lost", + "delete current session and start another?", MainActivity.this, + new ConfirmDialogListener() { + @Override + public void onConfirm() { + mOfflineMode = false; + System.setIfname(null); + onNetworkInterfaceChanged(); + } + + @Override + public void onCancel() { } + }); + runOnUiThread(new Runnable() { + @Override + public void run() { + dialog.show(); + } + }); } /** @@ -1231,14 +1282,11 @@ public void onReceive(Context context, Intent intent) { loadInterfaces(); configureMenu(); String current = System.getIfname(); - for(String ifname : mIfaces) { - if(ifname.equals(current)) { - return; - } + if(haveInterface(current)) { + mOfflineMode = false; + } else { + onConnectionLost(); } - System.setIfname(null); - onNetworkInterfaceChanged(); - createLayout(); } } } \ No newline at end of file diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index bd2669fdb0..ce26462cbe 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -973,6 +973,15 @@ public static void scanThemAll() { } } + public static void disconnectAllTargets() { + synchronized (mTargets) { + for(Target t : mTargets) { + t.setConneced(false); + } + } + notifyTargetListChanged(); + } + public static boolean isInitialized(){ return mInitialized; } diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/org/csploit/android/net/Network.java index c50a5b196d..bb919d2011 100644 --- a/cSploit/src/org/csploit/android/net/Network.java +++ b/cSploit/src/org/csploit/android/net/Network.java @@ -21,6 +21,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.DhcpInfo; +import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; @@ -299,6 +300,14 @@ public InetAddress getLocalAddress(){ private static boolean isIfaceUsable(NetworkInterface networkInterface) { try { + // FIXME + // When I disconnect the WiFi, the interface still configured properly, + // even if not connected. It holds the old IP addresses adn it still up + // because permanent scan is active. + // As now I didn't found a way to get Android framework's NetworkInfo + // from a given NetworkInterface. + // Probably a solution is to use only Android framework stuff, + // but many useful API has been added from API level 21. return networkInterface.isUp() && !networkInterface.isLoopback() && !networkInterface.getInterfaceAddresses().isEmpty(); } catch (SocketException e) { From d660311f9f0b399253d37a3fe8e477d2131b916f Mon Sep 17 00:00:00 2001 From: tux_mind Date: Mon, 12 Oct 2015 10:38:47 +0200 Subject: [PATCH 009/110] extract string resources. --- cSploit/res/values/strings.xml | 4 ++++ cSploit/src/org/csploit/android/MainActivity.java | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cSploit/res/values/strings.xml b/cSploit/res/values/strings.xml index 67b39ae297..88f723d086 100644 --- a/cSploit/res/values/strings.xml +++ b/cSploit/res/values/strings.xml @@ -533,4 +533,8 @@ 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 diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 81bd6ef192..81f3cc2ec2 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -472,9 +472,9 @@ private void onNetworkInterfaceChanged() { if (!System.reloadNetworkMapping()) { String ifname = System.getIfname(); - ifname = ifname == null ? "default interface" : ifname; + ifname = ifname == null ? getString(R.string.any_interface) : ifname; - toastMessage = String.format("Error initializing %s", ifname); + toastMessage = String.format(getString(R.string.error_initializing_interface), ifname); } else { startNetworkRadar(); registerPlugins(); @@ -502,8 +502,8 @@ private void onConnectionLost() { stopNetworkRadar(); System.disconnectAllTargets(); - final Dialog dialog = new ConfirmDialog("connection lost", - "delete current session and start another?", MainActivity.this, + final Dialog dialog = new ConfirmDialog(getString(R.string.connection_lost), + getString(R.string.connection_lost_prompt), MainActivity.this, new ConfirmDialogListener() { @Override public void onConfirm() { From b79bebf5fcfa1059b904587e7ee513f0fc9a93e8 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Tue, 13 Oct 2015 18:16:49 +0200 Subject: [PATCH 010/110] version bump, as suggested by @fat-tire --- cSploit/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/build.gradle b/cSploit/build.gradle index 1271813146..d743158c83 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -53,7 +53,7 @@ android { minSdkVersion 9 targetSdkVersion 22 versionCode 3 - versionName "1.6.1" + versionName "1.6.2-unstable" if(System.getenv("NIGHTLY_BUILD")) { versionName += "+" + System.getenv("NIGHTLY_BUILD_COMMIT").substring(0, 7) } From 9bfa44b7c1fa3b51bca5ef87b288b470364f15d0 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Tue, 13 Oct 2015 18:17:00 +0200 Subject: [PATCH 011/110] updated core reference --- cSploit/jni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/jni b/cSploit/jni index 5d58371006..7676d786a0 160000 --- a/cSploit/jni +++ b/cSploit/jni @@ -1 +1 @@ -Subproject commit 5d58371006ad73c6d3ebf766cdfcf774822fd511 +Subproject commit 7676d786a074a8836254006020f97c45b811f915 From 0b18a51dc1fcf51006922bc2fcab1f720e968f2e Mon Sep 17 00:00:00 2001 From: tux_mind Date: Tue, 13 Oct 2015 20:45:59 +0200 Subject: [PATCH 012/110] defer check for network changes. --- .../src/org/csploit/android/MainActivity.java | 237 ++++++++++-------- .../src/org/csploit/android/core/System.java | 37 ++- .../src/org/csploit/android/net/Network.java | 18 +- 3 files changed, 165 insertions(+), 127 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 81f3cc2ec2..cf2db52521 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -33,20 +33,17 @@ 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.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; @@ -88,6 +85,7 @@ import org.csploit.android.services.UpdateService; import org.csploit.android.services.receivers.MsfRpcdServiceReceiver; import org.csploit.android.services.receivers.NetworkRadarReceiver; +import org.csploit.android.tools.Raw; import org.csploit.android.update.CoreUpdate; import org.csploit.android.update.MsfUpdate; import org.csploit.android.update.RubyUpdate; @@ -99,6 +97,8 @@ 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; @@ -106,7 +106,7 @@ @SuppressLint("NewApi") public class MainActivity extends AppCompatActivity { - private String UPDATE_MESSAGE = ""; + private String EMPTY_LIST_MESSAGE = ""; private static final int WIFI_CONNECTION_REQUEST = 1012; private boolean isAnyNetInterfaceAvailable = false; private TargetAdapter mTargetAdapter = null; @@ -116,7 +116,7 @@ public class MainActivity extends AppCompatActivity { private MsfRpcdServiceReceiver mMsfReceiver = new MsfRpcdServiceReceiver(); private ConnectivityReceiver mConnectivityReceiver = new ConnectivityReceiver(); private Menu mMenu = null; - private TextView mUpdateStatus = null; + private TextView mEmptyTextView = null; private Toast mToast = null; private TextView mTextView = null; private long mLastBackPressTime = 0; @@ -124,7 +124,6 @@ public class MainActivity extends AppCompatActivity { private ListView lv; private boolean isRootMissing = false; private String[] mIfaces = null; - private boolean mIsOnlineLayout = false; private boolean mIsCoreInstalled = false; private boolean mIsDaemonBeating = false; private boolean mIsConnectivityAvailable = false; @@ -132,54 +131,6 @@ public class MainActivity extends AppCompatActivity { private boolean mHaveAnyWifiInterface = true; // TODO: check is device have a wifi interface private boolean mOfflineMode = false; - private void createUpdateLayout() { - - lv.setVisibility(View.GONE); - findViewById(R.id.textView).setVisibility(View.GONE); - - mUpdateStatus.setVisibility(View.VISIBLE); - - mUpdateStatus.setText(UPDATE_MESSAGE.replace("#STATUS#", "...")); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } - - private void createOfflineLayout() { - - lv.setVisibility(View.GONE); - mTextView.setVisibility(View.GONE); - - mUpdateStatus.setVisibility(View.VISIBLE); - - mUpdateStatus.setText(getString(R.string.no_connectivity)); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - - mIsOnlineLayout = false; - } - - public void createOnlineLayout() { - mTextView.setVisibility(View.VISIBLE); - lv.setVisibility(View.VISIBLE); - - mUpdateStatus.setVisibility(View.GONE); - - if (mTargetAdapter == null) { - mTargetAdapter = new TargetAdapter(); - - lv.setAdapter(mTargetAdapter); - - System.setTargetListObserver(mTargetAdapter); - } - - mIsOnlineLayout = true; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - invalidateOptionsMenu(); - } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { @@ -189,18 +140,6 @@ protected void onActivityResult(int requestCode, int resultCode, } } - private void createLayout() { - if (mIsDaemonBeating && System.isInitialized()) { - createOnlineLayout(); - } else if (mIsConnectivityAvailable) { - createUpdateLayout(); - } else { - createOfflineLayout(); - } - - configureMenu(); - } - private void onInitializationError(final String message) { MainActivity.this.runOnUiThread(new Runnable() { @Override @@ -218,7 +157,7 @@ private void onCoreUpdated() { public void run() { init(); startAllServices(); - createLayout(); + notifyMenuChanged(); } }); } @@ -236,18 +175,10 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.target_layout); - if (mUpdateStatus == null) { - mUpdateStatus = new TextView(this); - RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); - LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT); - mUpdateStatus.setGravity(Gravity.CENTER); - mUpdateStatus.setLayoutParams(params); - layout.addView(mUpdateStatus); - mUpdateStatus.setVisibility(View.GONE); - } - + mEmptyTextView = (TextView) findViewById(R.id.emptyTextView); lv = (ListView) findViewById(R.id.android_list); + mTextView = (TextView) findViewById(R.id.textView); + lv.setOnItemClickListener(new ListView.OnItemClickListener() { @Override @@ -295,8 +226,12 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l return true; } }); + mTargetAdapter = new TargetAdapter(); - mTextView = (TextView) findViewById(R.id.textView); + lv.setEmptyView(findViewById(android.R.id.empty)); + lv.setAdapter(mTargetAdapter); + + System.setTargetListObserver(mTargetAdapter); mRadarReceiver.register(this); mUpdateReceiver.register(this); @@ -305,7 +240,6 @@ public boolean onItemLongClick(AdapterView parent, View view, int position, l mConnectivityReceiver.register(this); init(); - createLayout(); startAllServices(); } @@ -315,6 +249,12 @@ private void startAllServices() { startRPCServer(); } + private void notifyMenuChanged() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + invalidateOptionsMenu(); + else + configureMenu(); + } /** * Performs the firsts actions when the app starts. @@ -331,7 +271,7 @@ public void init() { // check minimum requirements for system initialization if (!mIsCoreInstalled) { - UPDATE_MESSAGE = mIsConnectivityAvailable ? + EMPTY_LIST_MESSAGE = mIsConnectivityAvailable ? getString(R.string.missing_core_update) : getString(R.string.no_connectivity); return; @@ -358,7 +298,7 @@ public void init() { if (!mIsDaemonBeating) { if (mIsConnectivityAvailable) { - UPDATE_MESSAGE = getString(R.string.heart_attack_update); + EMPTY_LIST_MESSAGE = getString(R.string.heart_attack_update); } else { onInitializationError(getString(R.string.heart_attack)); } @@ -388,12 +328,12 @@ private boolean isConnectivityAvailable() { public void configureMenu() { if (mMenu == null) return; - mMenu.findItem(R.id.add).setVisible(mIsOnlineLayout); + 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(mIsOnlineLayout); - mMenu.findItem(R.id.save_session).setEnabled(mIsOnlineLayout); - mMenu.findItem(R.id.restore_session).setEnabled(mIsOnlineLayout); + 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 @@ -446,10 +386,29 @@ private void registerPlugins() { } private void loadInterfaces() { + boolean menuChanged; List interfaces = Network.getAvailableInterfaces(); - mIfaces = new String[interfaces.size()]; + 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) { + runOnUiThread(new Runnable() { + @Override + public void run() { + notifyMenuChanged(); + } + }); + } } private boolean canChangeInterface() { @@ -485,10 +444,10 @@ private void onNetworkInterfaceChanged() { runOnUiThread(new Runnable() { @Override public void run() { - if(msg != null) { + if (msg != null) { Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show(); } - createLayout(); + notifyMenuChanged(); } }); } @@ -500,29 +459,36 @@ private void onConnectionLost() { mOfflineMode = true; stopNetworkRadar(); - System.disconnectAllTargets(); - - final Dialog dialog = new ConfirmDialog(getString(R.string.connection_lost), - getString(R.string.connection_lost_prompt), MainActivity.this, - new ConfirmDialogListener() { - @Override - public void onConfirm() { - mOfflineMode = false; - System.setIfname(null); - onNetworkInterfaceChanged(); - } + System.markNetworkAsDisconnected(); - @Override - public void onCancel() { } - }); runOnUiThread(new Runnable() { @Override public void run() { - dialog.show(); + new ConfirmDialog(getString(R.string.connection_lost), + getString(R.string.connection_lost_prompt), MainActivity.this, + 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 * @@ -1237,13 +1203,13 @@ public void onReceive(Context context, Intent intent) { switch (action) { case UPDATE_CHECKING: - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( + if (mEmptyTextView != null) + mEmptyTextView.setText(EMPTY_LIST_MESSAGE.replace( "#STATUS#", getString(R.string.checking))); break; case UPDATE_NOT_AVAILABLE: - if (mUpdateStatus != null) - mUpdateStatus.setText(UPDATE_MESSAGE.replace( + if (mEmptyTextView != null) + mEmptyTextView.setText(EMPTY_LIST_MESSAGE.replace( "#STATUS#", getString(R.string.no_updates_available))); if (!System.isCoreInitialized()) { @@ -1265,7 +1231,10 @@ public void onReceive(Context context, Intent intent) { } 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(); @@ -1277,15 +1246,61 @@ 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 (this) { + 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 (this) { + if(mTask != null) { + mTask.cancel(); + } + } + } + + private void check() { loadInterfaces(); - configureMenu(); 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)) { - mOfflineMode = false; - } else { + onConnectionResumed(); + } else if(current != null) { onConnectionLost(); + } else if(isAnyNetInterfaceAvailable) { + onNetworkInterfaceChanged(); + } + + synchronized (this) { + mTask = null; } } } diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index ce26462cbe..a8506efaaf 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -973,10 +973,43 @@ public static void scanThemAll() { } } - public static void disconnectAllTargets() { + public static void markNetworkAsDisconnected() { synchronized (mTargets) { for(Target t : mTargets) { - t.setConneced(false); + 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(); + 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()) || + gatewayAddress.equals(t.getAddress())) { + t.setConneced(true); + } + break; + } } } notifyTargetListChanged(); diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/org/csploit/android/net/Network.java index bb919d2011..4839381cdd 100644 --- a/cSploit/src/org/csploit/android/net/Network.java +++ b/cSploit/src/org/csploit/android/net/Network.java @@ -21,7 +21,6 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.DhcpInfo; -import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; @@ -42,7 +41,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; -import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -238,7 +236,7 @@ public static boolean isConnectivityAvailable(Context context){ } public boolean isConnected(){ - return isIfaceUsable(mInterface); + return isIfaceConnected(mInterface); } public String getSSID(){ @@ -298,16 +296,8 @@ public InetAddress getLocalAddress(){ return mLocal.toInetAddress(); } - private static boolean isIfaceUsable(NetworkInterface networkInterface) { + private static boolean isIfaceConnected(NetworkInterface networkInterface) { try { - // FIXME - // When I disconnect the WiFi, the interface still configured properly, - // even if not connected. It holds the old IP addresses adn it still up - // because permanent scan is active. - // As now I didn't found a way to get Android framework's NetworkInfo - // from a given NetworkInterface. - // Probably a solution is to use only Android framework stuff, - // but many useful API has been added from API level 21. return networkInterface.isUp() && !networkInterface.isLoopback() && !networkInterface.getInterfaceAddresses().isEmpty(); } catch (SocketException e) { @@ -337,7 +327,7 @@ public static List getAvailableInterfaces() { while(interfaces.hasMoreElements()) { NetworkInterface iface = interfaces.nextElement(); - if (isIfaceUsable(iface)) { + if (isIfaceConnected(iface)) { result.add(iface.getDisplayName()); } } @@ -383,4 +373,4 @@ public String getSystemGateway (String iface) { return null; } -} +} \ No newline at end of file From 268e2f910b1295887751f8b7bdb1355106188e1a Mon Sep 17 00:00:00 2001 From: tux_mind Date: Tue, 13 Oct 2015 20:46:35 +0200 Subject: [PATCH 013/110] use an empty layout --- cSploit/res/layout/target_empty.xml | 27 +++++++++++++++++++++++++++ cSploit/res/layout/target_layout.xml | 10 ++++++++++ 2 files changed, 37 insertions(+) create mode 100644 cSploit/res/layout/target_empty.xml diff --git a/cSploit/res/layout/target_empty.xml b/cSploit/res/layout/target_empty.xml new file mode 100644 index 0000000000..b3f235abc7 --- /dev/null +++ b/cSploit/res/layout/target_empty.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/cSploit/res/layout/target_layout.xml b/cSploit/res/layout/target_layout.xml index 0f07f7ffea..dbcf347382 100644 --- a/cSploit/res/layout/target_layout.xml +++ b/cSploit/res/layout/target_layout.xml @@ -15,6 +15,16 @@ android:layout_below="@+id/textView" android:animateLayoutChanges="true" /> + + Date: Tue, 13 Oct 2015 22:08:57 +0200 Subject: [PATCH 014/110] log rpc bad response. --- cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java b/cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java index 1fc398ef98..608108cec4 100644 --- a/cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java +++ b/cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java @@ -283,6 +283,9 @@ public boolean launch() throws RPCClient.MSFException { if(res.get("job_id") == null) { Logger.info("exploit launch failed: 'job_id' not found or null"); + for(String key : res.keySet()) { + Logger.debug(String.format("res[%s] = %s", key, res.get(key))); + } return false; } From 2b629404f53fdc11f2776e35852b903d88f10d06 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Wed, 14 Oct 2015 11:28:31 +0200 Subject: [PATCH 015/110] version bump --- cSploit/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/build.gradle b/cSploit/build.gradle index ead6762a80..966c85463d 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -53,7 +53,7 @@ android { minSdkVersion 9 targetSdkVersion 22 versionCode 4 - versionName "1.6.3-unstable" + versionName "1.7.0-unstable" if(System.getenv("NIGHTLY_BUILD")) { versionName += "+" + System.getenv("NIGHTLY_BUILD_COMMIT").substring(0, 7) } From 9aa77e466396a5fab3d0bfd2ad3fb336c35e4b25 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Wed, 14 Oct 2015 11:36:50 +0200 Subject: [PATCH 016/110] reformat code --- .../src/org/csploit/android/MainActivity.java | 33 +- .../src/org/csploit/android/core/System.java | 392 +++++++++--------- .../src/org/csploit/android/net/Network.java | 113 +++-- 3 files changed, 264 insertions(+), 274 deletions(-) diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/org/csploit/android/MainActivity.java index 356ed3c242..a5a0ef1dba 100644 --- a/cSploit/src/org/csploit/android/MainActivity.java +++ b/cSploit/src/org/csploit/android/MainActivity.java @@ -19,7 +19,6 @@ package org.csploit.android; import android.annotation.SuppressLint; -import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -85,7 +84,6 @@ import org.csploit.android.services.UpdateService; import org.csploit.android.services.receivers.MsfRpcdServiceReceiver; import org.csploit.android.services.receivers.NetworkRadarReceiver; -import org.csploit.android.tools.Raw; import org.csploit.android.update.CoreUpdate; import org.csploit.android.update.MsfUpdate; import org.csploit.android.update.RubyUpdate; @@ -390,7 +388,7 @@ private void loadInterfaces() { List interfaces = Network.getAvailableInterfaces(); int size = interfaces.size(); - if(mIfaces != null) { + if (mIfaces != null) { menuChanged = mIfaces.length != size; menuChanged &= mIfaces.length <= 1 || size <= 1; } else { @@ -401,7 +399,7 @@ private void loadInterfaces() { interfaces.toArray(mIfaces); isAnyNetInterfaceAvailable = mIfaces.length > 0; - if(menuChanged) { + if (menuChanged) { runOnUiThread(new Runnable() { @Override public void run() { @@ -412,12 +410,12 @@ public void run() { } private boolean canChangeInterface() { - return mIfaces.length > 1 || ( mOfflineMode && isAnyNetInterfaceAvailable); + return mIfaces.length > 1 || (mOfflineMode && isAnyNetInterfaceAvailable); } private boolean haveInterface(String ifname) { - for(String s : mIfaces) { - if(s.equals(ifname)) + for (String s : mIfaces) { + if (s.equals(ifname)) return true; } return false; @@ -453,7 +451,7 @@ public void run() { } private void onConnectionLost() { - if(mOfflineMode) + if (mOfflineMode) return; mOfflineMode = true; @@ -475,14 +473,15 @@ public void onConfirm() { } @Override - public void onCancel() { } + public void onCancel() { + } }).show(); } }); } private void onConnectionResumed() { - if(!mOfflineMode) + if (!mOfflineMode) return; mOfflineMode = false; System.markInitialNetworkTargetsAsConnected(); @@ -936,7 +935,7 @@ public View getView(int position, View convertView, ViewGroup parent) { holder.portCountLayout = (LinearLayout) (row != null ? row .findViewById(R.id.portCountLayout) : null); if (isDark) - holder.portCountLayout.setBackgroundResource(R.drawable.rounded_square_grey); + holder.portCountLayout.setBackgroundResource(R.drawable.rounded_square_grey); if (row != null) row.setTag(holder); } else @@ -1250,8 +1249,8 @@ public IntentFilter getFilter() { private String ifacesToString() { StringBuilder sb = new StringBuilder(); - for(String iface : mIfaces) { - if(sb.length() > 0) { + for (String iface : mIfaces) { + if (sb.length() > 0) { sb.append(", "); } sb.append(iface); @@ -1279,7 +1278,7 @@ public void run() { public void unregister() { super.unregister(); synchronized (this) { - if(mTask != null) { + if (mTask != null) { mTask.cancel(); } } @@ -1293,11 +1292,11 @@ private void check() { current != null ? current : "(null)", ifacesToString(), haveInterface(current), isAnyNetInterfaceAvailable)); - if(haveInterface(current)) { + if (haveInterface(current)) { onConnectionResumed(); - } else if(current != null) { + } else if (current != null) { onConnectionLost(); - } else if(isAnyNetInterfaceAvailable) { + } else if (isAnyNetInterfaceAvailable) { onNetworkInterfaceChanged(); } diff --git a/cSploit/src/org/csploit/android/core/System.java b/cSploit/src/org/csploit/android/core/System.java index fde52d34f3..cf284e4b80 100644 --- a/cSploit/src/org/csploit/android/core/System.java +++ b/cSploit/src/org/csploit/android/core/System.java @@ -92,8 +92,7 @@ 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"; @@ -136,10 +135,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; @@ -149,9 +148,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(); @@ -164,30 +163,30 @@ 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; @@ -204,9 +203,8 @@ public void run() { preloadServices(); } }); - } - catch(Exception e){ - if(!(e instanceof NoRouteToHostException)) + } catch (Exception e) { + if (!(e instanceof NoRouteToHostException)) errorLogging(e); throw e; @@ -242,18 +240,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 @@ -262,28 +260,34 @@ 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); @@ -296,11 +300,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(); @@ -312,13 +316,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"); @@ -349,15 +353,13 @@ public static String getIfname() { return mIfname; } - public static boolean reloadNetworkMapping(){ - try{ + public static boolean reloadNetworkMapping() { + try { uncaughtReloadNetworkMapping(); return true; - } - catch(NoRouteToHostException nrthe){ + } catch (NoRouteToHostException nrthe) { // swallow bitch - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } return false; @@ -372,8 +374,8 @@ private static void uncaughtReloadNetworkMapping() throws UnknownHostException, mInitialized = true; } - public static boolean checkNetworking(final Activity current){ - if(!mNetwork.isConnected()){ + public static boolean checkNetworking(final Activity current) { + if (!mNetwork.isConnected()) { Intent intent = new Intent(); intent.putExtra(WifiScannerActivity.CONNECTED, false); @@ -396,7 +398,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; @@ -404,7 +407,7 @@ public static void notifyTargetListChanged(Target target) { o = targetListObserver; } - if(o==null) + if (o == null) return; o.update(null, target); @@ -417,27 +420,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(); @@ -447,16 +450,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()); } } @@ -467,24 +469,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); @@ -492,15 +492,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); } @@ -525,7 +525,7 @@ public static String getToolsPath() { } public static String getCorePath() { - return mContext.getFilesDir().getAbsolutePath(); + return mContext.getFilesDir().getAbsolutePath(); } public static void registerSettingListener(SettingReceiver receiver) { @@ -540,8 +540,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); } } @@ -553,13 +553,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"); @@ -589,9 +589,9 @@ public static void preloadServices(){ } } - private static void preloadVendors(){ - if(mVendors == null){ - try{ + private static void preloadVendors() { + if (mVendors == null) { + try { mVendors = new HashMap<>(); @SuppressWarnings("ConstantConditions") FileInputStream fstream = new FileInputStream(mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-mac-prefixes"); @@ -600,47 +600,45 @@ private static void preloadVendors(){ BufferedReader 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); } } } - 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); } @@ -649,13 +647,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 { @@ -665,7 +664,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 @@ -676,6 +675,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() { @@ -684,6 +684,7 @@ public static String getCoreVersion() { /** * get version of installed ruby + * * @return the installed version of ruby */ public static String getLocalRubyVersion() { @@ -692,36 +693,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); @@ -731,13 +733,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; } @@ -746,16 +747,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); } } @@ -764,10 +765,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"); @@ -794,16 +795,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); } } @@ -812,10 +813,10 @@ 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; @@ -844,7 +845,7 @@ public static void loadSession(String filename) throws Exception{ reader.close(); - } catch(Exception e){ + } catch (Exception e) { reset(); reader.close(); throw e; @@ -856,7 +857,7 @@ public static void loadSession(String filename) throws Exception{ } public synchronized static ToolBox getTools() { - if(mTools == null) { + if (mTools == null) { mTools = new ToolBox(); mTools.reload(); } @@ -867,8 +868,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 @@ -880,62 +881,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; @@ -965,11 +963,11 @@ public static void reset() { } 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); } } @@ -977,15 +975,15 @@ public static void scanThemAll() { public static void markNetworkAsDisconnected() { synchronized (mTargets) { - for(Target t : mTargets) { + for (Target t : mTargets) { switch (t.getType()) { case NETWORK: - if(t.getNetwork() == mNetwork) { + if (t.getNetwork() == mNetwork) { t.setConneced(false); } break; case ENDPOINT: - if(mNetwork.isInternal(t.getAddress())) { + if (mNetwork.isInternal(t.getAddress())) { t.setConneced(false); } break; @@ -999,14 +997,14 @@ public static void markInitialNetworkTargetsAsConnected() { InetAddress localAddress = mNetwork.getLocalAddress(); InetAddress gatewayAddress = mNetwork.getGatewayAddress(); synchronized (mTargets) { - for(Target t : mTargets) { + for (Target t : mTargets) { switch (t.getType()) { case NETWORK: - if(t.getNetwork() == mNetwork) { + if (t.getNetwork() == mNetwork) { t.setConneced(true); } default: - if(localAddress.equals(t.getAddress()) || + if (localAddress.equals(t.getAddress()) || gatewayAddress.equals(t.getAddress())) { t.setConneced(true); } @@ -1017,7 +1015,7 @@ public static void markInitialNetworkTargetsAsConnected() { notifyTargetListChanged(); } - public static boolean isInitialized(){ + public static boolean isInitialized() { return mInitialized; } @@ -1033,14 +1031,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(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; } @@ -1049,12 +1047,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; } @@ -1064,9 +1062,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); } @@ -1074,15 +1073,16 @@ 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)) { + if (mTargets.contains(target)) { return false; } @@ -1100,7 +1100,7 @@ public static boolean addOrderedTarget(Target target){ } } - public static boolean hasTarget(Target target){ + public static boolean hasTarget(Target target) { synchronized (mTargets) { return mTargets.contains(target); } @@ -1110,14 +1110,14 @@ 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; @@ -1130,10 +1130,10 @@ public static Target getTargetByAddress(InetAddress address) { 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; } @@ -1208,55 +1207,53 @@ public static Collection getCurrentExploits() { return getCurrentTarget().getExploits(); } - public static String getGatewayAddress(){ + 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(); } @@ -1276,8 +1273,7 @@ public static void clean(boolean releaseLocks){ Client.Disconnect(); mCoreInitialized = false; Services.getNetworkRadar().onAutoScanChanged(); - } - catch(Exception e){ + } catch (Exception e) { errorLogging(e); } } diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/org/csploit/android/net/Network.java index 4839381cdd..8fc9f95208 100644 --- a/cSploit/src/org/csploit/android/net/Network.java +++ b/cSploit/src/org/csploit/android/net/Network.java @@ -27,6 +27,8 @@ import org.apache.commons.compress.utils.IOUtils; import org.apache.commons.net.util.SubnetUtils; +import org.csploit.android.core.Logger; +import org.csploit.android.core.System; import java.io.BufferedReader; import java.io.FileInputStream; @@ -45,43 +47,37 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.csploit.android.core.Logger; -import org.csploit.android.core.System; - -public class Network -{ - public enum Protocol{ +public class Network { + public enum Protocol { TCP, UDP, ICMP, IGMP, UNKNOWN; - public static Protocol fromString(String proto){ + public static Protocol fromString(String proto) { - if(proto != null){ + if (proto != null) { proto = proto.toLowerCase(); - if(proto.equals("tcp")) + if (proto.equals("tcp")) return TCP; - else if(proto.equals("udp")) + else if (proto.equals("udp")) return UDP; - else if(proto.equals("icmp")) + else if (proto.equals("icmp")) return ICMP; - else if(proto.equals("igmp")) + else if (proto.equals("igmp")) return IGMP; } return UNKNOWN; } - public String toString() - { - switch(this) - { + public String toString() { + switch (this) { case ICMP: return "icmp"; case IGMP: @@ -106,7 +102,8 @@ public String toString() private IP4Address mLocal = null; private IP4Address mBase = null; - /** see http://en.wikipedia.org/wiki/Reserved_IP_addresses + /** + * see http://en.wikipedia.org/wiki/Reserved_IP_addresses */ private static final String[] PRIVATE_NETWORKS = { "10.0.0.0/8", @@ -115,7 +112,7 @@ public String toString() "192.168.0.0/16" }; - public Network(Context context, String iface) throws SocketException, UnknownHostException{ + 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(); @@ -125,11 +122,11 @@ public Network(Context context, String iface) throws SocketException, UnknownHos mNetmask = getNetmask(); mBase = new IP4Address(mInfo.netmask & mInfo.gateway); - if(iface != null){ - if(initNetworkInterface(iface)) + if (iface != null) { + if (initNetworkInterface(iface)) return; } else { - for(String ifname : getAvailableInterfaces()) { + for (String ifname : getAvailableInterfaces()) { if (initNetworkInterface(ifname)) { return; } @@ -139,7 +136,7 @@ public Network(Context context, String iface) throws SocketException, UnknownHos throw new NoRouteToHostException("Not connected to any network."); } - public boolean initNetworkInterface (String iface) { + public boolean initNetworkInterface(String iface) { try { if (iface == null) @@ -166,8 +163,7 @@ public boolean initNetworkInterface (String iface) { mBase = new IP4Address(su.getInfo().getNetworkAddress()); return true; - } - catch (Exception e) { + } catch (Exception e) { Logger.error("Error: " + e.getLocalizedMessage()); } @@ -177,13 +173,13 @@ public boolean initNetworkInterface (String iface) { private IP4Address getNetmask() throws UnknownHostException { IP4Address result = new IP4Address(mInfo.netmask); - if(System.getSettings().getBoolean("WIDE_SCAN", false)) { + if (System.getSettings().getBoolean("WIDE_SCAN", false)) { SubnetUtils privateNetwork; - for(String cidr_notation : PRIVATE_NETWORKS) { + for (String cidr_notation : PRIVATE_NETWORKS) { privateNetwork = new SubnetUtils(cidr_notation); - if(privateNetwork.getInfo().isInRange(mLocal.toString())) { + if (privateNetwork.getInfo().isInRange(mLocal.toString())) { result = new IP4Address(privateNetwork.getInfo().getNetmask()); break; } @@ -193,7 +189,7 @@ private IP4Address getNetmask() throws UnknownHostException { return result; } - public boolean equals(Network network){ + public boolean equals(Network network) { return mInfo.equals(network.getInfo()); } @@ -201,14 +197,14 @@ 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])) + 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){ + public boolean isInternal(String ip) { try { return isInternal(InetAddress.getByName(ip).getAddress()); } catch (UnknownHostException e) { @@ -221,78 +217,77 @@ public boolean isInternal(InetAddress address) { return isInternal(address.getAddress()); } - public static boolean isWifiConnected(Context context){ + 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){ + 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(){ + public boolean isConnected() { return isIfaceConnected(mInterface); } - public String getSSID(){ + public String getSSID() { String res = mWifiInfo.getSSID(); return res.equals("") ? "" : res; } - public int getNumberOfAddresses(){ + public int getNumberOfAddresses() { return IP4Address.ntohl(~mNetmask.toInteger()); } - public IP4Address getStartAddress(){ + public IP4Address getStartAddress() { return mBase; } - public String getNetworkMasked(){ + public String getNetworkMasked() { SubnetUtils sub = new SubnetUtils(mLocal.toString(), mNetmask.toString()); return sub.getInfo().getNetworkAddress(); } - public String getNetworkRepresentation(){ + public String getNetworkRepresentation() { return getNetworkMasked() + "/" + mNetmask.getPrefixLength(); } - public DhcpInfo getInfo(){ + public DhcpInfo getInfo() { return mInfo; } - public InetAddress getNetmaskAddress(){ + public InetAddress getNetmaskAddress() { return mNetmask.toInetAddress(); } - public InetAddress getGatewayAddress(){ + public InetAddress getGatewayAddress() { return mGateway.toInetAddress(); } - public byte[] getGatewayHardware(){ + public byte[] getGatewayHardware() { return Endpoint.parseMacAddress(mWifiInfo.getBSSID()); } - public byte[] getLocalHardware(){ - try{ + public byte[] getLocalHardware() { + try { return mInterface.getHardwareAddress(); - } - catch(SocketException e){ + } catch (SocketException e) { System.errorLogging(e); } return null; } - public String getLocalAddressAsString(){ + public String getLocalAddressAsString() { return mLocal.toString(); } - public InetAddress getLocalAddress(){ + public InetAddress getLocalAddress() { return mLocal.toInetAddress(); } @@ -320,12 +315,12 @@ public static List getAvailableInterfaces() { System.errorLogging(e); } - if(interfaces == null) + if (interfaces == null) return Collections.emptyList(); result = new ArrayList<>(); - while(interfaces.hasMoreElements()) { + while (interfaces.hasMoreElements()) { NetworkInterface iface = interfaces.nextElement(); if (isIfaceConnected(iface)) { result.add(iface.getDisplayName()); @@ -335,11 +330,11 @@ public static List getAvailableInterfaces() { return result; } - public NetworkInterface getInterface(){ + public NetworkInterface getInterface() { return mInterface; } - public String getSystemGateway (String iface) { + public String getSystemGateway(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; @@ -347,17 +342,17 @@ public String getSystemGateway (String iface) { try { reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/net/route"))); - while((line = reader.readLine()) != null) { + while ((line = reader.readLine()) != null) { Matcher matcher = pattern.matcher(line); - if(!matcher.find()) { + 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) { + 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; From 81473fed1ca83b097fca46833f23fe5c27a5925e Mon Sep 17 00:00:00 2001 From: tux_mind Date: Wed, 14 Oct 2015 13:06:40 +0200 Subject: [PATCH 017/110] moved sources to fit Android Studio new build system fashion --- cSploit/.gitignore | 1 - cSploit/build.gradle | 14 - cSploit/{ => src/main}/AndroidManifest.xml | 0 cSploit/{ => src/main}/assets/csploit.p12 | Bin .../org/csploit/android/ActionActivity.java | 0 .../csploit/android/CSploitApplication.java | 0 .../org/csploit/android/MainActivity.java | 0 .../org/csploit/android/SettingsActivity.java | 0 .../csploit/android/WifiScannerActivity.java | 0 .../java}/org/csploit/android/core/Child.java | 0 .../csploit/android/core/ChildManager.java | 0 .../org/csploit/android/core/Client.java | 0 .../csploit/android/core/CrashReporter.java | 0 .../org/csploit/android/core/ExecChecker.java | 0 .../org/csploit/android/core/KnownIssues.java | 0 .../org/csploit/android/core/Logger.java | 0 .../csploit/android/core/ManagedReceiver.java | 0 .../android/core/MultiAttackService.java | 0 .../org/csploit/android/core/Plugin.java | 0 .../org/csploit/android/core/Profiler.java | 0 .../csploit/android/core/SettingReceiver.java | 0 .../org/csploit/android/core/System.java | 0 .../org/csploit/android/events/Account.java | 0 .../org/csploit/android/events/Attempts.java | 0 .../org/csploit/android/events/ChildDied.java | 0 .../org/csploit/android/events/ChildEnd.java | 0 .../org/csploit/android/events/Event.java | 0 .../org/csploit/android/events/FuseBind.java | 0 .../java}/org/csploit/android/events/Hop.java | 0 .../org/csploit/android/events/Host.java | 0 .../org/csploit/android/events/HostLost.java | 0 .../org/csploit/android/events/Login.java | 0 .../org/csploit/android/events/Message.java | 0 .../org/csploit/android/events/Newline.java | 0 .../java}/org/csploit/android/events/Os.java | 0 .../org/csploit/android/events/Packet.java | 0 .../org/csploit/android/events/Port.java | 0 .../org/csploit/android/events/Ready.java | 0 .../csploit/android/events/StderrNewline.java | 0 .../org/csploit/android/gui/Console.java | 0 .../csploit/android/gui/DirectoryPicker.java | 0 .../org/csploit/android/gui/FileEdit.java | 0 .../csploit/android/gui/MsfPreferences.java | 0 .../android/gui/dialogs/AboutDialog.java | 0 .../android/gui/dialogs/ChangelogDialog.java | 0 .../android/gui/dialogs/ChoiceDialog.java | 0 .../android/gui/dialogs/ConfirmDialog.java | 0 .../gui/dialogs/CustomFilterDialog.java | 0 .../android/gui/dialogs/ErrorDialog.java | 0 .../android/gui/dialogs/FatalDialog.java | 0 .../android/gui/dialogs/FinishDialog.java | 0 .../android/gui/dialogs/InputDialog.java | 0 .../android/gui/dialogs/ListChoiceDialog.java | 0 .../gui/dialogs/MultipleChoiceDialog.java | 0 .../gui/dialogs/RedirectionDialog.java | 0 .../android/gui/dialogs/SpinnerDialog.java | 0 .../android/gui/dialogs/WifiCrackDialog.java | 0 .../android/helpers/NetworkHelper.java | 0 .../csploit/android/helpers/ThreadHelper.java | 0 .../org/csploit/android/net/ByteBuffer.java | 0 .../org/csploit/android/net/Endpoint.java | 0 .../org/csploit/android/net/GitHubParser.java | 0 .../org/csploit/android/net/IP4Address.java | 0 .../org/csploit/android/net/Network.java | 0 .../org/csploit/android/net/RemoteReader.java | 0 .../java}/org/csploit/android/net/Target.java | 0 .../android/net/datasource/CVEDetails.java | 0 .../android/net/datasource/ExploitDb.java | 0 .../android/net/datasource/Generic.java | 0 .../android/net/datasource/Rapid7.java | 0 .../android/net/datasource/Search.java | 0 .../android/net/http/RequestParser.java | 0 .../android/net/http/proxy/CookieCleaner.java | 0 .../android/net/http/proxy/DNSCache.java | 0 .../android/net/http/proxy/HTTPSMonitor.java | 0 .../net/http/proxy/HTTPSRedirector.java | 0 .../csploit/android/net/http/proxy/Proxy.java | 0 .../android/net/http/proxy/ProxyThread.java | 0 .../android/net/http/proxy/StreamThread.java | 0 .../android/net/http/server/Server.java | 0 .../android/net/http/server/ServerThread.java | 0 .../android/net/metasploit/Author.java | 0 .../android/net/metasploit/MsfExploit.java | 0 .../android/net/metasploit/Option.java | 0 .../android/net/metasploit/Payload.java | 0 .../android/net/metasploit/RPCClient.java | 0 .../android/net/metasploit/Session.java | 0 .../android/net/metasploit/ShellSession.java | 0 .../csploit/android/net/reference/CVE.java | 0 .../csploit/android/net/reference/Link.java | 0 .../csploit/android/net/reference/OSVDB.java | 0 .../android/net/reference/Reference.java | 0 .../csploit/android/net/reference/Url.java | 0 .../android/net/reference/Vulnerability.java | 0 .../android/plugins/ExploitFinder.java | 0 .../csploit/android/plugins/Inspector.java | 0 .../csploit/android/plugins/LoginCracker.java | 0 .../csploit/android/plugins/PacketForger.java | 0 .../csploit/android/plugins/PortScanner.java | 0 .../csploit/android/plugins/RouterPwn.java | 0 .../org/csploit/android/plugins/Sessions.java | 0 .../csploit/android/plugins/Traceroute.java | 0 .../android/plugins/mitm/DNSSpoofing.java | 0 .../csploit/android/plugins/mitm/MITM.java | 0 .../android/plugins/mitm/PasswordSniffer.java | 0 .../csploit/android/plugins/mitm/Sniffer.java | 0 .../android/plugins/mitm/SpoofSession.java | 0 .../plugins/mitm/hijacker/Hijacker.java | 0 .../mitm/hijacker/HijackerWebView.java | 0 .../plugins/mitm/hijacker/Session.java | 0 .../services/MenuControllableService.java | 0 .../android/services/MsfRpcdService.java | 0 .../android/services/NativeService.java | 0 .../android/services/NetworkRadar.java | 0 .../org/csploit/android/services/Service.java | 0 .../csploit/android/services/Services.java | 0 .../android/services/UpdateChecker.java | 0 .../android/services/UpdateService.java | 0 .../receivers/MsfRpcdServiceReceiver.java | 0 .../receivers/NetworkRadarReceiver.java | 0 .../org/csploit/android/tools/ArpSpoof.java | 0 .../org/csploit/android/tools/Ettercap.java | 0 .../org/csploit/android/tools/Fusemounts.java | 0 .../org/csploit/android/tools/Hydra.java | 0 .../org/csploit/android/tools/IPTables.java | 0 .../org/csploit/android/tools/Logcat.java | 0 .../java}/org/csploit/android/tools/Msf.java | 0 .../org/csploit/android/tools/MsfRpcd.java | 0 .../java}/org/csploit/android/tools/NMap.java | 0 .../csploit/android/tools/NetworkRadar.java | 0 .../java}/org/csploit/android/tools/Raw.java | 0 .../java}/org/csploit/android/tools/Ruby.java | 0 .../org/csploit/android/tools/Shell.java | 0 .../org/csploit/android/tools/TcpDump.java | 0 .../java}/org/csploit/android/tools/Tool.java | 0 .../org/csploit/android/tools/ToolBox.java | 0 .../org/csploit/android/update/ApkUpdate.java | 0 .../csploit/android/update/CoreUpdate.java | 0 .../org/csploit/android/update/MsfUpdate.java | 0 .../csploit/android/update/RubyUpdate.java | 0 .../org/csploit/android/update/Update.java | 0 .../org/csploit/android/wifi/Keygen.java | 0 .../csploit/android/wifi/NetworkManager.java | 0 .../csploit/android/wifi/WirelessMatcher.java | 0 .../android/wifi/algorithms/AliceKeygen.java | 0 .../wifi/algorithms/AndaredKeygen.java | 0 .../wifi/algorithms/ComtrendKeygen.java | 0 .../android/wifi/algorithms/ConnKeygen.java | 0 .../android/wifi/algorithms/DiscusKeygen.java | 0 .../android/wifi/algorithms/DlinkKeygen.java | 0 .../wifi/algorithms/EasyBoxKeygen.java | 0 .../android/wifi/algorithms/EircomKeygen.java | 0 .../android/wifi/algorithms/HuaweiKeygen.java | 0 .../wifi/algorithms/InfostradaKeygen.java | 0 .../wifi/algorithms/MegaredKeygen.java | 0 .../android/wifi/algorithms/OnoKeygen.java | 0 .../android/wifi/algorithms/OteKeygen.java | 0 .../android/wifi/algorithms/PBSKeygen.java | 0 .../wifi/algorithms/PirelliKeygen.java | 0 .../android/wifi/algorithms/SkyV1Keygen.java | 0 .../android/wifi/algorithms/TecomKeygen.java | 0 .../android/wifi/algorithms/TelseyKeygen.java | 0 .../wifi/algorithms/ThomsonKeygen.java | 0 .../wifi/algorithms/VerizonKeygen.java | 0 .../android/wifi/algorithms/Wlan2Keygen.java | 0 .../android/wifi/algorithms/Wlan6Keygen.java | 0 .../android/wifi/algorithms/ZyxelKeygen.java | 0 .../wifi/algorithms/helpers/AliceHandle.java | 0 .../algorithms/helpers/AliceMagicInfo.java | 0 .../wifi/algorithms/helpers/JenkinsHash.java | 0 .../csploit/android => main}/jniLibs/README | 0 cSploit/{ => src/main}/res/anim/fadein.xml | 0 cSploit/{ => src/main}/res/anim/fadeout.xml | 0 .../{ => src/main}/res/anim/slide_in_left.xml | 0 .../main}/res/anim/slide_out_left.xml | 0 .../main}/res/drawable-hdpi/action_back.png | Bin .../res/drawable-hdpi/action_backward.png | Bin .../res/drawable-hdpi/action_exploit.png | Bin .../drawable-hdpi/action_exploit_finder.png | Bin .../main}/res/drawable-hdpi/action_forge.png | Bin .../res/drawable-hdpi/action_forward.png | Bin .../main}/res/drawable-hdpi/action_hijack.png | Bin .../main}/res/drawable-hdpi/action_image.png | Bin .../res/drawable-hdpi/action_injection.png | Bin .../res/drawable-hdpi/action_inspect.png | Bin .../main}/res/drawable-hdpi/action_kill.png | Bin .../main}/res/drawable-hdpi/action_login.png | Bin .../main}/res/drawable-hdpi/action_mitm.png | Bin .../res/drawable-hdpi/action_monitor.png | Bin .../main}/res/drawable-hdpi/action_open.png | Bin .../res/drawable-hdpi/action_passwords.png | Bin .../main}/res/drawable-hdpi/action_plugin.png | Bin .../res/drawable-hdpi/action_redirect.png | Bin .../res/drawable-hdpi/action_refresh.png | Bin .../res/drawable-hdpi/action_routerpwn.png | Bin .../main}/res/drawable-hdpi/action_scan.png | Bin .../res/drawable-hdpi/action_scanner.png | Bin .../res/drawable-hdpi/action_session.png | Bin .../res/drawable-hdpi/action_sniffer.png | Bin .../res/drawable-hdpi/action_traceroute.png | Bin .../res/drawable-hdpi/action_youtube.png | Bin .../res/drawable-hdpi/actionbar_gradient.xml | 0 .../main}/res/drawable-hdpi/arrow_right.png | Bin .../main}/res/drawable-hdpi/dsploit_icon.png | Bin .../main}/res/drawable-hdpi/exploit.png | Bin .../main}/res/drawable-hdpi/exploit_msf.png | Bin .../res/drawable-hdpi/favicon_amazon.png | Bin .../res/drawable-hdpi/favicon_blogger.png | Bin .../res/drawable-hdpi/favicon_facebook.png | Bin .../res/drawable-hdpi/favicon_generic.png | Bin .../res/drawable-hdpi/favicon_google.png | Bin .../res/drawable-hdpi/favicon_tumblr.png | Bin .../res/drawable-hdpi/favicon_twitter.png | Bin .../main}/res/drawable-hdpi/favicon_xda.png | Bin .../res/drawable-hdpi/favicon_youtube.png | Bin .../main}/res/drawable-hdpi/https_session.png | Bin .../res/drawable-hdpi/ic_done_white_24dp.png | Bin .../main}/res/drawable-hdpi/ic_impossible.png | Bin .../main}/res/drawable-hdpi/ic_launcher.png | Bin .../main}/res/drawable-hdpi/ic_possible.png | Bin .../main}/res/drawable-hdpi/ic_refresh.png | Bin .../drawable-hdpi/ic_wifi_lock_signal_1.png | Bin .../drawable-hdpi/ic_wifi_lock_signal_2.png | Bin .../drawable-hdpi/ic_wifi_lock_signal_3.png | Bin .../drawable-hdpi/ic_wifi_lock_signal_4.png | Bin .../res/drawable-hdpi/ic_wifi_signal_1.png | Bin .../res/drawable-hdpi/ic_wifi_signal_2.png | Bin .../res/drawable-hdpi/ic_wifi_signal_3.png | Bin .../res/drawable-hdpi/ic_wifi_signal_4.png | Bin .../main}/res/drawable-hdpi/target_add.png | Bin .../res/drawable-hdpi/target_endpoint.png | Bin .../res/drawable-hdpi/target_network.png | Bin .../main}/res/drawable-hdpi/target_remote.png | Bin .../main}/res/drawable-hdpi/target_router.png | Bin .../main}/res/drawable-hdpi/target_self.png | Bin .../main}/res/drawable-mdpi/action_back.png | Bin .../res/drawable-mdpi/action_backward.png | Bin .../main}/res/drawable-mdpi/action_explo.png | Bin .../drawable-mdpi/action_exploit_finder.png | Bin .../main}/res/drawable-mdpi/action_forge.png | Bin .../res/drawable-mdpi/action_forward.png | Bin .../main}/res/drawable-mdpi/action_hijack.png | Bin .../main}/res/drawable-mdpi/action_image.png | Bin .../res/drawable-mdpi/action_injection.png | Bin .../res/drawable-mdpi/action_inspect.png | Bin .../main}/res/drawable-mdpi/action_kill.png | Bin .../main}/res/drawable-mdpi/action_login.png | Bin .../main}/res/drawable-mdpi/action_mitm.png | Bin .../res/drawable-mdpi/action_monitor.png | Bin .../main}/res/drawable-mdpi/action_open.png | Bin .../res/drawable-mdpi/action_passwords.png | Bin .../main}/res/drawable-mdpi/action_plugin.png | Bin .../res/drawable-mdpi/action_redirect.png | Bin .../res/drawable-mdpi/action_refresh.png | Bin .../res/drawable-mdpi/action_routerpwn.png | Bin .../main}/res/drawable-mdpi/action_scan.png | Bin .../res/drawable-mdpi/action_scanner.png | Bin .../res/drawable-mdpi/action_session.png | Bin .../res/drawable-mdpi/action_sniffer.png | Bin .../res/drawable-mdpi/action_traceroute.png | Bin .../res/drawable-mdpi/action_youtube.png | Bin .../res/drawable-mdpi/actionbar_gradient.xml | 0 .../main}/res/drawable-mdpi/arrow_right.png | Bin .../main}/res/drawable-mdpi/dsploit_icon.png | Bin .../main}/res/drawable-mdpi/exploit.png | Bin .../main}/res/drawable-mdpi/exploit_msf.png | Bin .../res/drawable-mdpi/favicon_amazon.png | Bin .../res/drawable-mdpi/favicon_blogger.png | Bin .../res/drawable-mdpi/favicon_facebook.png | Bin .../res/drawable-mdpi/favicon_generic.png | Bin .../res/drawable-mdpi/favicon_google.png | Bin .../res/drawable-mdpi/favicon_tumblr.png | Bin .../res/drawable-mdpi/favicon_twitter.png | Bin .../main}/res/drawable-mdpi/favicon_xda.png | Bin .../res/drawable-mdpi/favicon_youtube.png | Bin .../main}/res/drawable-mdpi/https_session.png | Bin .../res/drawable-mdpi/ic_done_white_24dp.png | Bin .../main}/res/drawable-mdpi/ic_impossible.png | Bin .../main}/res/drawable-mdpi/ic_launcher.png | Bin .../main}/res/drawable-mdpi/ic_possible.png | Bin .../main}/res/drawable-mdpi/ic_refresh.png | Bin .../drawable-mdpi/ic_wifi_lock_signal_1.png | Bin .../drawable-mdpi/ic_wifi_lock_signal_2.png | Bin .../drawable-mdpi/ic_wifi_lock_signal_3.png | Bin .../drawable-mdpi/ic_wifi_lock_signal_4.png | Bin .../res/drawable-mdpi/ic_wifi_signal_1.png | Bin .../res/drawable-mdpi/ic_wifi_signal_2.png | Bin .../res/drawable-mdpi/ic_wifi_signal_3.png | Bin .../res/drawable-mdpi/ic_wifi_signal_4.png | Bin .../main}/res/drawable-mdpi/target_add.png | Bin .../res/drawable-mdpi/target_endpoint.png | Bin .../res/drawable-mdpi/target_network.png | Bin .../main}/res/drawable-mdpi/target_remote.png | Bin .../main}/res/drawable-mdpi/target_router.png | Bin .../main}/res/drawable-mdpi/target_self.png | Bin .../main}/res/drawable-xhdpi/action_back.png | Bin .../res/drawable-xhdpi/action_backward.png | Bin .../res/drawable-xhdpi/action_exploit.png | Bin .../drawable-xhdpi/action_exploit_finder.png | Bin .../main}/res/drawable-xhdpi/action_forge.png | Bin .../res/drawable-xhdpi/action_forward.png | Bin .../res/drawable-xhdpi/action_hijack.png | Bin .../main}/res/drawable-xhdpi/action_image.png | Bin .../res/drawable-xhdpi/action_inject.png | Bin .../res/drawable-xhdpi/action_inspect.png | Bin .../main}/res/drawable-xhdpi/action_kill.png | Bin .../main}/res/drawable-xhdpi/action_login.png | Bin .../main}/res/drawable-xhdpi/action_mitm.png | Bin .../res/drawable-xhdpi/action_monitor.png | Bin .../main}/res/drawable-xhdpi/action_open.png | Bin .../res/drawable-xhdpi/action_passwords.png | Bin .../res/drawable-xhdpi/action_plugin.png | Bin .../res/drawable-xhdpi/action_redirect.png | Bin .../res/drawable-xhdpi/action_refresh.png | Bin .../res/drawable-xhdpi/action_routerpwn.png | Bin .../main}/res/drawable-xhdpi/action_scan.png | Bin .../res/drawable-xhdpi/action_scanner.png | Bin .../res/drawable-xhdpi/action_session.png | Bin .../res/drawable-xhdpi/action_sniffer.png | Bin .../res/drawable-xhdpi/action_traceroute.png | Bin .../res/drawable-xhdpi/action_youtube.png | Bin .../main}/res/drawable-xhdpi/arrow_right.png | Bin .../main}/res/drawable-xhdpi/exploit.png | Bin .../main}/res/drawable-xhdpi/exploit_msf.png | Bin .../res/drawable-xhdpi/https_session.png | Bin .../res/drawable-xhdpi/ic_done_white_24dp.png | Bin .../main}/res/drawable-xhdpi/target_add.png | Bin .../res/drawable-xhdpi/target_endpoint.png | Bin .../res/drawable-xhdpi/target_network.png | Bin .../res/drawable-xhdpi/target_remote.png | Bin .../res/drawable-xhdpi/target_router.png | Bin .../main}/res/drawable-xhdpi/target_self.png | Bin .../main}/res/drawable-xxhdpi/action_back.png | Bin .../res/drawable-xxhdpi/action_backwards.png | Bin .../res/drawable-xxhdpi/action_exploit.png | Bin .../drawable-xxhdpi/action_exploit_finder.png | Bin .../res/drawable-xxhdpi/action_forge.png | Bin .../res/drawable-xxhdpi/action_forward.png | Bin .../res/drawable-xxhdpi/action_hijack.png | Bin .../res/drawable-xxhdpi/action_image.png | Bin .../res/drawable-xxhdpi/action_injection.png | Bin .../res/drawable-xxhdpi/action_inspect.png | Bin .../main}/res/drawable-xxhdpi/action_kill.png | Bin .../res/drawable-xxhdpi/action_login.png | Bin .../main}/res/drawable-xxhdpi/action_mitm.png | Bin .../res/drawable-xxhdpi/action_monitor.png | Bin .../main}/res/drawable-xxhdpi/action_open.png | Bin .../res/drawable-xxhdpi/action_passwords.png | Bin .../res/drawable-xxhdpi/action_plugin.png | Bin .../res/drawable-xxhdpi/action_redirect.png | Bin .../res/drawable-xxhdpi/action_refresh.png | Bin .../res/drawable-xxhdpi/action_routerpwn.png | Bin .../main}/res/drawable-xxhdpi/action_scan.png | Bin .../res/drawable-xxhdpi/action_scanner.png | Bin .../res/drawable-xxhdpi/action_session.png | Bin .../res/drawable-xxhdpi/action_sniffer.png | Bin .../res/drawable-xxhdpi/action_traceroute.png | Bin .../res/drawable-xxhdpi/action_youtube.png | Bin .../main}/res/drawable-xxhdpi/arrow_right.png | Bin .../main}/res/drawable-xxhdpi/exploit.png | Bin .../main}/res/drawable-xxhdpi/exploit_msf.png | Bin .../res/drawable-xxhdpi/https_session.png | Bin .../drawable-xxhdpi/ic_done_white_24dp.png | Bin .../main}/res/drawable-xxhdpi/target_add.png | Bin .../res/drawable-xxhdpi/target_endpoint.png | Bin .../res/drawable-xxhdpi/target_network.png | Bin .../res/drawable-xxhdpi/target_remote.png | Bin .../res/drawable-xxhdpi/target_router.png | Bin .../main}/res/drawable-xxhdpi/target_self.png | Bin .../drawable-xxxhdpi/ic_done_white_24dp.png | Bin .../main}/res/drawable/actionbar_gradient.xml | 0 .../main}/res/drawable/card_background.9.png | Bin .../res/drawable/card_background_dark.9.png | Bin .../res/drawable/card_background_shadow.9.png | Bin .../main}/res/drawable/card_shadow.9.png | Bin .../main}/res/drawable/ic_play_arrow_24dp.xml | 0 .../main}/res/drawable/ic_stop_24dp.xml | 0 .../main}/res/drawable/rounded_square.xml | 0 .../res/drawable/rounded_square_grey.xml | 0 .../selectable_background_cardbank.xml | 0 .../main}/res/drawable/top_shadow.png | Bin .../main}/res/layout/about_dialog.xml | 0 .../main}/res/layout/actions_layout.xml | 0 .../main}/res/layout/actions_list_item.xml | 0 .../main}/res/layout/console_layout.xml | 0 .../res/layout/dirpicker_chooser_list.xml | 0 .../main}/res/layout/dirpicker_list_item.xml | 0 .../{ => src/main}/res/layout/file_edit.xml | 0 .../res/layout/plugin_exploit_finder.xml | 0 .../res/layout/plugin_exploit_finder_item.xml | 0 .../main}/res/layout/plugin_inspector.xml | 0 .../main}/res/layout/plugin_login_cracker.xml | 0 .../{ => src/main}/res/layout/plugin_mitm.xml | 0 .../res/layout/plugin_mitm_dns_spoofing.xml | 0 .../res/layout/plugin_mitm_filter_dialog.xml | 0 .../main}/res/layout/plugin_mitm_hijacker.xml | 0 .../layout/plugin_mitm_hijacker_list_item.xml | 0 .../layout/plugin_mitm_hijacker_webview.xml | 0 .../res/layout/plugin_mitm_list_item.xml | 0 .../layout/plugin_mitm_password_sniffer.xml | 0 .../layout/plugin_mitm_redirect_dialog.xml | 0 .../main}/res/layout/plugin_mitm_sniffer.xml | 0 .../layout/plugin_mitm_sniffer_list_item.xml | 0 .../main}/res/layout/plugin_packet_forger.xml | 0 .../main}/res/layout/plugin_portscanner.xml | 0 .../res/layout/plugin_sessions_layout.xml | 0 .../res/layout/plugin_sessions_list_item.xml | 0 .../main}/res/layout/plugin_traceroute.xml | 0 .../main}/res/layout/target_empty.xml | 0 .../main}/res/layout/target_layout.xml | 0 .../main}/res/layout/target_list_item.xml | 0 .../main}/res/layout/wifi_scanner.xml | 0 .../res/layout/wifi_scanner_list_item.xml | 0 cSploit/{ => src/main}/res/menu/browser.xml | 0 cSploit/{ => src/main}/res/menu/console.xml | 0 .../main}/res/menu/exploit_finder.xml | 0 cSploit/{ => src/main}/res/menu/hijacker.xml | 0 cSploit/{ => src/main}/res/menu/inspector.xml | 0 .../{ => src/main}/res/menu/login_cracker.xml | 0 cSploit/{ => src/main}/res/menu/main.xml | 0 .../{ => src/main}/res/menu/main_multi.xml | 0 .../main}/res/menu/password_sniffer.xml | 0 .../{ => src/main}/res/menu/port_scanner.xml | 0 .../{ => src/main}/res/menu/traceroute.xml | 0 .../main}/res/menu/vulnerability_finder.xml | 0 .../{ => src/main}/res/menu/wifi_scanner.xml | 0 cSploit/src/main/res/raw/.gitignore | 1 + cSploit/{ => src/main}/res/raw/alice.xml | 610 +++++++++--------- cSploit/{ => src/main}/res/raw/webdic.zip | Bin .../{ => src/main}/res/values-ar/strings.xml | 0 .../{ => src/main}/res/values-cs/strings.xml | 0 .../{ => src/main}/res/values-de/strings.xml | 0 .../{ => src/main}/res/values-el/strings.xml | 0 .../{ => src/main}/res/values-es/strings.xml | 0 .../{ => src/main}/res/values-fi/strings.xml | 0 .../{ => src/main}/res/values-fr/strings.xml | 0 .../{ => src/main}/res/values-hr/strings.xml | 0 .../{ => src/main}/res/values-it/strings.xml | 0 .../{ => src/main}/res/values-nl/strings.xml | 0 .../{ => src/main}/res/values-no/strings.xml | 0 .../{ => src/main}/res/values-pl/strings.xml | 0 .../{ => src/main}/res/values-pt/strings.xml | 0 .../{ => src/main}/res/values-ru/strings.xml | 0 .../{ => src/main}/res/values-tr/strings.xml | 0 .../main}/res/values-zh-rCN/strings.xml | 0 cSploit/{ => src/main}/res/values/colors.xml | 0 cSploit/{ => src/main}/res/values/strings.xml | 0 cSploit/{ => src/main}/res/values/style.xml | 0 .../{ => src/main}/res/xml/preferences.xml | 0 449 files changed, 306 insertions(+), 320 deletions(-) rename cSploit/{ => src/main}/AndroidManifest.xml (100%) rename cSploit/{ => src/main}/assets/csploit.p12 (100%) rename cSploit/src/{ => main/java}/org/csploit/android/ActionActivity.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/CSploitApplication.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/MainActivity.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/SettingsActivity.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/WifiScannerActivity.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/Child.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/ChildManager.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/Client.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/CrashReporter.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/ExecChecker.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/KnownIssues.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/Logger.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/ManagedReceiver.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/MultiAttackService.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/Plugin.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/Profiler.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/SettingReceiver.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/core/System.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Account.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Attempts.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/ChildDied.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/ChildEnd.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Event.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/FuseBind.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Hop.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Host.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/HostLost.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Login.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Message.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Newline.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Os.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Packet.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Port.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/Ready.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/events/StderrNewline.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/Console.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/DirectoryPicker.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/FileEdit.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/MsfPreferences.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/AboutDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/ChangelogDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/ChoiceDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/ConfirmDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/CustomFilterDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/ErrorDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/FatalDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/FinishDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/InputDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/ListChoiceDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/RedirectionDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/SpinnerDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/gui/dialogs/WifiCrackDialog.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/helpers/NetworkHelper.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/helpers/ThreadHelper.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/ByteBuffer.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/Endpoint.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/GitHubParser.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/IP4Address.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/Network.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/RemoteReader.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/Target.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/datasource/CVEDetails.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/datasource/ExploitDb.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/datasource/Generic.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/datasource/Rapid7.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/datasource/Search.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/RequestParser.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/CookieCleaner.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/DNSCache.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/HTTPSMonitor.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/HTTPSRedirector.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/Proxy.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/ProxyThread.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/proxy/StreamThread.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/server/Server.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/http/server/ServerThread.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/Author.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/MsfExploit.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/Option.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/Payload.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/RPCClient.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/Session.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/metasploit/ShellSession.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/reference/CVE.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/reference/Link.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/reference/OSVDB.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/reference/Reference.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/reference/Url.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/net/reference/Vulnerability.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/ExploitFinder.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/Inspector.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/LoginCracker.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/PacketForger.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/PortScanner.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/RouterPwn.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/Sessions.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/Traceroute.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/DNSSpoofing.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/MITM.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/PasswordSniffer.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/Sniffer.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/SpoofSession.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/hijacker/Hijacker.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/hijacker/HijackerWebView.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/plugins/mitm/hijacker/Session.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/MenuControllableService.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/MsfRpcdService.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/NativeService.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/NetworkRadar.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/Service.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/Services.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/UpdateChecker.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/UpdateService.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/services/receivers/NetworkRadarReceiver.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/ArpSpoof.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Ettercap.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Fusemounts.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Hydra.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/IPTables.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Logcat.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Msf.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/MsfRpcd.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/NMap.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/NetworkRadar.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Raw.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Ruby.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Shell.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/TcpDump.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/Tool.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/tools/ToolBox.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/update/ApkUpdate.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/update/CoreUpdate.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/update/MsfUpdate.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/update/RubyUpdate.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/update/Update.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/Keygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/NetworkManager.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/WirelessMatcher.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/AliceKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/AndaredKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/ComtrendKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/ConnKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/DiscusKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/DlinkKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/EasyBoxKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/EircomKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/HuaweiKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/InfostradaKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/MegaredKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/OnoKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/OteKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/PBSKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/PirelliKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/SkyV1Keygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/TecomKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/TelseyKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/ThomsonKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/VerizonKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/Wlan2Keygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/Wlan6Keygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/ZyxelKeygen.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/helpers/AliceHandle.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java (100%) rename cSploit/src/{ => main/java}/org/csploit/android/wifi/algorithms/helpers/JenkinsHash.java (100%) rename cSploit/src/{org/csploit/android => main}/jniLibs/README (100%) rename cSploit/{ => src/main}/res/anim/fadein.xml (100%) rename cSploit/{ => src/main}/res/anim/fadeout.xml (100%) rename cSploit/{ => src/main}/res/anim/slide_in_left.xml (100%) rename cSploit/{ => src/main}/res/anim/slide_out_left.xml (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_back.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_backward.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_exploit_finder.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_forge.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_forward.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_hijack.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_image.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_injection.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_inspect.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_kill.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_login.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_mitm.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_monitor.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_open.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_passwords.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_plugin.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_redirect.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_refresh.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_routerpwn.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_scan.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_scanner.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_session.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_sniffer.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_traceroute.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/action_youtube.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/actionbar_gradient.xml (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/arrow_right.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/dsploit_icon.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/exploit_msf.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_amazon.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_blogger.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_facebook.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_generic.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_google.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_tumblr.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_twitter.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_xda.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/favicon_youtube.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/https_session.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_done_white_24dp.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_impossible.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_launcher.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_possible.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_refresh.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_lock_signal_1.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_lock_signal_2.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_lock_signal_3.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_lock_signal_4.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_signal_1.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_signal_2.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_signal_3.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/ic_wifi_signal_4.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/target_add.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/target_endpoint.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/target_network.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/target_remote.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/target_router.png (100%) rename cSploit/{ => src/main}/res/drawable-hdpi/target_self.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_back.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_backward.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_explo.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_exploit_finder.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_forge.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_forward.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_hijack.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_image.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_injection.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_inspect.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_kill.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_login.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_mitm.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_monitor.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_open.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_passwords.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_plugin.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_redirect.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_refresh.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_routerpwn.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_scan.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_scanner.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_session.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_sniffer.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_traceroute.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/action_youtube.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/actionbar_gradient.xml (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/arrow_right.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/dsploit_icon.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/exploit_msf.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_amazon.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_blogger.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_facebook.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_generic.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_google.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_tumblr.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_twitter.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_xda.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/favicon_youtube.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/https_session.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_done_white_24dp.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_impossible.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_launcher.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_possible.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_refresh.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_lock_signal_1.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_lock_signal_2.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_lock_signal_3.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_lock_signal_4.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_signal_1.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_signal_2.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_signal_3.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/ic_wifi_signal_4.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/target_add.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/target_endpoint.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/target_network.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/target_remote.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/target_router.png (100%) rename cSploit/{ => src/main}/res/drawable-mdpi/target_self.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_back.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_backward.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_exploit_finder.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_forge.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_forward.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_hijack.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_image.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_inject.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_inspect.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_kill.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_login.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_mitm.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_monitor.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_open.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_passwords.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_plugin.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_redirect.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_refresh.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_routerpwn.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_scan.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_scanner.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_session.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_sniffer.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_traceroute.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/action_youtube.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/arrow_right.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/exploit_msf.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/https_session.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/ic_done_white_24dp.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/target_add.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/target_endpoint.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/target_network.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/target_remote.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/target_router.png (100%) rename cSploit/{ => src/main}/res/drawable-xhdpi/target_self.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_back.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_backwards.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_exploit_finder.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_forge.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_forward.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_hijack.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_image.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_injection.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_inspect.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_kill.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_login.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_mitm.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_monitor.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_open.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_passwords.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_plugin.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_redirect.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_refresh.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_routerpwn.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_scan.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_scanner.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_session.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_sniffer.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_traceroute.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/action_youtube.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/arrow_right.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/exploit.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/exploit_msf.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/https_session.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/ic_done_white_24dp.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/target_add.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/target_endpoint.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/target_network.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/target_remote.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/target_router.png (100%) rename cSploit/{ => src/main}/res/drawable-xxhdpi/target_self.png (100%) rename cSploit/{ => src/main}/res/drawable-xxxhdpi/ic_done_white_24dp.png (100%) rename cSploit/{ => src/main}/res/drawable/actionbar_gradient.xml (100%) rename cSploit/{ => src/main}/res/drawable/card_background.9.png (100%) rename cSploit/{ => src/main}/res/drawable/card_background_dark.9.png (100%) rename cSploit/{ => src/main}/res/drawable/card_background_shadow.9.png (100%) rename cSploit/{ => src/main}/res/drawable/card_shadow.9.png (100%) rename cSploit/{ => src/main}/res/drawable/ic_play_arrow_24dp.xml (100%) rename cSploit/{ => src/main}/res/drawable/ic_stop_24dp.xml (100%) rename cSploit/{ => src/main}/res/drawable/rounded_square.xml (100%) rename cSploit/{ => src/main}/res/drawable/rounded_square_grey.xml (100%) rename cSploit/{ => src/main}/res/drawable/selectable_background_cardbank.xml (100%) rename cSploit/{ => src/main}/res/drawable/top_shadow.png (100%) rename cSploit/{ => src/main}/res/layout/about_dialog.xml (100%) rename cSploit/{ => src/main}/res/layout/actions_layout.xml (100%) rename cSploit/{ => src/main}/res/layout/actions_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/console_layout.xml (100%) rename cSploit/{ => src/main}/res/layout/dirpicker_chooser_list.xml (100%) rename cSploit/{ => src/main}/res/layout/dirpicker_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/file_edit.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_exploit_finder.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_exploit_finder_item.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_inspector.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_login_cracker.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_dns_spoofing.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_filter_dialog.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_hijacker.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_hijacker_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_hijacker_webview.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_password_sniffer.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_redirect_dialog.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_sniffer.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_mitm_sniffer_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_packet_forger.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_portscanner.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_sessions_layout.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_sessions_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/plugin_traceroute.xml (100%) rename cSploit/{ => src/main}/res/layout/target_empty.xml (100%) rename cSploit/{ => src/main}/res/layout/target_layout.xml (100%) rename cSploit/{ => src/main}/res/layout/target_list_item.xml (100%) rename cSploit/{ => src/main}/res/layout/wifi_scanner.xml (100%) rename cSploit/{ => src/main}/res/layout/wifi_scanner_list_item.xml (100%) rename cSploit/{ => src/main}/res/menu/browser.xml (100%) rename cSploit/{ => src/main}/res/menu/console.xml (100%) rename cSploit/{ => src/main}/res/menu/exploit_finder.xml (100%) rename cSploit/{ => src/main}/res/menu/hijacker.xml (100%) rename cSploit/{ => src/main}/res/menu/inspector.xml (100%) rename cSploit/{ => src/main}/res/menu/login_cracker.xml (100%) rename cSploit/{ => src/main}/res/menu/main.xml (100%) rename cSploit/{ => src/main}/res/menu/main_multi.xml (100%) rename cSploit/{ => src/main}/res/menu/password_sniffer.xml (100%) rename cSploit/{ => src/main}/res/menu/port_scanner.xml (100%) rename cSploit/{ => src/main}/res/menu/traceroute.xml (100%) rename cSploit/{ => src/main}/res/menu/vulnerability_finder.xml (100%) rename cSploit/{ => src/main}/res/menu/wifi_scanner.xml (100%) create mode 100644 cSploit/src/main/res/raw/.gitignore rename cSploit/{ => src/main}/res/raw/alice.xml (98%) rename cSploit/{ => src/main}/res/raw/webdic.zip (100%) rename cSploit/{ => src/main}/res/values-ar/strings.xml (100%) rename cSploit/{ => src/main}/res/values-cs/strings.xml (100%) rename cSploit/{ => src/main}/res/values-de/strings.xml (100%) rename cSploit/{ => src/main}/res/values-el/strings.xml (100%) rename cSploit/{ => src/main}/res/values-es/strings.xml (100%) rename cSploit/{ => src/main}/res/values-fi/strings.xml (100%) rename cSploit/{ => src/main}/res/values-fr/strings.xml (100%) rename cSploit/{ => src/main}/res/values-hr/strings.xml (100%) rename cSploit/{ => src/main}/res/values-it/strings.xml (100%) rename cSploit/{ => src/main}/res/values-nl/strings.xml (100%) rename cSploit/{ => src/main}/res/values-no/strings.xml (100%) rename cSploit/{ => src/main}/res/values-pl/strings.xml (100%) rename cSploit/{ => src/main}/res/values-pt/strings.xml (100%) rename cSploit/{ => src/main}/res/values-ru/strings.xml (100%) rename cSploit/{ => src/main}/res/values-tr/strings.xml (100%) rename cSploit/{ => src/main}/res/values-zh-rCN/strings.xml (100%) rename cSploit/{ => src/main}/res/values/colors.xml (100%) rename cSploit/{ => src/main}/res/values/strings.xml (100%) rename cSploit/{ => src/main}/res/values/style.xml (100%) rename cSploit/{ => src/main}/res/xml/preferences.xml (100%) 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 966c85463d..54f30ec2f3 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -99,18 +99,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/AndroidManifest.xml b/cSploit/src/main/AndroidManifest.xml similarity index 100% rename from cSploit/AndroidManifest.xml rename to cSploit/src/main/AndroidManifest.xml diff --git a/cSploit/assets/csploit.p12 b/cSploit/src/main/assets/csploit.p12 similarity index 100% rename from cSploit/assets/csploit.p12 rename to cSploit/src/main/assets/csploit.p12 diff --git a/cSploit/src/org/csploit/android/ActionActivity.java b/cSploit/src/main/java/org/csploit/android/ActionActivity.java similarity index 100% rename from cSploit/src/org/csploit/android/ActionActivity.java rename to cSploit/src/main/java/org/csploit/android/ActionActivity.java diff --git a/cSploit/src/org/csploit/android/CSploitApplication.java b/cSploit/src/main/java/org/csploit/android/CSploitApplication.java similarity index 100% rename from cSploit/src/org/csploit/android/CSploitApplication.java rename to cSploit/src/main/java/org/csploit/android/CSploitApplication.java diff --git a/cSploit/src/org/csploit/android/MainActivity.java b/cSploit/src/main/java/org/csploit/android/MainActivity.java similarity index 100% rename from cSploit/src/org/csploit/android/MainActivity.java rename to cSploit/src/main/java/org/csploit/android/MainActivity.java diff --git a/cSploit/src/org/csploit/android/SettingsActivity.java b/cSploit/src/main/java/org/csploit/android/SettingsActivity.java similarity index 100% rename from cSploit/src/org/csploit/android/SettingsActivity.java rename to cSploit/src/main/java/org/csploit/android/SettingsActivity.java diff --git a/cSploit/src/org/csploit/android/WifiScannerActivity.java b/cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java similarity index 100% rename from cSploit/src/org/csploit/android/WifiScannerActivity.java rename to cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java 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 100% rename from cSploit/src/org/csploit/android/core/ExecChecker.java rename to cSploit/src/main/java/org/csploit/android/core/ExecChecker.java diff --git a/cSploit/src/org/csploit/android/core/KnownIssues.java b/cSploit/src/main/java/org/csploit/android/core/KnownIssues.java similarity index 100% rename from cSploit/src/org/csploit/android/core/KnownIssues.java rename to cSploit/src/main/java/org/csploit/android/core/KnownIssues.java 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 100% rename from cSploit/src/org/csploit/android/core/MultiAttackService.java rename to cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java diff --git a/cSploit/src/org/csploit/android/core/Plugin.java b/cSploit/src/main/java/org/csploit/android/core/Plugin.java similarity index 100% rename from cSploit/src/org/csploit/android/core/Plugin.java rename to cSploit/src/main/java/org/csploit/android/core/Plugin.java 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 100% rename from cSploit/src/org/csploit/android/core/System.java rename to cSploit/src/main/java/org/csploit/android/core/System.java 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 100% rename from cSploit/src/org/csploit/android/events/Host.java rename to cSploit/src/main/java/org/csploit/android/events/Host.java 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 100% rename from cSploit/src/org/csploit/android/gui/Console.java rename to cSploit/src/main/java/org/csploit/android/gui/Console.java 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 100% rename from cSploit/src/org/csploit/android/gui/FileEdit.java rename to cSploit/src/main/java/org/csploit/android/gui/FileEdit.java diff --git a/cSploit/src/org/csploit/android/gui/MsfPreferences.java b/cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java similarity index 100% rename from cSploit/src/org/csploit/android/gui/MsfPreferences.java rename to cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/AboutDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/AboutDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/ChangelogDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ChangelogDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/ChoiceDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ChoiceDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/ConfirmDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ConfirmDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/CustomFilterDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/CustomFilterDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/ErrorDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ErrorDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/FatalDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/FatalDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/FinishDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/FinishDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/InputDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/InputDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/ListChoiceDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/ListChoiceDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/MultipleChoiceDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/RedirectionDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/RedirectionDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/SpinnerDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/SpinnerDialog.java 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 100% rename from cSploit/src/org/csploit/android/gui/dialogs/WifiCrackDialog.java rename to cSploit/src/main/java/org/csploit/android/gui/dialogs/WifiCrackDialog.java diff --git a/cSploit/src/org/csploit/android/helpers/NetworkHelper.java b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java similarity index 100% rename from cSploit/src/org/csploit/android/helpers/NetworkHelper.java rename to cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java 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 100% rename from cSploit/src/org/csploit/android/net/ByteBuffer.java rename to cSploit/src/main/java/org/csploit/android/net/ByteBuffer.java diff --git a/cSploit/src/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java similarity index 100% rename from cSploit/src/org/csploit/android/net/Endpoint.java rename to cSploit/src/main/java/org/csploit/android/net/Endpoint.java 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 100% rename from cSploit/src/org/csploit/android/net/IP4Address.java rename to cSploit/src/main/java/org/csploit/android/net/IP4Address.java diff --git a/cSploit/src/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java similarity index 100% rename from cSploit/src/org/csploit/android/net/Network.java rename to cSploit/src/main/java/org/csploit/android/net/Network.java diff --git a/cSploit/src/org/csploit/android/net/RemoteReader.java b/cSploit/src/main/java/org/csploit/android/net/RemoteReader.java similarity index 100% rename from cSploit/src/org/csploit/android/net/RemoteReader.java rename to cSploit/src/main/java/org/csploit/android/net/RemoteReader.java diff --git a/cSploit/src/org/csploit/android/net/Target.java b/cSploit/src/main/java/org/csploit/android/net/Target.java similarity index 100% rename from cSploit/src/org/csploit/android/net/Target.java rename to cSploit/src/main/java/org/csploit/android/net/Target.java 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 100% rename from cSploit/src/org/csploit/android/net/datasource/Rapid7.java rename to cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java 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 100% rename from cSploit/src/org/csploit/android/net/http/RequestParser.java rename to cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% rename from cSploit/src/org/csploit/android/net/metasploit/MsfExploit.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java 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 100% rename from cSploit/src/org/csploit/android/net/metasploit/Option.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java 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 100% rename from cSploit/src/org/csploit/android/net/metasploit/RPCClient.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/RPCClient.java 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 100% rename from cSploit/src/org/csploit/android/net/metasploit/ShellSession.java rename to cSploit/src/main/java/org/csploit/android/net/metasploit/ShellSession.java 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 100% rename from cSploit/src/org/csploit/android/net/reference/CVE.java rename to cSploit/src/main/java/org/csploit/android/net/reference/CVE.java 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 100% rename from cSploit/src/org/csploit/android/net/reference/Link.java rename to cSploit/src/main/java/org/csploit/android/net/reference/Link.java 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 100% rename from cSploit/src/org/csploit/android/net/reference/OSVDB.java rename to cSploit/src/main/java/org/csploit/android/net/reference/OSVDB.java 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 100% rename from cSploit/src/org/csploit/android/plugins/ExploitFinder.java rename to cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java diff --git a/cSploit/src/org/csploit/android/plugins/Inspector.java b/cSploit/src/main/java/org/csploit/android/plugins/Inspector.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/Inspector.java rename to cSploit/src/main/java/org/csploit/android/plugins/Inspector.java diff --git a/cSploit/src/org/csploit/android/plugins/LoginCracker.java b/cSploit/src/main/java/org/csploit/android/plugins/LoginCracker.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/LoginCracker.java rename to cSploit/src/main/java/org/csploit/android/plugins/LoginCracker.java diff --git a/cSploit/src/org/csploit/android/plugins/PacketForger.java b/cSploit/src/main/java/org/csploit/android/plugins/PacketForger.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/PacketForger.java rename to cSploit/src/main/java/org/csploit/android/plugins/PacketForger.java diff --git a/cSploit/src/org/csploit/android/plugins/PortScanner.java b/cSploit/src/main/java/org/csploit/android/plugins/PortScanner.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/PortScanner.java rename to cSploit/src/main/java/org/csploit/android/plugins/PortScanner.java diff --git a/cSploit/src/org/csploit/android/plugins/RouterPwn.java b/cSploit/src/main/java/org/csploit/android/plugins/RouterPwn.java similarity index 100% rename from cSploit/src/org/csploit/android/plugins/RouterPwn.java rename to cSploit/src/main/java/org/csploit/android/plugins/RouterPwn.java 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 100% rename from cSploit/src/org/csploit/android/plugins/Traceroute.java rename to cSploit/src/main/java/org/csploit/android/plugins/Traceroute.java 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 100% rename from cSploit/src/org/csploit/android/plugins/mitm/DNSSpoofing.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/DNSSpoofing.java 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 100% rename from cSploit/src/org/csploit/android/plugins/mitm/MITM.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java 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 100% rename from cSploit/src/org/csploit/android/plugins/mitm/PasswordSniffer.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/PasswordSniffer.java 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 100% rename from cSploit/src/org/csploit/android/plugins/mitm/Sniffer.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java 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 100% rename from cSploit/src/org/csploit/android/plugins/mitm/SpoofSession.java rename to cSploit/src/main/java/org/csploit/android/plugins/mitm/SpoofSession.java 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 100% 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 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 100% 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 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 100% rename from cSploit/src/org/csploit/android/services/UpdateService.java rename to cSploit/src/main/java/org/csploit/android/services/UpdateService.java 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 100% rename from cSploit/src/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java rename to cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java 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 100% rename from cSploit/src/org/csploit/android/tools/ArpSpoof.java rename to cSploit/src/main/java/org/csploit/android/tools/ArpSpoof.java 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/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 100% rename from cSploit/src/org/csploit/android/tools/ToolBox.java rename to cSploit/src/main/java/org/csploit/android/tools/ToolBox.java 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 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/AliceKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/AliceKeygen.java 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 100% rename from cSploit/src/org/csploit/android/wifi/algorithms/OnoKeygen.java rename to cSploit/src/main/java/org/csploit/android/wifi/algorithms/OnoKeygen.java 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 100% 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 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 100% rename from cSploit/res/layout/actions_list_item.xml rename to cSploit/src/main/res/layout/actions_list_item.xml diff --git a/cSploit/res/layout/console_layout.xml b/cSploit/src/main/res/layout/console_layout.xml similarity index 100% rename from cSploit/res/layout/console_layout.xml rename to cSploit/src/main/res/layout/console_layout.xml diff --git a/cSploit/res/layout/dirpicker_chooser_list.xml b/cSploit/src/main/res/layout/dirpicker_chooser_list.xml similarity index 100% rename from cSploit/res/layout/dirpicker_chooser_list.xml rename to cSploit/src/main/res/layout/dirpicker_chooser_list.xml diff --git a/cSploit/res/layout/dirpicker_list_item.xml b/cSploit/src/main/res/layout/dirpicker_list_item.xml similarity index 100% rename from cSploit/res/layout/dirpicker_list_item.xml rename to cSploit/src/main/res/layout/dirpicker_list_item.xml diff --git a/cSploit/res/layout/file_edit.xml b/cSploit/src/main/res/layout/file_edit.xml similarity index 100% rename from cSploit/res/layout/file_edit.xml rename to cSploit/src/main/res/layout/file_edit.xml diff --git a/cSploit/res/layout/plugin_exploit_finder.xml b/cSploit/src/main/res/layout/plugin_exploit_finder.xml similarity index 100% rename from cSploit/res/layout/plugin_exploit_finder.xml rename to cSploit/src/main/res/layout/plugin_exploit_finder.xml diff --git a/cSploit/res/layout/plugin_exploit_finder_item.xml b/cSploit/src/main/res/layout/plugin_exploit_finder_item.xml similarity index 100% rename from cSploit/res/layout/plugin_exploit_finder_item.xml rename to cSploit/src/main/res/layout/plugin_exploit_finder_item.xml diff --git a/cSploit/res/layout/plugin_inspector.xml b/cSploit/src/main/res/layout/plugin_inspector.xml similarity index 100% rename from cSploit/res/layout/plugin_inspector.xml rename to cSploit/src/main/res/layout/plugin_inspector.xml diff --git a/cSploit/res/layout/plugin_login_cracker.xml b/cSploit/src/main/res/layout/plugin_login_cracker.xml similarity index 100% rename from cSploit/res/layout/plugin_login_cracker.xml rename to cSploit/src/main/res/layout/plugin_login_cracker.xml diff --git a/cSploit/res/layout/plugin_mitm.xml b/cSploit/src/main/res/layout/plugin_mitm.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm.xml rename to cSploit/src/main/res/layout/plugin_mitm.xml diff --git a/cSploit/res/layout/plugin_mitm_dns_spoofing.xml b/cSploit/src/main/res/layout/plugin_mitm_dns_spoofing.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_dns_spoofing.xml rename to cSploit/src/main/res/layout/plugin_mitm_dns_spoofing.xml diff --git a/cSploit/res/layout/plugin_mitm_filter_dialog.xml b/cSploit/src/main/res/layout/plugin_mitm_filter_dialog.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_filter_dialog.xml rename to cSploit/src/main/res/layout/plugin_mitm_filter_dialog.xml diff --git a/cSploit/res/layout/plugin_mitm_hijacker.xml b/cSploit/src/main/res/layout/plugin_mitm_hijacker.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_hijacker.xml rename to cSploit/src/main/res/layout/plugin_mitm_hijacker.xml diff --git a/cSploit/res/layout/plugin_mitm_hijacker_list_item.xml b/cSploit/src/main/res/layout/plugin_mitm_hijacker_list_item.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_hijacker_list_item.xml rename to cSploit/src/main/res/layout/plugin_mitm_hijacker_list_item.xml diff --git a/cSploit/res/layout/plugin_mitm_hijacker_webview.xml b/cSploit/src/main/res/layout/plugin_mitm_hijacker_webview.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_hijacker_webview.xml rename to cSploit/src/main/res/layout/plugin_mitm_hijacker_webview.xml diff --git a/cSploit/res/layout/plugin_mitm_list_item.xml b/cSploit/src/main/res/layout/plugin_mitm_list_item.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_list_item.xml rename to cSploit/src/main/res/layout/plugin_mitm_list_item.xml diff --git a/cSploit/res/layout/plugin_mitm_password_sniffer.xml b/cSploit/src/main/res/layout/plugin_mitm_password_sniffer.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_password_sniffer.xml rename to cSploit/src/main/res/layout/plugin_mitm_password_sniffer.xml diff --git a/cSploit/res/layout/plugin_mitm_redirect_dialog.xml b/cSploit/src/main/res/layout/plugin_mitm_redirect_dialog.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_redirect_dialog.xml rename to cSploit/src/main/res/layout/plugin_mitm_redirect_dialog.xml diff --git a/cSploit/res/layout/plugin_mitm_sniffer.xml b/cSploit/src/main/res/layout/plugin_mitm_sniffer.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_sniffer.xml rename to cSploit/src/main/res/layout/plugin_mitm_sniffer.xml diff --git a/cSploit/res/layout/plugin_mitm_sniffer_list_item.xml b/cSploit/src/main/res/layout/plugin_mitm_sniffer_list_item.xml similarity index 100% rename from cSploit/res/layout/plugin_mitm_sniffer_list_item.xml rename to cSploit/src/main/res/layout/plugin_mitm_sniffer_list_item.xml diff --git a/cSploit/res/layout/plugin_packet_forger.xml b/cSploit/src/main/res/layout/plugin_packet_forger.xml similarity index 100% rename from cSploit/res/layout/plugin_packet_forger.xml rename to cSploit/src/main/res/layout/plugin_packet_forger.xml diff --git a/cSploit/res/layout/plugin_portscanner.xml b/cSploit/src/main/res/layout/plugin_portscanner.xml similarity index 100% rename from cSploit/res/layout/plugin_portscanner.xml rename to cSploit/src/main/res/layout/plugin_portscanner.xml 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 100% rename from cSploit/res/layout/plugin_traceroute.xml rename to cSploit/src/main/res/layout/plugin_traceroute.xml diff --git a/cSploit/res/layout/target_empty.xml b/cSploit/src/main/res/layout/target_empty.xml similarity index 100% rename from cSploit/res/layout/target_empty.xml rename to cSploit/src/main/res/layout/target_empty.xml diff --git a/cSploit/res/layout/target_layout.xml b/cSploit/src/main/res/layout/target_layout.xml similarity index 100% rename from cSploit/res/layout/target_layout.xml rename to cSploit/src/main/res/layout/target_layout.xml diff --git a/cSploit/res/layout/target_list_item.xml b/cSploit/src/main/res/layout/target_list_item.xml similarity index 100% rename from cSploit/res/layout/target_list_item.xml rename to cSploit/src/main/res/layout/target_list_item.xml diff --git a/cSploit/res/layout/wifi_scanner.xml b/cSploit/src/main/res/layout/wifi_scanner.xml similarity index 100% rename from cSploit/res/layout/wifi_scanner.xml rename to cSploit/src/main/res/layout/wifi_scanner.xml diff --git a/cSploit/res/layout/wifi_scanner_list_item.xml b/cSploit/src/main/res/layout/wifi_scanner_list_item.xml similarity index 100% rename from cSploit/res/layout/wifi_scanner_list_item.xml rename to cSploit/src/main/res/layout/wifi_scanner_list_item.xml diff --git a/cSploit/res/menu/browser.xml b/cSploit/src/main/res/menu/browser.xml similarity index 100% rename from cSploit/res/menu/browser.xml rename to cSploit/src/main/res/menu/browser.xml diff --git a/cSploit/res/menu/console.xml b/cSploit/src/main/res/menu/console.xml similarity index 100% rename from cSploit/res/menu/console.xml rename to cSploit/src/main/res/menu/console.xml diff --git a/cSploit/res/menu/exploit_finder.xml b/cSploit/src/main/res/menu/exploit_finder.xml similarity index 100% rename from cSploit/res/menu/exploit_finder.xml rename to cSploit/src/main/res/menu/exploit_finder.xml diff --git a/cSploit/res/menu/hijacker.xml b/cSploit/src/main/res/menu/hijacker.xml similarity index 100% rename from cSploit/res/menu/hijacker.xml rename to cSploit/src/main/res/menu/hijacker.xml diff --git a/cSploit/res/menu/inspector.xml b/cSploit/src/main/res/menu/inspector.xml similarity index 100% rename from cSploit/res/menu/inspector.xml rename to cSploit/src/main/res/menu/inspector.xml diff --git a/cSploit/res/menu/login_cracker.xml b/cSploit/src/main/res/menu/login_cracker.xml similarity index 100% rename from cSploit/res/menu/login_cracker.xml rename to cSploit/src/main/res/menu/login_cracker.xml diff --git a/cSploit/res/menu/main.xml b/cSploit/src/main/res/menu/main.xml similarity index 100% rename from cSploit/res/menu/main.xml rename to cSploit/src/main/res/menu/main.xml diff --git a/cSploit/res/menu/main_multi.xml b/cSploit/src/main/res/menu/main_multi.xml similarity index 100% rename from cSploit/res/menu/main_multi.xml rename to cSploit/src/main/res/menu/main_multi.xml diff --git a/cSploit/res/menu/password_sniffer.xml b/cSploit/src/main/res/menu/password_sniffer.xml similarity index 100% rename from cSploit/res/menu/password_sniffer.xml rename to cSploit/src/main/res/menu/password_sniffer.xml diff --git a/cSploit/res/menu/port_scanner.xml b/cSploit/src/main/res/menu/port_scanner.xml similarity index 100% rename from cSploit/res/menu/port_scanner.xml rename to cSploit/src/main/res/menu/port_scanner.xml diff --git a/cSploit/res/menu/traceroute.xml b/cSploit/src/main/res/menu/traceroute.xml similarity index 100% rename from cSploit/res/menu/traceroute.xml rename to cSploit/src/main/res/menu/traceroute.xml diff --git a/cSploit/res/menu/vulnerability_finder.xml b/cSploit/src/main/res/menu/vulnerability_finder.xml similarity index 100% rename from cSploit/res/menu/vulnerability_finder.xml rename to cSploit/src/main/res/menu/vulnerability_finder.xml diff --git a/cSploit/res/menu/wifi_scanner.xml b/cSploit/src/main/res/menu/wifi_scanner.xml similarity index 100% rename from cSploit/res/menu/wifi_scanner.xml rename to cSploit/src/main/res/menu/wifi_scanner.xml diff --git a/cSploit/src/main/res/raw/.gitignore b/cSploit/src/main/res/raw/.gitignore new file mode 100644 index 0000000000..139521df5c --- /dev/null +++ b/cSploit/src/main/res/raw/.gitignore @@ -0,0 +1 @@ +!webdic.zip diff --git a/cSploit/res/raw/alice.xml b/cSploit/src/main/res/raw/alice.xml similarity index 98% rename from cSploit/res/raw/alice.xml rename to cSploit/src/main/res/raw/alice.xml index 4e85ed58dc..d129f905d2 100644 --- a/cSploit/res/raw/alice.xml +++ b/cSploit/src/main/res/raw/alice.xml @@ -1,305 +1,305 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 100% rename from cSploit/res/values-cs/strings.xml rename to cSploit/src/main/res/values-cs/strings.xml 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 100% rename from cSploit/res/values-it/strings.xml rename to cSploit/src/main/res/values-it/strings.xml diff --git a/cSploit/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml similarity index 100% rename from cSploit/res/values-nl/strings.xml rename to cSploit/src/main/res/values-nl/strings.xml 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 100% rename from cSploit/res/values-pt/strings.xml rename to cSploit/src/main/res/values-pt/strings.xml diff --git a/cSploit/res/values-ru/strings.xml b/cSploit/src/main/res/values-ru/strings.xml similarity index 100% rename from cSploit/res/values-ru/strings.xml rename to cSploit/src/main/res/values-ru/strings.xml 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 100% rename from cSploit/res/values-zh-rCN/strings.xml rename to cSploit/src/main/res/values-zh-rCN/strings.xml 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 100% rename from cSploit/res/values/strings.xml rename to cSploit/src/main/res/values/strings.xml diff --git a/cSploit/res/values/style.xml b/cSploit/src/main/res/values/style.xml similarity index 100% rename from cSploit/res/values/style.xml rename to cSploit/src/main/res/values/style.xml diff --git a/cSploit/res/xml/preferences.xml b/cSploit/src/main/res/xml/preferences.xml similarity index 100% rename from cSploit/res/xml/preferences.xml rename to cSploit/src/main/res/xml/preferences.xml From 4b51e051459f3a0f2c23c0363461dbfa4e7222d0 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Wed, 14 Oct 2015 14:07:17 +0200 Subject: [PATCH 018/110] tests! --- cSploit/build.gradle | 1 + .../android/helpers/NetworkHelperTest.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java diff --git a/cSploit/build.gradle b/cSploit/build.gradle index 54f30ec2f3..8b0988cc42 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -33,6 +33,7 @@ dependencies { compile 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3' compile 'org.tukaani:xz:1.5' compile 'ch.acra:acra:4.6.2' + testCompile 'junit:junit:4.12' } android { 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..a75c8f4957 --- /dev/null +++ b/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java @@ -0,0 +1,19 @@ +package org.csploit.android.helpers; + +import junit.framework.Assert; +import junit.framework.TestCase; + +/** + * 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); + } +} From d394853288e2e13215ca2ad23cf557715c891269 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Wed, 14 Oct 2015 14:22:47 +0200 Subject: [PATCH 019/110] partially fixes #428 --- .../main/java/org/csploit/android/MainActivity.java | 1 - .../main/java/org/csploit/android/core/System.java | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/MainActivity.java b/cSploit/src/main/java/org/csploit/android/MainActivity.java index a5a0ef1dba..cb7db96a1b 100644 --- a/cSploit/src/main/java/org/csploit/android/MainActivity.java +++ b/cSploit/src/main/java/org/csploit/android/MainActivity.java @@ -687,7 +687,6 @@ public void onInputEntered(String input) { @Override public void run() { System.addOrderedTarget(target); - mTargetAdapter.update(null, null); } }); } else diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index cf284e4b80..9ddbdd4586 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -1086,16 +1086,21 @@ public static boolean addOrderedTarget(Target target) { return false; } + boolean inserted = false; + for (int i = 0; i < mTargets.size(); i++) { if (mTargets.get(i).comesAfter(target)) { mTargets.add(i, target); - Services.getNetworkRadar().onNewTargetFound(target); - return true; + inserted = true; + break; } } - mTargets.add(target); + if(!inserted) + mTargets.add(target); + Services.getNetworkRadar().onNewTargetFound(target); + notifyTargetListChanged(); return true; } } From a1f1d20e182b87953f36c409559ec0c3f0c502ba Mon Sep 17 00:00:00 2001 From: ga Date: Thu, 15 Oct 2015 13:24:55 +0200 Subject: [PATCH 020/110] Define the floating button at the end of the RelativeLayout, to put it over all the others widgets. Thanks to @0MazaHacka0 for reporting it. Closes #432 --- .../src/main/res/layout/plugin_inspector.xml | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/cSploit/src/main/res/layout/plugin_inspector.xml b/cSploit/src/main/res/layout/plugin_inspector.xml index 1c9ee175ef..026735c44a 100644 --- a/cSploit/src/main/res/layout/plugin_inspector.xml +++ b/cSploit/src/main/res/layout/plugin_inspector.xml @@ -6,19 +6,6 @@ android:paddingTop="16sp" android:id="@+id/whatever"> - - + + + \ No newline at end of file From f4295f966ededf5fa033939f6d9914e45e47d726 Mon Sep 17 00:00:00 2001 From: fattire Date: Fri, 16 Oct 2015 01:59:11 -0700 Subject: [PATCH 021/110] Update support library 23.01->23.1.0 --- cSploit/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cSploit/build.gradle b/cSploit/build.gradle index 8b0988cc42..1181c22f61 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -21,10 +21,10 @@ allprojects { 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 'com.android.support:support-v4:23.1.0' + compile 'com.android.support:appcompat-v7:23.1.0' + compile 'com.android.support:design:23.1.0' + compile 'com.android.support:preference-v7:23.1.0' compile 'org.apache.commons:commons-compress:1.10' compile 'commons-net:commons-net:3.3' compile 'com.github.zafarkhaja:java-semver:0.9.0' From 81868002583e44d856aac76bdb3f5024a048bde8 Mon Sep 17 00:00:00 2001 From: ga Date: Fri, 16 Oct 2015 22:14:16 +0200 Subject: [PATCH 022/110] display activity when dumping traffic to a pcap file. --- .../csploit/android/plugins/mitm/Sniffer.java | 121 +++++++++++++++--- 1 file changed, 102 insertions(+), 19 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java index 0a3ab1f76b..f5280f93a5 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; +import android.os.FileObserver; import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.view.LayoutInflater; @@ -50,6 +51,7 @@ import org.csploit.android.tools.TcpDump; import java.io.File; +import java.io.IOException; 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 = ""; @@ -402,6 +405,14 @@ private void setStoppedState(){ mTcpdumpProcess.kill(); mTcpdumpProcess = null; } + + if(mDumpToFile) { + if (mFileActivity != null) { + mFileActivity.stopWatching(); + mFileActivity = null; + } + } + Sniffer.this.runOnUiThread(new Runnable() { @Override public void run() { @@ -415,6 +426,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 +474,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 +551,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 +569,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 ) { From 8f257e1f292b75db250cc7d1a11b0d36b06ddd45 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 17 Oct 2015 11:11:37 +0200 Subject: [PATCH 023/110] add pledgie donations --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cb29e343b1..9313cc6638 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,12 @@ This program is free software: you can redistribute it and/or modify it under th 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.*** From 4bd3b35527243dc61769541f292a99dd782073b9 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 17 Oct 2015 11:48:47 +0200 Subject: [PATCH 024/110] fixes #443 --- cSploit/jni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/jni b/cSploit/jni index 7676d786a0..02a6b6a46e 160000 --- a/cSploit/jni +++ b/cSploit/jni @@ -1 +1 @@ -Subproject commit 7676d786a074a8836254006020f97c45b811f915 +Subproject commit 02a6b6a46eca27051e4d6558af1d83da56afb79d From b7c3ff988beebeebb06dffdc7768342c9ee969b0 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sat, 17 Oct 2015 20:30:38 +1000 Subject: [PATCH 025/110] Update strings.xml --- cSploit/src/main/res/values-ru/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cSploit/src/main/res/values-ru/strings.xml b/cSploit/src/main/res/values-ru/strings.xml index 0218ed8b8e..763c075c24 100644 --- a/cSploit/src/main/res/values-ru/strings.xml +++ b/cSploit/src/main/res/values-ru/strings.xml @@ -490,4 +490,8 @@ Выбрать цель Выбрать %s ? Перед открытием новой проблемы поищите посмотрите список в открытых проблем, возможно она уже открыта. Если нету сообщения о проблеме нам нужны как можно больше данных, так что пожайлуста прочитайте это руководство, чтобы знать как правильно сообщить о баге.

]]>
+ соединение потеряно + удалить текущую сессию и начать другую? + любой интерфейс + Ошибка инициализации %s From b8f8276bff7adf1d825069ad8140b4858107f18d Mon Sep 17 00:00:00 2001 From: Tajnymag Date: Sun, 18 Oct 2015 16:40:59 +0200 Subject: [PATCH 026/110] Updated czech translation --- cSploit/src/main/res/values-cs/strings.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/cSploit/src/main/res/values-cs/strings.xml b/cSploit/src/main/res/values-cs/strings.xml index 00ae9776c3..83eb9c4dec 100644 --- a/cSploit/src/main/res/values-cs/strings.xml +++ b/cSploit/src/main/res/values-cs/strings.xml @@ -1,4 +1,5 @@ + cSploit Nastavení cSploit Ooooops! Něco je špatně, ale zpráva bude odeslána mému vývojáři pro opravu chyby:) @@ -7,6 +8,7 @@ Vyplňte přesměrovací údaje: Adresa Port + Porty Cíl neznámé Služby @@ -23,6 +25,7 @@ Protokol cSploit - An Android network penetration suite. Copyleft of Simone Margaritelli aka evilsocket. + http://www.csploit.org/ Záruka @@ -79,7 +82,8 @@ Opravdu zavřít? Pro ukončení aplikace stiskněte znovu ZPĚT - Vybráno  + Vybráno:   + https://github.com/cSploit/android/issues/new Na SD kartě nebyl nalezen žádný spoubor ze sezení Vyberte soubor ze sezení na SD kartě : Vyberte sezení @@ -293,6 +297,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 +378,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 +394,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 +501,12 @@ Dobrý Skvělý Excellentní + Zvolte cíl + Zvolit %s ? + https://github.com/cSploit/android/issues + 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
From be70dcf1f47de95c1ecbebeae098d13afd478583 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 18 Oct 2015 18:02:40 +0200 Subject: [PATCH 027/110] fixes #429 --- .../org/csploit/android/MainActivity.java | 1 + .../java/org/csploit/android/core/System.java | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/MainActivity.java b/cSploit/src/main/java/org/csploit/android/MainActivity.java index cb7db96a1b..4524e783cf 100644 --- a/cSploit/src/main/java/org/csploit/android/MainActivity.java +++ b/cSploit/src/main/java/org/csploit/android/MainActivity.java @@ -150,6 +150,7 @@ public void run() { } private void onCoreUpdated() { + System.onCoreInstalled(); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index 9ddbdd4586..dabaaf0ca6 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -196,13 +196,8 @@ public static void init(Context context) throws Exception { // initialize network data at the end uncaughtReloadNetworkMapping(); - ThreadHelper.getSharedExecutor().execute(new Runnable() { - @Override - public void run() { - preloadVendors(); - preloadServices(); - } - }); + if(isCoreInstalled()) + beginLoadServicesAndVendors(); } catch (Exception e) { if (!(e instanceof NoRouteToHostException)) errorLogging(e); @@ -211,6 +206,20 @@ public void run() { } } + 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(); } From f7c423e1cb8f28677cd4dcad03d5c7150aa96362 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 18 Oct 2015 18:19:07 +0200 Subject: [PATCH 028/110] fixes #437 --- .../org/csploit/android/MainActivity.java | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/MainActivity.java b/cSploit/src/main/java/org/csploit/android/MainActivity.java index 4524e783cf..e96018c91e 100644 --- a/cSploit/src/main/java/org/csploit/android/MainActivity.java +++ b/cSploit/src/main/java/org/csploit/android/MainActivity.java @@ -964,16 +964,20 @@ public View getView(int position, View convertView, ViewGroup parent) { } public void clearSelection() { - for (Target t : list) - t.setSelected(false); + synchronized (this) { + 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()); + synchronized (this) { + Target t = list.get(position); + t.setSelected(!t.isSelected()); + } notifyDataSetChanged(); if (mActionMode != null) { if (getSelectedCount() > 0) @@ -985,27 +989,34 @@ public void toggleSelection(int position) { public int getSelectedCount() { int i = 0; - for (Target t : list) - if (t.isSelected()) - i++; + synchronized (this) { + 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); + synchronized (this) { + for (Target t : list) + if (t.isSelected()) + result.add(t); + } return result; } public int[] getSelectedPositions() { - int[] res = new int[getSelectedCount()]; + int[] res; int j = 0; - for (int i = 0; i < list.size(); i++) - if (list.get(i).isSelected()) - res[j++] = i; + synchronized (this) { + res = new int[getSelectedCount()]; + for (int i = 0; i < list.size(); i++) + if (list.get(i).isSelected()) + res[j++] = i; + } return res; } @@ -1025,13 +1036,16 @@ public void update(Observable observable, Object data) { 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; - } + 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; + } + } } }); @@ -1039,7 +1053,9 @@ public void run() { @Override public void run() { - list = System.getTargets(); + synchronized (this) { + list = System.getTargets(); + } notifyDataSetChanged(); } From d026fd70ab69fd80e145ae55eb019a6de95d59c3 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 18 Oct 2015 18:28:27 +0200 Subject: [PATCH 029/110] partially fixes #446 --- cSploit/src/main/java/org/csploit/android/net/Network.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index 8fc9f95208..203cf3609a 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -323,7 +323,7 @@ public static List getAvailableInterfaces() { while (interfaces.hasMoreElements()) { NetworkInterface iface = interfaces.nextElement(); if (isIfaceConnected(iface)) { - result.add(iface.getDisplayName()); + result.add(iface.getName()); } } From 56cfa3c7ae5408108e3483af0a8f2b5705b3632b Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 18 Oct 2015 18:54:04 +0200 Subject: [PATCH 030/110] removed strings that should not be translated --- cSploit/src/main/res/values-cs/strings.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cSploit/src/main/res/values-cs/strings.xml b/cSploit/src/main/res/values-cs/strings.xml index 83eb9c4dec..358ad81298 100644 --- a/cSploit/src/main/res/values-cs/strings.xml +++ b/cSploit/src/main/res/values-cs/strings.xml @@ -1,5 +1,4 @@ - cSploit Nastavení cSploit Ooooops! Něco je špatně, ale zpráva bude odeslána mému vývojáři pro opravu chyby:) @@ -25,7 +24,6 @@ Protokol cSploit - An Android network penetration suite. Copyleft of Simone Margaritelli aka evilsocket. - http://www.csploit.org/ Záruka @@ -83,7 +81,6 @@ Pro ukončení aplikace stiskněte znovu ZPĚT Vybráno:   - https://github.com/cSploit/android/issues/new Na SD kartě nebyl nalezen žádný spoubor ze sezení Vyberte soubor ze sezení na SD kartě : Vyberte sezení @@ -503,7 +500,6 @@ Excellentní Zvolte cíl Zvolit %s ? - https://github.com/cSploit/android/issues 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é? From a5e51d3e292f068342887c617b6a6455e430c212 Mon Sep 17 00:00:00 2001 From: fattire Date: Sat, 17 Oct 2015 02:57:07 -0700 Subject: [PATCH 031/110] Start breaking Activities into fragments (breaks MITM for some reason) The first step in more UI flexibility-- will help with stuff like a side navigation bar and multi-fragment layouts for tablets. Unfortunately this breaks MITM for some reason TBD. It's the first step. Will probably do plugins as well. --- .../org/csploit/android/ActionActivity.java | 137 +- .../org/csploit/android/ActionFragment.java | 153 ++ .../org/csploit/android/MainActivity.java | 1294 +--------------- .../org/csploit/android/MainFragment.java | 1330 +++++++++++++++++ .../org/csploit/android/SettingsActivity.java | 571 +------ .../org/csploit/android/SettingsFragment.java | 604 ++++++++ .../csploit/android/WifiScannerActivity.java | 635 +------- .../csploit/android/WifiScannerFragment.java | 671 +++++++++ .../java/org/csploit/android/core/System.java | 4 +- .../csploit/android/plugins/mitm/MITM.java | 5 +- cSploit/src/main/res/layout/main.xml | 5 + cSploit/src/main/res/values/style.xml | 7 + 12 files changed, 2835 insertions(+), 2581 deletions(-) create mode 100644 cSploit/src/main/java/org/csploit/android/ActionFragment.java create mode 100644 cSploit/src/main/java/org/csploit/android/MainFragment.java create mode 100644 cSploit/src/main/java/org/csploit/android/SettingsFragment.java create mode 100644 cSploit/src/main/java/org/csploit/android/WifiScannerFragment.java create mode 100644 cSploit/src/main/res/layout/main.xml diff --git a/cSploit/src/main/java/org/csploit/android/ActionActivity.java b/cSploit/src/main/java/org/csploit/android/ActionActivity.java index 1fcba75a42..de675fcd1d 100644 --- a/cSploit/src/main/java/org/csploit/android/ActionActivity.java +++ b/cSploit/src/main/java/org/csploit/android/ActionActivity.java @@ -18,142 +18,35 @@ */ 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; + + ActionFragment f; @Override - public void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - Boolean isDark = themePrefs.getBoolean("isDark", false); - - if (isDark) + if (themePrefs.getBoolean("isDark", false)) 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(); + 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 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; - } + 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..ba82dec8db --- /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 android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +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 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/main/java/org/csploit/android/MainActivity.java b/cSploit/src/main/java/org/csploit/android/MainActivity.java index e96018c91e..79accb87a7 100644 --- a/cSploit/src/main/java/org/csploit/android/MainActivity.java +++ b/cSploit/src/main/java/org/csploit/android/MainActivity.java @@ -1,3 +1,4 @@ + /* * This file is part of the dSploit. * @@ -18,1307 +19,34 @@ */ 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 android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; -import android.support.v7.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 MainActivity extends AppCompatActivity { - 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 - protected void onActivityResult(int requestCode, int resultCode, - Intent intent) { - if (requestCode == WIFI_CONNECTION_REQUEST && resultCode == RESULT_OK - && intent.hasExtra(WifiScannerActivity.CONNECTED)) { - init(); - } - } - - 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 void onCoreUpdated() { - System.onCoreInstalled(); - MainActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - init(); - startAllServices(); - notifyMenuChanged(); - } - }); - } + MainFragment f; @Override - public void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences themePrefs = getSharedPreferences("THEME", 0); - Boolean isDark = themePrefs.getBoolean("isDark", false); - - if (isDark) + if (themePrefs.getBoolean("isDark", false)) setTheme(R.style.DarkTheme); else setTheme(R.style.AppTheme); - - setContentView(R.layout.target_layout); - - mEmptyTextView = (TextView) findViewById(R.id.emptyTextView); - lv = (ListView) findViewById(R.id.android_list); - mTextView = (TextView) 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(MainActivity.this, - ActionActivity.class), WIFI_CONNECTION_REQUEST); - - overridePendingTransition(R.anim.fadeout, R.anim.fadein); - } - }); - - Toast.makeText(MainActivity.this, - 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 = startSupportActionMode(mActionModeCallback); - } - mTargetAdapter.toggleSelection(position); - return true; - } - }); - mTargetAdapter = new TargetAdapter(); - - lv.setEmptyView(findViewById(android.R.id.empty)); - lv.setAdapter(mTargetAdapter); - - System.setTargetListObserver(mTargetAdapter); - - mRadarReceiver.register(this); - mUpdateReceiver.register(this); - mWipeReceiver.register(this); - mMsfReceiver.register(this); - mConnectivityReceiver.register(this); - - init(); - startAllServices(); - } - - private void startAllServices() { - startNetworkRadar(); - startUpdateChecker(); - startRPCServer(); - } - - private void notifyMenuChanged() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - 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)); - } + setContentView(R.layout.main); + if (findViewById(R.id.mainframe) != null) { + if (savedInstanceState != null) { return; } - } - - // if all is initialized, configure the network - initSystem(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main, menu); - - mMenu = menu; - configureMenu(); - - return super.onCreateOptionsMenu(menu); - } - - private boolean isConnectivityAvailable() { - return Network.isConnectivityAvailable(this) || Network.isWifiConnected(this); - } - - 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 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 boolean initSystem() { - // retry - try { - System.init(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) { - 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; - - runOnUiThread(new Runnable() { - @Override - public void run() { - if (msg != null) { - Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show(); - } - notifyMenuChanged(); - } - }); - } - - private void onConnectionLost() { - if (mOfflineMode) - return; - - mOfflineMode = true; - - stopNetworkRadar(); - System.markNetworkAsDisconnected(); - - runOnUiThread(new Runnable() { - @Override - public void run() { - new ConfirmDialog(getString(R.string.connection_lost), - getString(R.string.connection_lost_prompt), MainActivity.this, - 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, this, 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), this).show(); - } - } - - 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, 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 (!isConnectivityAvailable() || mIsUpdateDownloading) - return; - if (System.getSettings().getBoolean("PREF_CHECK_UPDATES", true)) { - new UpdateChecker(this).start(); - mIsUpdateDownloading = true; - } else { - MainActivity.this.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), 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); - } - }); - } 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_ifaces: - displayNetworkInterfaces(true); - 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(); - - 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); - } 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); + f = new MainFragment(); + getSupportFragmentManager().beginTransaction() + .add(R.id.mainframe, f).commit(); } } - @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(); - 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 = 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() { - 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 - 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; - 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(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); - 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; - } - - 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 (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 (this) { - 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 (this) { - if (mTask != null) { - mTask.cancel(); - } - } - } - - private void check() { - 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(); - } - - synchronized (this) { - mTask = null; - } - } + f.onBackPressed(); } } \ 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..730c43c407 --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/MainFragment.java @@ -0,0 +1,1330 @@ +/* + * 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 android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +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.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(); + } + } + + 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() { + 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(); + } + + synchronized (getActivity()) { + 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 index 4a64f9787a..5ff17402c5 100644 --- a/cSploit/src/main/java/org/csploit/android/SettingsActivity.java +++ b/cSploit/src/main/java/org/csploit/android/SettingsActivity.java @@ -18,571 +18,34 @@ */ 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()); - } - } + SettingsFragment f; @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); + 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(); } - } } - private void startDirectoryPicker(Preference preference) { - Intent i = new Intent(getActivity(), DirectoryPicker.class); - i.putExtra(DirectoryPicker.AFFECTED_PREF, preference.getKey()); - startActivityForResult(i, DirectoryPicker.PICK_DIRECTORY); + public void onBackPressed() { + f.onBackPressed(); } - - @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/main/java/org/csploit/android/SettingsFragment.java b/cSploit/src/main/java/org/csploit/android/SettingsFragment.java new file mode 100644 index 0000000000..ba6db23dd2 --- /dev/null +++ b/cSploit/src/main/java/org/csploit/android/SettingsFragment.java @@ -0,0 +1,604 @@ +/* + * 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.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +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.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; + +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) { + 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).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 != 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).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, 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 index ad1fdf3195..6641543c4a 100644 --- a/cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java +++ b/cSploit/src/main/java/org/csploit/android/WifiScannerActivity.java @@ -18,635 +18,34 @@ */ 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 android.support.v7.app.AppCompatActivity; -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; +public class WifiScannerActivity extends AppCompatActivity { -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(); - } + WifiScannerFragment f; @Override - public void onCreate(Bundle savedInstanceState){ + protected 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 + "\""; - + if (themePrefs.getBoolean("isDark", false)) + setTheme(R.style.DarkTheme); 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; - } + 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(); } - - 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(); - } - } - } + 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..77aace94d5 --- /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 android.support.v4.app.ListFragment; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.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/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index dabaaf0ca6..cb73a510d0 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -40,7 +40,7 @@ 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; @@ -387,7 +387,7 @@ public static boolean checkNetworking(final Activity current) { if (!mNetwork.isConnected()) { Intent intent = new Intent(); - intent.putExtra(WifiScannerActivity.CONNECTED, false); + intent.putExtra(WifiScannerFragment.CONNECTED, false); current.setResult(Activity.RESULT_OK, intent); String title = current.getString(R.string.error); diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java index 8497d3cd26..afbed8f90e 100644 --- a/cSploit/src/main/java/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; @@ -302,7 +303,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 +337,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 diff --git a/cSploit/src/main/res/layout/main.xml b/cSploit/src/main/res/layout/main.xml new file mode 100644 index 0000000000..c0c59ac306 --- /dev/null +++ b/cSploit/src/main/res/layout/main.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/cSploit/src/main/res/values/style.xml b/cSploit/src/main/res/values/style.xml index 391ade399d..628c655cfb 100644 --- a/cSploit/src/main/res/values/style.xml +++ b/cSploit/src/main/res/values/style.xml @@ -11,6 +11,8 @@ @color/selectable_blue @color/app_color_dark @color/selectable_blue + @color/background_window + @style/AppAnimation @@ -26,6 +28,7 @@ @color/selectable_blue_dark @color/background_window_dark #ff21272b + @style/AppAnimation From a61b5473a1691dc4e07a4fffbcd64ac5015a5df4 Mon Sep 17 00:00:00 2001 From: ga Date: Mon, 19 Oct 2015 18:22:45 +0200 Subject: [PATCH 032/110] Put the floating button above all the rest of the widgets. Fixed exploit finder button logic. Should close #452, #455. --- .../android/plugins/ExploitFinder.java | 6 +++-- .../main/res/layout/plugin_exploit_finder.xml | 24 +++++++++---------- .../main/res/layout/plugin_portscanner.xml | 23 +++++++++--------- .../src/main/res/layout/plugin_traceroute.xml | 24 +++++++++---------- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java b/cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java index 88b7e15200..e2acb447e8 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/ExploitFinder.java @@ -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/main/res/layout/plugin_exploit_finder.xml b/cSploit/src/main/res/layout/plugin_exploit_finder.xml index 295781e447..6aae0d9c12 100644 --- a/cSploit/src/main/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/src/main/res/layout/plugin_portscanner.xml b/cSploit/src/main/res/layout/plugin_portscanner.xml index 0609cbebb2..a2143e10f8 100644 --- a/cSploit/src/main/res/layout/plugin_portscanner.xml +++ b/cSploit/src/main/res/layout/plugin_portscanner.xml @@ -4,18 +4,6 @@ android:layout_height="fill_parent" android:orientation="vertical"> - - - + + diff --git a/cSploit/src/main/res/layout/plugin_traceroute.xml b/cSploit/src/main/res/layout/plugin_traceroute.xml index 87219b024f..88cb31ecf0 100644 --- a/cSploit/src/main/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 From 1b4a0f0237ab63ec3f3eeb0ec25847bbab4b5641 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Tue, 20 Oct 2015 23:12:56 +0200 Subject: [PATCH 033/110] can now run on interfaces without a default gateway. Initial support for #436 --- .../java/org/csploit/android/core/System.java | 25 ++++--- .../java/org/csploit/android/net/Network.java | 46 ++++++++++-- .../csploit/android/plugins/mitm/MITM.java | 74 ++++++++++++------- .../android/plugins/mitm/SpoofSession.java | 55 ++++++++------ .../org/csploit/android/tools/ArpSpoof.java | 10 ++- 5 files changed, 143 insertions(+), 67 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index dabaaf0ca6..2bd8f7ec3c 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -954,15 +954,22 @@ 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(); @@ -1004,7 +1011,9 @@ public static void markNetworkAsDisconnected() { 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()) { @@ -1014,7 +1023,7 @@ public static void markInitialNetworkTargetsAsConnected() { } default: if (localAddress.equals(t.getAddress()) || - gatewayAddress.equals(t.getAddress())) { + (haveGateway && gatewayAddress.equals(t.getAddress()))) { t.setConneced(true); } break; @@ -1221,10 +1230,6 @@ public static Collection getCurrentExploits() { return getCurrentTarget().getExploits(); } - public static String getGatewayAddress() { - return mNetwork.getGatewayAddress().getHostAddress(); - } - public static boolean isForwardingEnabled() { boolean forwarding = false; BufferedReader reader; diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index 203cf3609a..3d251d7550 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -34,6 +34,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.reflect.Method; import java.net.InetAddress; import java.net.InterfaceAddress; import java.net.NetworkInterface; @@ -101,6 +102,7 @@ public String toString() { 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 @@ -121,6 +123,7 @@ public Network(Context context, String iface) throws SocketException, UnknownHos mGateway = new IP4Address(mInfo.gateway); mNetmask = getNetmask(); mBase = new IP4Address(mInfo.netmask & mInfo.gateway); + mTetheredIfacesMethod = getTetheredIfacesMethod(mConnectivityManager); if (iface != null) { if (initNetworkInterface(iface)) @@ -136,6 +139,15 @@ public Network(Context context, String iface) throws SocketException, UnknownHos 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) { try { @@ -158,10 +170,17 @@ public boolean initNetworkInterface(String iface) { Short.toString(ifaceAddress.getNetworkPrefixLength())); mLocal = new IP4Address(su.getInfo().getAddress()); - mGateway = new IP4Address(getSystemGateway(mInterface.getDisplayName())); mNetmask = new IP4Address(su.getInfo().getNetmask()); mBase = new IP4Address(su.getInfo().getNetworkAddress()); + String gateway = getSystemGateway(mInterface.getDisplayName()); + + if(gateway == null) { + mGateway = null; + } else { + mGateway = new IP4Address(gateway); + } + return true; } catch (Exception e) { Logger.error("Error: " + e.getLocalizedMessage()); @@ -194,11 +213,11 @@ public boolean equals(Network network) { } public boolean isInternal(byte[] address) { - byte[] gateway = mGateway.toByteArray(); + byte[] local = mLocal.toByteArray(); byte[] mask = mNetmask.toByteArray(); - for (int i = 0; i < gateway.length; i++) - if ((gateway[i] & mask[i]) != (address[i] & mask[i])) + for (int i = 0; i < local.length; i++) + if ((local[i] & mask[i]) != (address[i] & mask[i])) return false; return true; @@ -265,8 +284,25 @@ 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.toInetAddress(); + return mGateway == null ? null : mGateway.toInetAddress(); } public byte[] getGatewayHardware() { diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java index 8497d3cd26..59e60586b1 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/MITM.java @@ -95,16 +95,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 +144,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 +158,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; } @@ -442,7 +449,7 @@ public void onClick(View v) { ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action ( @@ -452,7 +459,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 +474,7 @@ public void onClick(View v){ ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action @@ -478,7 +485,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 +500,7 @@ public void onClick(View v) { ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action ( @@ -503,7 +510,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 +525,7 @@ public void onClick(View v){ ); overridePendingTransition(R.anim.fadeout, R.anim.fadein); } - })); + }, null)); mActions.add(new Action ( @@ -528,19 +535,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 +569,10 @@ public void run() { }); } }); + } else { + mConnectionKillerProcess = null; + System.setForwarding(false); + } activity.setVisibility(View.VISIBLE); @@ -575,10 +588,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 +665,7 @@ public void onError(String error, int resId){ } else setStoppedState(); } - })); + }, null)); mActions.add(new Action ( @@ -745,7 +767,7 @@ public void onError(String error, int resId){ setStoppedState(); } } - })); + }, null)); mActions.add(new Action ( @@ -825,7 +847,7 @@ public void onError(String error, int resId){ } else setStoppedState(); } - })); + }, null)); mActions.add(new Action ( @@ -835,7 +857,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 +934,7 @@ public void onError(String error, int resId){ setStoppedState(); } } - })); + }, null)); mActions.add(new Action ( @@ -921,7 +943,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/main/java/org/csploit/android/plugins/mitm/SpoofSession.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/SpoofSession.java index ea18565fad..b78fda6e4f 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/tools/ArpSpoof.java b/cSploit/src/main/java/org/csploit/android/tools/ArpSpoof.java index 5ee8e7e5c1..5b7d085961 100644 --- a/cSploit/src/main/java/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); } From befe2ae5172ce7e504178c98d038817cb7834cc5 Mon Sep 17 00:00:00 2001 From: F Date: Fri, 23 Oct 2015 18:00:40 +0800 Subject: [PATCH 034/110] Update strings.xml --- cSploit/src/main/res/values-zh-rCN/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cSploit/src/main/res/values-zh-rCN/strings.xml b/cSploit/src/main/res/values-zh-rCN/strings.xml index f530a16d5e..5fb8d86055 100644 --- a/cSploit/src/main/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扫描发现的新主机端口 规避 精确版本 单击会话打开终端,或长按以查看更多选项。 From 1815524845ced4bff8349855f8fb48acf9236293 Mon Sep 17 00:00:00 2001 From: ga Date: Sat, 24 Oct 2015 18:37:40 +0200 Subject: [PATCH 035/110] fixes #454 --- .../java/org/csploit/android/net/Network.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index 3d251d7550..7eb1af8562 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -24,6 +24,7 @@ import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.util.Patterns; import org.apache.commons.compress.utils.IOUtils; import org.apache.commons.net.util.SubnetUtils; @@ -150,18 +151,29 @@ private static Method getTetheredIfacesMethod(ConnectivityManager connectivityMa public boolean initNetworkInterface(String iface) { + InterfaceAddress ifaceAddress = null; try { if (iface == null) iface = getAvailableInterfaces().get(0); mInterface = NetworkInterface.getByName(iface); - InterfaceAddress ifaceAddress; if (mInterface.getInterfaceAddresses().isEmpty()) { return false; } - ifaceAddress = mInterface.getInterfaceAddresses().get(1); + 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 From fde645f7b698e34b87b6032e7fddba2d37e21ea0 Mon Sep 17 00:00:00 2001 From: fattire Date: Fri, 30 Oct 2015 01:34:14 -0700 Subject: [PATCH 036/110] Update gradle to 2.8 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 714c31b24f..5460a5392c 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ 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-2.8-all.zip From afded437a675e4643fd06d18c25c89aacaa93240 Mon Sep 17 00:00:00 2001 From: ga Date: Fri, 30 Oct 2015 22:49:16 +0100 Subject: [PATCH 037/110] Extract charset encoding from HTTP headers or html headers. workaround for #451 and #50. --- .../android/net/http/RequestParser.java | 44 +++++++++++++++++++ .../android/net/http/proxy/StreamThread.java | 26 ++++++++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index f189ac0a16..cc4f6bcb0d 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -27,6 +27,8 @@ 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 { @@ -478,4 +480,46 @@ 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) { + // match , , etc... + int headEnd = body.toLowerCase().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); + if (m.find()) + return m.toMatchResult().group(1).replaceAll("\"", ""); + } + + return null; + } } diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java index 54928d2b94..6370efdfda 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java @@ -18,16 +18,16 @@ */ 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; + public class StreamThread implements Runnable { private final static String[] FILTERED_CONTENT_TYPES = new String[] @@ -159,7 +159,21 @@ public void run(){ headers = patched; - mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes()); + // 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); + } + + if (charset != null) { + mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes(charset)); + } + 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(); From 38dc3c2e0575e61db87d438133f0c6f21652a79c Mon Sep 17 00:00:00 2001 From: ga Date: Sun, 1 Nov 2015 19:18:18 +0100 Subject: [PATCH 038/110] some websites put the charset encoding names between '' characters, so parse them as well. --- .../org/csploit/android/net/http/RequestParser.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index cc4f6bcb0d..3e9b2269bf 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -505,8 +505,7 @@ public static String getCharsetFromHeaders(String contentType){ */ public static String getCharsetFromBody(String body) { if (body != null) { - // match , , etc... - int headEnd = body.toLowerCase().indexOf(""); + int headEnd = body.toLowerCase().trim().indexOf(""); // return null if there's no head tags if (headEnd == -1) @@ -514,10 +513,13 @@ public static String getCharsetFromBody(String body) { String body_head = body.toLowerCase().substring(0, headEnd); - Pattern p = Pattern.compile("charset=([\"a-z0-9A-Z-]+)"); + Pattern p = Pattern.compile("charset=([\"\'a-z0-9A-Z-]+)"); Matcher m = p.matcher(body_head); - if (m.find()) - return m.toMatchResult().group(1).replaceAll("\"", ""); + String str_match = ""; + if (m.find()) { + str_match = m.toMatchResult().group(1); + return str_match.replaceAll("[\"']", ""); + } } return null; From 7f8ea0a40ebab350eaf370cf93f8ac396408deb4 Mon Sep 17 00:00:00 2001 From: ga Date: Sun, 1 Nov 2015 19:25:29 +0100 Subject: [PATCH 039/110] parse TopLevelDomains correctly. put out of the loop the check for adding dots to the domain. fixes #21. --- .../org/csploit/android/net/http/RequestParser.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index f189ac0a16..57f938db5e 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -300,15 +300,17 @@ public static String getBaseDomain(String hostname){ tld_parts = tld.split("\\."); int itld = tld_parts.length, ihost = host_parts.length, - i = 0, - stop = ihost - 1; + i = 0; + + if ((ihost - itld) == 0) + return hostname; domain = ""; - for(i = ihost - itld; i <= stop; i++){ - domain += host_parts[i] + (i == stop ? "" : "."); + for(i = ihost - itld - 1; i < ihost; i++){ + domain += host_parts[i] + "."; } - return domain; + return domain.substring(0, domain.length() - 1); } } From 6d9931600e15ae9d3fc633f1fc0578fe636b26c0 Mon Sep 17 00:00:00 2001 From: ga Date: Wed, 4 Nov 2015 14:07:43 +0100 Subject: [PATCH 040/110] if we get a not valid charset, send the request with the default charset encoding. --- .../org/csploit/android/net/http/proxy/StreamThread.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java index 6370efdfda..918b0a9963 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; public class StreamThread implements Runnable { @@ -168,7 +169,13 @@ public void run(){ } if (charset != null) { - mBuffer.setData((headers + HEAD_SEPARATOR + body).getBytes(charset)); + 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() From bc3cfa76b4553de0f711cdf1f40181ee583495b1 Mon Sep 17 00:00:00 2001 From: ga Date: Fri, 6 Nov 2015 00:35:31 +0100 Subject: [PATCH 041/110] parse TopLevelDomains better. reorder TLD domains, to put simple domains (.us) at the end of the compounded domains of the same type (.com.us) --- .../android/net/http/RequestParser.java | 212 +++++++++--------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index 57f938db5e..fb6359ba32 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -45,30 +45,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 +77,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 +155,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 +186,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 +199,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 +258,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 +273,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", @@ -302,11 +302,11 @@ public static String getBaseDomain(String hostname){ ihost = host_parts.length, i = 0; - if ((ihost - itld) == 0) + if ((ihost - itld) == 0 || ihost == 2) return hostname; domain = ""; - for(i = ihost - itld - 1; i < ihost; i++){ + for(i = ihost - itld; i < ihost; i++){ domain += host_parts[i] + "."; } From 62f4bd69bae2f470ccd8349ef00747614e6c43a0 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 7 Nov 2015 00:53:21 +0100 Subject: [PATCH 042/110] some extra statement to debug #480 --- .../java/org/csploit/android/net/Network.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index 7eb1af8562..a01b4b67c9 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -414,6 +414,21 @@ public String getSystemGateway(String iface) { IOUtils.closeQuietly(reader); } + Logger.warning("cannot get default gateway for interface " + iface); + Logger.debug("/proc/net/route dump:"); + + try { + reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/net/route"))); + + while((line = reader.readLine()) != null) { + Logger.debug(line); + } + } catch (IOException e) { + System.errorLogging(e); + } finally { + IOUtils.closeQuietly(reader); + } + return null; } } \ No newline at end of file From f36015c52a0d82136b76f6a1cb0286f7471280fa Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 7 Nov 2015 00:56:28 +0100 Subject: [PATCH 043/110] some extra statement to debug #480 --- cSploit/src/main/java/org/csploit/android/net/Network.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index a01b4b67c9..d936474765 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -406,7 +406,9 @@ public String getSystemGateway(String iface) { break; } } - return sb.toString(); + String res = sb.toString(); + Logger.debug("found system default gateway for interface " + iface + ": " + res); + return res; } } catch (IOException e) { System.errorLogging(e); From bfa88dc35221c5074339df17ffc3827460e13012 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 7 Nov 2015 00:57:59 +0100 Subject: [PATCH 044/110] some extra statement to debug #480 --- cSploit/src/main/java/org/csploit/android/net/Network.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index d936474765..3ea13ee33a 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -189,8 +189,11 @@ public boolean initNetworkInterface(String iface) { if(gateway == null) { mGateway = null; + Logger.debug("gateway not found"); } else { mGateway = new IP4Address(gateway); + Logger.debug("gateway: " + gateway); + Logger.debug("mGateway: " + mGateway); } return true; From 60a26ff66d17d5bf8876e8cc3388a14c572ffbaa Mon Sep 17 00:00:00 2001 From: fattire Date: Mon, 9 Nov 2015 00:29:32 -0800 Subject: [PATCH 045/110] update gradle & build tools --- build.gradle | 2 +- cSploit/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index c0bd27756b..640c7eca36 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.4.0-beta6' + classpath 'com.android.tools.build:gradle:1.5.0-beta2' } } diff --git a/cSploit/build.gradle b/cSploit/build.gradle index 1181c22f61..d2ab0df38a 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -38,7 +38,7 @@ dependencies { android { compileSdkVersion 23 - buildToolsVersion '23.0.1' + buildToolsVersion '23.0.2' compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 From e39e86f9dff2137006a518146e93243536971ee1 Mon Sep 17 00:00:00 2001 From: ga Date: Tue, 10 Nov 2015 16:09:09 +0100 Subject: [PATCH 046/110] TLD array updated with latest domains from www.publicsuffix.org added a simple cache for already resolved TLDs. --- .../android/net/http/RequestParser.java | 14 ++++++-- .../android/net/http/proxy/DNSCache.java | 33 +++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index f710c1038b..86f04837d9 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -22,6 +22,7 @@ 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; @@ -296,6 +297,11 @@ public static String getBaseDomain(String hostname){ if(Patterns.IP_ADDRESS.matcher(hostname).matches()) return hostname; + String cached_domain = DNSCache.getInstance().getCachedRootDomain(hostname); + if (cached_domain != null) { + return cached_domain; + } + for(String tld : TLD){ if(hostname.endsWith(tld)){ String[] host_parts = hostname.split("\\."), @@ -312,6 +318,7 @@ public static String getBaseDomain(String hostname){ domain += host_parts[i] + "."; } + DNSCache.getInstance().addCachedRootDomain(domain.substring(0, domain.length() - 1)); return domain.substring(0, domain.length() - 1); } } @@ -320,14 +327,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().addCachedRootDomain(hostname.substring(startIndex)); return hostname.substring(startIndex); - + } else return hostname; } diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java index b8f474e264..1f3419f2ba 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java @@ -18,20 +18,22 @@ */ 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 HashMap mCache = null; + private ArrayList mCachedRootDomain = null; public static DNSCache getInstance(){ if(mInstance == null) @@ -42,6 +44,33 @@ public static DNSCache getInstance(){ public DNSCache(){ mCache = new HashMap(); + mCachedRootDomain = 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 getCachedRootDomain (String hostname){ + for (String rootDomain : mCachedRootDomain){ + 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 addCachedRootDomain (String rootdomain){ + mCachedRootDomain.add(rootdomain); } private InetAddress getAddress(String server) throws IOException{ From 999ae0a14650b2314dcebdd447a605e6afa6c8bd Mon Sep 17 00:00:00 2001 From: ga Date: Tue, 10 Nov 2015 16:18:36 +0100 Subject: [PATCH 047/110] Closes #489 --- .../org/csploit/android/MainFragment.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/MainFragment.java b/cSploit/src/main/java/org/csploit/android/MainFragment.java index 730c43c407..6d1eb1e7d2 100644 --- a/cSploit/src/main/java/org/csploit/android/MainFragment.java +++ b/cSploit/src/main/java/org/csploit/android/MainFragment.java @@ -1307,22 +1307,29 @@ public void unregister() { } private void check() { - 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(); - } - 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; } } From c01b5d1fa184e18428f1fcd9a3c2b23848b3aa8b Mon Sep 17 00:00:00 2001 From: ga Date: Tue, 10 Nov 2015 16:57:48 +0100 Subject: [PATCH 048/110] Improved mitm modules performance. Default buffer size for read remote responses increased to 65536 bytes. Closes #487 --- .../java/org/csploit/android/net/http/proxy/StreamThread.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java index 918b0a9963..0632d030f5 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java @@ -41,7 +41,7 @@ public class StreamThread implements Runnable }; 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; From be59eb7bd571ff643d4b609394a4141e9c31269b Mon Sep 17 00:00:00 2001 From: ga Date: Wed, 11 Nov 2015 17:45:46 +0100 Subject: [PATCH 049/110] put the items: network, gateway and our own device, on top of the hosts list. --- cSploit/src/main/java/org/csploit/android/core/System.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index ef3ffc7019..a597bb50e4 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -1106,7 +1106,9 @@ public static boolean addOrderedTarget(Target target) { boolean inserted = false; - for (int i = 0; i < mTargets.size(); i++) { + int start_idx = 3; + if(!mNetwork.haveGateway()) start_idx = 2; + for (int i = start_idx; i < mTargets.size(); i++) { if (mTargets.get(i).comesAfter(target)) { mTargets.add(i, target); inserted = true; From 153c13ab2b422307fa41ed627ef5dc8363feab2e Mon Sep 17 00:00:00 2001 From: tux_mind Date: Thu, 19 Nov 2015 14:02:02 +0100 Subject: [PATCH 050/110] improved singleton pattern --- .../org/csploit/android/net/http/proxy/DNSCache.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java index 1f3419f2ba..f46dd77abc 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java @@ -30,21 +30,18 @@ public class DNSCache { - private static DNSCache mInstance = null; + private static DNSCache mInstance = new DNSCache(); private HashMap mCache = null; private ArrayList mCachedRootDomain = null; public static DNSCache getInstance(){ - if(mInstance == null) - mInstance = new DNSCache(); - return mInstance; } - public DNSCache(){ - mCache = new HashMap(); - mCachedRootDomain = new ArrayList(); + private DNSCache() { + mCache = new HashMap<>(); + mCachedRootDomain = new ArrayList<>(); } /** From 28cb68376e4f8cbc71d5f4614c9fc62c992fb2da Mon Sep 17 00:00:00 2001 From: tux_mind Date: Thu, 19 Nov 2015 14:07:17 +0100 Subject: [PATCH 051/110] make cache thread safe. changed names a while. --- .../android/net/http/RequestParser.java | 6 ++--- .../android/net/http/proxy/DNSCache.java | 22 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index 86f04837d9..3950015e7b 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -297,7 +297,7 @@ public static String getBaseDomain(String hostname){ if(Patterns.IP_ADDRESS.matcher(hostname).matches()) return hostname; - String cached_domain = DNSCache.getInstance().getCachedRootDomain(hostname); + String cached_domain = DNSCache.getInstance().getRootDomain(hostname); if (cached_domain != null) { return cached_domain; } @@ -318,7 +318,7 @@ public static String getBaseDomain(String hostname){ domain += host_parts[i] + "."; } - DNSCache.getInstance().addCachedRootDomain(domain.substring(0, domain.length() - 1)); + DNSCache.getInstance().addRootDomain(domain.substring(0, domain.length() - 1)); return domain.substring(0, domain.length() - 1); } } @@ -333,7 +333,7 @@ public static String getBaseDomain(String hostname){ } if(startIndex > 0) { - DNSCache.getInstance().addCachedRootDomain(hostname.substring(startIndex)); + DNSCache.getInstance().addRootDomain(hostname.substring(startIndex)); return hostname.substring(startIndex); } else diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java index f46dd77abc..3303ae0f5d 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/DNSCache.java @@ -32,8 +32,8 @@ public class DNSCache { private static DNSCache mInstance = new DNSCache(); - private HashMap mCache = null; - private ArrayList mCachedRootDomain = null; + private final HashMap mCache; + private final ArrayList mRootDomainCache; public static DNSCache getInstance(){ return mInstance; @@ -41,7 +41,7 @@ public static DNSCache getInstance(){ private DNSCache() { mCache = new HashMap<>(); - mCachedRootDomain = new ArrayList<>(); + mRootDomainCache = new ArrayList<>(); } /** @@ -50,10 +50,12 @@ private DNSCache() { * @param hostname hostname to check * @return String the root domain or null */ - public String getCachedRootDomain (String hostname){ - for (String rootDomain : mCachedRootDomain){ - if (hostname.endsWith(rootDomain)){ - return rootDomain; + public String getRootDomain(String hostname){ + synchronized (mRootDomainCache) { + for (String rootDomain : mRootDomainCache) { + if (hostname.endsWith(rootDomain)) { + return rootDomain; + } } } @@ -66,8 +68,10 @@ public String getCachedRootDomain (String hostname){ * * @param rootdomain Root domain to add to the list */ - public void addCachedRootDomain (String rootdomain){ - mCachedRootDomain.add(rootdomain); + public void addRootDomain(String rootdomain){ + synchronized (mRootDomainCache) { + mRootDomainCache.add(rootdomain); + } } private InetAddress getAddress(String server) throws IOException{ From d5db9fd6a0e95d9fdb0ae5abb2eeaf3e0f1add4b Mon Sep 17 00:00:00 2001 From: tux_mind Date: Thu, 19 Nov 2015 15:32:39 +0100 Subject: [PATCH 052/110] little speed up --- .../csploit/android/net/http/RequestParser.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java index 3950015e7b..47775edd7f 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/RequestParser.java @@ -291,8 +291,6 @@ 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; @@ -313,13 +311,19 @@ public static String getBaseDomain(String hostname){ if ((ihost - itld) == 0 || ihost == 2) return hostname; - domain = ""; + StringBuilder sb = new StringBuilder(); + for(i = ihost - itld; i < ihost; i++){ - domain += host_parts[i] + "."; + sb.append(host_parts[i]); + if(i < ihost - 1) { + sb.append("."); + } } - DNSCache.getInstance().addRootDomain(domain.substring(0, domain.length() - 1)); - return domain.substring(0, domain.length() - 1); + String domain = sb.toString(); + + DNSCache.getInstance().addRootDomain(domain); + return domain; } } From 461232895541f1f13b0a1fd817fda75aaa37d1ff Mon Sep 17 00:00:00 2001 From: tux_mind Date: Thu, 19 Nov 2015 17:52:27 +0100 Subject: [PATCH 053/110] use Comparable interface to sort our targets. also use a TreeSet to store them. --- .../java/org/csploit/android/core/System.java | 48 +++++-------------- .../android/helpers/NetworkHelper.java | 33 +++++++++++++ .../org/csploit/android/net/Endpoint.java | 22 ++++++--- .../org/csploit/android/net/IP4Address.java | 9 +++- .../java/org/csploit/android/net/Network.java | 11 ++++- .../java/org/csploit/android/net/Target.java | 34 +++++++++++-- .../android/helpers/NetworkHelperTest.java | 26 ++++++++++ 7 files changed, 133 insertions(+), 50 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index a597bb50e4..65e611323a 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -87,6 +87,8 @@ 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; @@ -110,7 +112,7 @@ public class System { private static WifiLock mWifiLock = null; private static 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; @@ -843,12 +845,7 @@ public static void loadSession(String filename) throws Exception { synchronized (mTargets) { for (int i = 0; i < targets; i++) { Target target = new Target(reader); - int index = mTargets.indexOf(target); - if (index == -1) { - System.addOrderedTarget(target); - } else { - mTargets.set(index, target); - } + mTargets.add(target); } } @@ -1099,30 +1096,16 @@ public static boolean addOrderedTarget(Target target) { if (target == null) return false; - synchronized (mTargets) { - if (mTargets.contains(target)) { - return false; - } - - boolean inserted = false; + boolean changed; - int start_idx = 3; - if(!mNetwork.haveGateway()) start_idx = 2; - for (int i = start_idx; i < mTargets.size(); i++) { - if (mTargets.get(i).comesAfter(target)) { - mTargets.add(i, target); - inserted = true; - break; - } + synchronized (mTargets) { + changed = mTargets.add(target); + if(changed) { + Services.getNetworkRadar().onNewTargetFound(target); + notifyTargetListChanged(); } - - if(!inserted) - mTargets.add(target); - - Services.getNetworkRadar().onNewTargetFound(target); - notifyTargetListChanged(); - return true; } + return changed; } public static boolean hasTarget(Target target) { @@ -1149,15 +1132,8 @@ public static Target getTargetByAddress(String address) { } public static Target getTargetByAddress(InetAddress address) { - int i, size; - synchronized (mTargets) { - - size = mTargets.size(); - - for (i = 0; i < size; i++) { - Target t = mTargets.get(i); - + for(Target t : mTargets) { if (t != null && t.getAddress() != null && t.getAddress().equals(address)) { return t; } diff --git a/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java index 11c8ab981f..71ef9d5735 100644 --- a/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java +++ b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java @@ -1,5 +1,7 @@ package org.csploit.android.helpers; +import java.net.InetAddress; + /** * A class that provide some useful network-related static methods */ @@ -21,4 +23,35 @@ public static int getOUICode(byte[] macAddress) { 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()); + } } diff --git a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java index 27be5e0304..1e26e30334 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -18,14 +18,17 @@ */ package org.csploit.android.net; +import android.support.annotation.NonNull; + import java.io.BufferedReader; import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; import org.csploit.android.core.System; +import org.csploit.android.helpers.NetworkHelper; -public class Endpoint +public class Endpoint implements Comparable { private InetAddress mAddress = null; private byte[] mHardware = null; @@ -99,14 +102,19 @@ 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){ diff --git a/cSploit/src/main/java/org/csploit/android/net/IP4Address.java b/cSploit/src/main/java/org/csploit/android/net/IP4Address.java index 8186028895..71f2f4dfb9 100644 --- a/cSploit/src/main/java/org/csploit/android/net/IP4Address.java +++ b/cSploit/src/main/java/org/csploit/android/net/IP4Address.java @@ -23,11 +23,11 @@ import java.net.UnknownHostException; import java.nio.ByteOrder; -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){ @@ -125,6 +125,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 index 7eb1af8562..9da73bd38d 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -24,6 +24,7 @@ import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.support.annotation.NonNull; import android.util.Patterns; import org.apache.commons.compress.utils.IOUtils; @@ -49,7 +50,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Network { +public class Network implements Comparable { public enum Protocol { TCP, UDP, @@ -339,6 +340,14 @@ 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() && diff --git a/cSploit/src/main/java/org/csploit/android/net/Target.java b/cSploit/src/main/java/org/csploit/android/net/Target.java index 6b20888b38..63f17df623 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Target.java +++ b/cSploit/src/main/java/org/csploit/android/net/Target.java @@ -19,6 +19,7 @@ package org.csploit.android.net; import android.os.StrictMode; +import android.support.annotation.NonNull; import org.csploit.android.R; import org.csploit.android.core.Logger; @@ -39,7 +40,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Target +public class Target implements Comparable { public enum Type{ @@ -440,8 +441,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 +510,6 @@ else if(mType == Type.REMOTE) return mHostname.equals(target.getHostname()); } - return false; } diff --git a/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java b/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java index a75c8f4957..dc67cbfc29 100644 --- a/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java +++ b/cSploit/src/test/java/org/csploit/android/helpers/NetworkHelperTest.java @@ -3,6 +3,11 @@ 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 */ @@ -16,4 +21,25 @@ public void testGetOUICode() throws Exception { 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)); + } } From 090f5d086171fadec2e2be8b18dd9f8463b9cbe4 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Thu, 19 Nov 2015 20:04:31 +0100 Subject: [PATCH 054/110] watch for gateway changes --- .../java/org/csploit/android/core/System.java | 3 +++ .../java/org/csploit/android/net/Network.java | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index ef3ffc7019..711f002052 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -381,6 +381,8 @@ private static void uncaughtReloadNetworkMapping() throws UnknownHostException, reset(); mInitialized = true; + + Network.watchForIssue480(); } public static boolean checkNetworking(final Activity current) { @@ -1291,6 +1293,7 @@ public static void clean(boolean releaseLocks) { Client.Disconnect(); mCoreInitialized = false; + mInitialized = false; Services.getNetworkRadar().onAutoScanChanged(); } catch (Exception e) { errorLogging(e); diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index 3ea13ee33a..a668ecede7 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -385,7 +385,7 @@ public NetworkInterface getInterface() { return mInterface; } - public String getSystemGateway(String iface) { + public static String getSystemGateway(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; @@ -436,4 +436,20 @@ public String getSystemGateway(String iface) { return null; } + + public static void watchForIssue480() { + new Thread(new GatewayWatcher()).start(); + } + + private static class GatewayWatcher implements Runnable { + @Override + public void run() { + while(System.isInitialized()) { + String gw = getSystemGateway(System.getNetwork().getInterface().getDisplayName()); + if(gw != null) { + return; + } + } + } + } } \ No newline at end of file From 4d5759c60ea59807546bcc601ec0f807101192bf Mon Sep 17 00:00:00 2001 From: tux_mind Date: Thu, 19 Nov 2015 20:05:44 +0100 Subject: [PATCH 055/110] with a delay... --- cSploit/src/main/java/org/csploit/android/net/Network.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index a668ecede7..55de78e719 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -449,6 +449,11 @@ public void run() { if(gw != null) { return; } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + return; + } } } } From ff6b32a91a45c85ab21ce9330333cc93f8de07b6 Mon Sep 17 00:00:00 2001 From: fattire Date: Thu, 19 Nov 2015 16:10:54 -0800 Subject: [PATCH 056/110] update libraries, gradle, gradle plugin --- build.gradle | 2 +- cSploit/build.gradle | 10 +++++----- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 640c7eca36..dea94eb99c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0-beta2' + classpath 'com.android.tools.build:gradle:1.5.0' } } diff --git a/cSploit/build.gradle b/cSploit/build.gradle index d2ab0df38a..0002b242e6 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -4,7 +4,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.4.0-beta6' + classpath 'com.android.tools.build:gradle:1.5.0' } } @@ -21,10 +21,10 @@ allprojects { apply plugin: 'com.android.application' dependencies { - compile 'com.android.support:support-v4:23.1.0' - compile 'com.android.support:appcompat-v7:23.1.0' - compile 'com.android.support:design:23.1.0' - compile 'com.android.support:preference-v7:23.1.0' + compile 'com.android.support:support-v4:23.1.1' + compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.android.support:design:23.1.1' + compile 'com.android.support:preference-v7:23.1.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' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5460a5392c..4b8a3c2dae 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 +#Thu Nov 19 16:09:54 PST 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip From f4e891ee01f22d64ec1b3687118b0d8fd2cf5879 Mon Sep 17 00:00:00 2001 From: tux_mind Date: Tue, 24 Nov 2015 18:29:51 +0100 Subject: [PATCH 057/110] should fix issue 480 credits goes to fat-tire for finding both the bug and the solution :) --- .../java/org/csploit/android/core/System.java | 3 +- .../android/helpers/NetworkHelper.java | 72 +++++++++++ .../java/org/csploit/android/net/Network.java | 121 +++++------------- .../java/org/csploit/android/tools/Ip.java | 27 ++++ .../org/csploit/android/tools/ToolBox.java | 3 + 5 files changed, 134 insertions(+), 92 deletions(-) create mode 100644 cSploit/src/main/java/org/csploit/android/tools/Ip.java diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index 711f002052..2359f4a054 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -352,6 +352,7 @@ public static void initCore() throws DaemonException, SuException { mCoreInitialized = true; Services.getNetworkRadar().onAutoScanChanged(); + getNetwork().onCoreAttached(); } public static void setIfname(String ifname) { @@ -381,8 +382,6 @@ private static void uncaughtReloadNetworkMapping() throws UnknownHostException, reset(); mInitialized = true; - - Network.watchForIssue480(); } public static boolean checkNetworking(final Activity current) { diff --git a/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java index 11c8ab981f..1fe5b50fc8 100644 --- a/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java +++ b/cSploit/src/main/java/org/csploit/android/helpers/NetworkHelper.java @@ -1,5 +1,17 @@ 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; + /** * A class that provide some useful network-related static methods */ @@ -21,4 +33,64 @@ public static int getOUICode(byte[] macAddress) { public static int getOUICode(String hexOui) { return Integer.parseInt(hexOui, 16); } + + 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/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index 55de78e719..c8c57e870b 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -26,15 +26,11 @@ import android.net.wifi.WifiManager; import android.util.Patterns; -import org.apache.commons.compress.utils.IOUtils; 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.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.InterfaceAddress; @@ -46,8 +42,6 @@ import java.util.Collections; import java.util.Enumeration; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class Network { public enum Protocol { @@ -185,16 +179,7 @@ public boolean initNetworkInterface(String iface) { mNetmask = new IP4Address(su.getInfo().getNetmask()); mBase = new IP4Address(su.getInfo().getNetworkAddress()); - String gateway = getSystemGateway(mInterface.getDisplayName()); - - if(gateway == null) { - mGateway = null; - Logger.debug("gateway not found"); - } else { - mGateway = new IP4Address(gateway); - Logger.debug("gateway: " + gateway); - Logger.debug("mGateway: " + mGateway); - } + updateGateway(); return true; } catch (Exception e) { @@ -204,6 +189,35 @@ public boolean initNetworkInterface(String iface) { 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); @@ -384,77 +398,4 @@ public static List getAvailableInterfaces() { public NetworkInterface getInterface() { return mInterface; } - - public static String getSystemGateway(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("cannot get default gateway for interface " + iface); - Logger.debug("/proc/net/route dump:"); - - try { - reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/net/route"))); - - while((line = reader.readLine()) != null) { - Logger.debug(line); - } - } catch (IOException e) { - System.errorLogging(e); - } finally { - IOUtils.closeQuietly(reader); - } - - return null; - } - - public static void watchForIssue480() { - new Thread(new GatewayWatcher()).start(); - } - - private static class GatewayWatcher implements Runnable { - @Override - public void run() { - while(System.isInitialized()) { - String gw = getSystemGateway(System.getNetwork().getInterface().getDisplayName()); - if(gw != null) { - return; - } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - return; - } - } - } - } } \ No newline at end of file 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/main/java/org/csploit/android/tools/ToolBox.java b/cSploit/src/main/java/org/csploit/android/tools/ToolBox.java index 0eee68a92b..6548c77660 100644 --- a/cSploit/src/main/java/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(); From 784c471ec2aeb377904b7bb687744b8c6ab79d48 Mon Sep 17 00:00:00 2001 From: "Nicola Spanti (RyDroid)" Date: Sat, 28 Nov 2015 18:03:13 +0100 Subject: [PATCH 058/110] Minor changes of README --- LICENSE | 8 ++++---- README.md | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) 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 9313cc6638..1b11bc0197 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # 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 +17,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 +31,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,26 +41,26 @@ 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). ## 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 From 0aa6caf2804dd59e64d126f6b590d3f6f3865e37 Mon Sep 17 00:00:00 2001 From: xaitax Date: Tue, 15 Dec 2015 13:44:53 +0400 Subject: [PATCH 059/110] Update nightly-build.sh Avoid deleting files if last commit date is older than e.g. 30 days. --- nightly-build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From d8253f6c9ac2572554a0e54205d243671143f67f Mon Sep 17 00:00:00 2001 From: Rubenoo Date: Fri, 25 Dec 2015 21:05:34 +0100 Subject: [PATCH 060/110] Updated dutch translations see titel, made with love --- cSploit/src/main/res/values-nl/strings.xml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/cSploit/src/main/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml index 14c3b62c0f..60ab3bba1e 100644 --- a/cSploit/src/main/res/values-nl/strings.xml +++ b/cSploit/src/main/res/values-nl/strings.xml @@ -35,7 +35,7 @@ met sleutel ]]> !]]> Verbinden… - Verbinding VERBROKEN! + Verbinding verbroken! ]]> GEFAALD.]]> Kan de inhoud van de map niet lezen. @@ -120,7 +120,7 @@ Laad van 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! @@ -194,7 +194,7 @@ Meerdere aanvallen Netwerk Discovery heeft GEFAALD 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? @@ -228,7 +228,7 @@ Deze applicatie kan alleen werken op apparaaten die ROOT hebben. Open shell Open URL - OS: + OS Paket Maker Maak en verstuur een aangepaste TCP of UDP packet naar het doelwit. Patching shebang @@ -249,7 +249,7 @@ 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. + bestaat niet. Ongeldig nummer. Het port moet tussen 1024 en 65535 zijn. Voorbeeld tijd moet zijn tussen 0.4 en 1.0. @@ -437,4 +437,11 @@ Automatische poort-scan Scan altijd een doelwit met SYNC scanner als een doelwit gevonden word Aangepaste parameters + elke interface + verbinding verloren + Fout tijdens initialiseren %s + verwijder deze sessie en begin een nieuwe? + Kies een netwerk interface + Er zijn geen netwerk interface\'s beschikbaar + Net interfaces From b9d88e976fa4706a5c03092a9a75f6944ecd49cd Mon Sep 17 00:00:00 2001 From: danielyc Date: Thu, 7 Jan 2016 14:20:42 +0100 Subject: [PATCH 061/110] Update Dutch translations Translation update and full list check --- cSploit/src/main/res/values-nl/strings.xml | 198 ++++++++++----------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/cSploit/src/main/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml index 60ab3bba1e..03ce539289 100644 --- a/cSploit/src/main/res/values-nl/strings.xml +++ b/cSploit/src/main/res/values-nl/strings.xml @@ -12,19 +12,19 @@ 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 log Klik hier om te upgraden Dit zal cSploit afsluiten, weet je het zeker? Opdracht @@ -38,22 +38,22 @@ 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,26 +97,26 @@ 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 + Hijack sessie Laad van bestand Afbeelding Initialisatie Fout @@ -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 bestand + Lokale afbeeldingen Login Kraker Een erg snele netwerk login kraker die verschillende services ondersteund. Wachtwoordenlijst @@ -146,53 +146,53 @@ 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 + DNS spoofing Herleid alle domeinen naar een website/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 gestopt. Dit is jou netwerk subnet mask. @@ -204,7 +204,7 @@ 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# + 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 + 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. + 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,13 +434,13 @@ 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 + Elke interface + Verbinding verloren Fout tijdens initialiseren %s - verwijder deze sessie en begin een nieuwe? + Verwijder deze sessie en begin een nieuwe? Kies een netwerk interface Er zijn geen netwerk interface\'s beschikbaar Net interfaces From 62d0c30772c090764f1937ccc4cddf83282258fe Mon Sep 17 00:00:00 2001 From: Aidan Bennett Date: Sat, 13 Feb 2016 15:50:03 -0500 Subject: [PATCH 062/110] Minor grammar fixes --- cSploit/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cSploit/src/main/res/values/strings.xml b/cSploit/src/main/res/values/strings.xml index 88f723d086..643793f6bd 100644 --- a/cSploit/src/main/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 @@ -323,7 +323,7 @@ Scanning finished. DNS spoofing - Redirect domains to a different web/IP + Redirect domains to a different web/IP. Saved From 9b6c99e4927ee33b8cb7a80e03f8cbde4831f579 Mon Sep 17 00:00:00 2001 From: Rubenoo Date: Sun, 6 Mar 2016 22:06:52 +0100 Subject: [PATCH 063/110] Small updates of the Dutch translations as always made with love <3 --- cSploit/src/main/res/values-nl/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cSploit/src/main/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml index 03ce539289..97287b4e03 100644 --- a/cSploit/src/main/res/values-nl/strings.xml +++ b/cSploit/src/main/res/values-nl/strings.xml @@ -8,7 +8,7 @@ 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 @@ -24,7 +24,7 @@ Kies een methode: Kies een bron: Verschoon - Verschoon de activitieiten log + Verschoon de activitieiten logboek Klik hier om te upgraden Dit zal cSploit afsluiten, weet je het zeker? Opdracht @@ -117,7 +117,7 @@ Heart aanval Heart aanval is opgedoken, de applicatie zou nu gaan kijken voor updates.#STATUS# Hijack sessie - Laad van bestand + Laad vanuit bestand Afbeelding Initialisatie Fout Initialiseren… @@ -136,7 +136,7 @@ links Licentie Veranderingen aan het laden… - Lokale bestand + Lokale bestanden Lokale afbeeldingen Login Kraker Een erg snele netwerk login kraker die verschillende services ondersteund. @@ -168,7 +168,7 @@ 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 + Herleid alle domeinen naar een website of IP. Opgeslagen Vervang afbeeldingen Vervang alle afbeeldingen op een website met één specifieke afbeelding. @@ -198,13 +198,13 @@ 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! @@ -224,7 +224,7 @@ Geen updates beschikbaar. 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 + Niets gevonden]]> Deze applicatie kan alleen werken op apparaaten die ROOT hebben. Open shell Open URL @@ -440,7 +440,7 @@ Elke interface Verbinding verloren Fout tijdens initialiseren %s - Verwijder deze sessie en begin een nieuwe? + Verwijder huidige sessie en begin een nieuwe? Kies een netwerk interface Er zijn geen netwerk interface\'s beschikbaar Net interfaces From 24459a0e8596025607cc8b6afb10f042c41056d5 Mon Sep 17 00:00:00 2001 From: Kir Vaznitcky Date: Mon, 7 Mar 2016 01:25:56 +0200 Subject: [PATCH 064/110] Update strings.xml minor fix russian translation --- cSploit/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cSploit/src/main/res/values-ru/strings.xml b/cSploit/src/main/res/values-ru/strings.xml index 763c075c24..b39b0271bc 100644 --- a/cSploit/src/main/res/values-ru/strings.xml +++ b/cSploit/src/main/res/values-ru/strings.xml @@ -203,9 +203,9 @@ Нажмите еще раз для остановки. Неизвестная ошибка при чтении файла: Порт - , который необходим для работы прозрачного прокси взят из другого процесса, откройте настройки приложения для исправления ошибки. - , который необходим для работы mitm сервера взят из другого процесса, откройте настройки приложения для исправления ошибки. - , который необходим для работы https редиректа взят из другого процесса, откройте настройки приложения для исправления ошибки. + , который необходим для работы прозрачного прокси занят другим процессом, откройте настройки приложения для исправления ошибки. + , который необходим для работы mitm сервера занят другим процессом, откройте настройки приложения для исправления ошибки. + , который необходим для работы https редиректа занят другим процессом, откройте настройки приложения для исправления ошибки. MITM модули требуют доступности всех портов. From 93c1a2ec65aab547fe382ce114e72ac66ac71354 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 27 Mar 2016 23:45:31 +0200 Subject: [PATCH 065/110] [Translations] fix extra closing tag introduced by b9d88e976fa4706a5c03092a9a75f6944ecd49cd --- cSploit/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/main/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml index 03ce539289..aca093a86b 100644 --- a/cSploit/src/main/res/values-nl/strings.xml +++ b/cSploit/src/main/res/values-nl/strings.xml @@ -204,7 +204,7 @@ 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! From f145ca75aca29051264f5b1623fc5f312cf1f9a0 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 27 Mar 2016 23:49:47 +0200 Subject: [PATCH 066/110] [ExploitFinder] fix #612 --- .../java/org/csploit/android/net/datasource/Rapid7.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java b/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java index fe5b1202a4..1c043828cb 100644 --- a/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java +++ b/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java @@ -308,9 +308,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 From 23746e64ff54c08c7bb1ccb8143eb49eb5b0ecfe Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sun, 27 Mar 2016 23:59:17 +0200 Subject: [PATCH 067/110] [ExploitFinder] parsed paged may return null --- .../main/java/org/csploit/android/net/datasource/Rapid7.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java b/cSploit/src/main/java/org/csploit/android/net/datasource/Rapid7.java index 1c043828cb..4562e3b6c5 100644 --- a/cSploit/src/main/java/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); From 7f0821ae509e5535eeb525cd492e1546724c591d Mon Sep 17 00:00:00 2001 From: Silur Date: Sat, 2 Apr 2016 01:50:27 +0200 Subject: [PATCH 068/110] pcap storage permission fix --- .../csploit/android/plugins/mitm/Sniffer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java index f5280f93a5..f877613c10 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java @@ -50,8 +50,7 @@ import org.csploit.android.plugins.mitm.SpoofSession.OnSessionReadyListener; import org.csploit.android.tools.TcpDump; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; @@ -337,7 +336,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 @@ -410,6 +409,20 @@ private void setStoppedState(){ if (mFileActivity != null) { mFileActivity.stopWatching(); mFileActivity = null; + //copy pcap file from cache to storage + try { + InputStream in = new FileInputStream(mPcapFileName); + OutputStream out = new FileOutputStream(new File(System.getStoragePath(),new File(mPcapFileName).getName())); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + in.close(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } } } From 168e3fe2c1b8f999e4bf06fa70abbf183a096380 Mon Sep 17 00:00:00 2001 From: Rubenoo Date: Sun, 6 Mar 2016 22:06:52 +0100 Subject: [PATCH 069/110] Small updates of the Dutch translations as always made with love <3 --- cSploit/src/main/res/values-nl/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cSploit/src/main/res/values-nl/strings.xml b/cSploit/src/main/res/values-nl/strings.xml index aca093a86b..97287b4e03 100644 --- a/cSploit/src/main/res/values-nl/strings.xml +++ b/cSploit/src/main/res/values-nl/strings.xml @@ -8,7 +8,7 @@ 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 @@ -24,7 +24,7 @@ Kies een methode: Kies een bron: Verschoon - Verschoon de activitieiten log + Verschoon de activitieiten logboek Klik hier om te upgraden Dit zal cSploit afsluiten, weet je het zeker? Opdracht @@ -117,7 +117,7 @@ Heart aanval Heart aanval is opgedoken, de applicatie zou nu gaan kijken voor updates.#STATUS# Hijack sessie - Laad van bestand + Laad vanuit bestand Afbeelding Initialisatie Fout Initialiseren… @@ -136,7 +136,7 @@ links Licentie Veranderingen aan het laden… - Lokale bestand + Lokale bestanden Lokale afbeeldingen Login Kraker Een erg snele netwerk login kraker die verschillende services ondersteund. @@ -168,7 +168,7 @@ 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 + Herleid alle domeinen naar een website of IP. Opgeslagen Vervang afbeeldingen Vervang alle afbeeldingen op een website met één specifieke afbeelding. @@ -198,7 +198,7 @@ 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? @@ -224,7 +224,7 @@ Geen updates beschikbaar. 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 + Niets gevonden]]> Deze applicatie kan alleen werken op apparaaten die ROOT hebben. Open shell Open URL @@ -440,7 +440,7 @@ Elke interface Verbinding verloren Fout tijdens initialiseren %s - Verwijder deze sessie en begin een nieuwe? + Verwijder huidige sessie en begin een nieuwe? Kies een netwerk interface Er zijn geen netwerk interface\'s beschikbaar Net interfaces From 72aa45efa4823d4fd51f1435fe4d210616523c0e Mon Sep 17 00:00:00 2001 From: Kir Vaznitcky Date: Mon, 7 Mar 2016 01:25:56 +0200 Subject: [PATCH 070/110] Update strings.xml minor fix russian translation --- cSploit/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cSploit/src/main/res/values-ru/strings.xml b/cSploit/src/main/res/values-ru/strings.xml index 763c075c24..b39b0271bc 100644 --- a/cSploit/src/main/res/values-ru/strings.xml +++ b/cSploit/src/main/res/values-ru/strings.xml @@ -203,9 +203,9 @@ Нажмите еще раз для остановки. Неизвестная ошибка при чтении файла: Порт - , который необходим для работы прозрачного прокси взят из другого процесса, откройте настройки приложения для исправления ошибки. - , который необходим для работы mitm сервера взят из другого процесса, откройте настройки приложения для исправления ошибки. - , который необходим для работы https редиректа взят из другого процесса, откройте настройки приложения для исправления ошибки. + , который необходим для работы прозрачного прокси занят другим процессом, откройте настройки приложения для исправления ошибки. + , который необходим для работы mitm сервера занят другим процессом, откройте настройки приложения для исправления ошибки. + , который необходим для работы https редиректа занят другим процессом, откройте настройки приложения для исправления ошибки. MITM модули требуют доступности всех портов. From a4e1b9c5f45d3aeb297374c836c12b81c242b802 Mon Sep 17 00:00:00 2001 From: Silur Date: Sat, 2 Apr 2016 02:44:15 +0200 Subject: [PATCH 071/110] pcap storage permission fix --- .../csploit/android/plugins/mitm/Sniffer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java index f5280f93a5..e7f974dd7c 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java @@ -50,8 +50,7 @@ import org.csploit.android.plugins.mitm.SpoofSession.OnSessionReadyListener; import org.csploit.android.tools.TcpDump; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.InetAddress; import java.util.ArrayList; import java.util.Collections; @@ -337,7 +336,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 @@ -410,6 +409,20 @@ private void setStoppedState(){ if (mFileActivity != null) { mFileActivity.stopWatching(); mFileActivity = null; + //copy pcap file from cache to storage + try { + InputStream in = new FileInputStream(mPcapFileName); + OutputStream out = new FileOutputStream(new File(System.getStoragePath(),new File(mPcapFileName).getName())); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + in.close(); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } } } From bc2f0e92085d032be675e9e4dbddeb75ff5bc8ce Mon Sep 17 00:00:00 2001 From: tux-mind Date: Wed, 6 Apr 2016 10:57:21 +0200 Subject: [PATCH 072/110] [Sniffer] use IOUtils for deal with cached files. use IOUtils from apache commons to move pcap file from cache to storage. I've also exported those small piece of code into a separate function. --- .../csploit/android/plugins/mitm/Sniffer.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java index 4118333aa6..5cdcee6142 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java @@ -39,10 +39,12 @@ 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; import org.csploit.android.core.ChildManager; +import org.csploit.android.core.Logger; import org.csploit.android.core.System; import org.csploit.android.gui.dialogs.ConfirmDialog; import org.csploit.android.gui.dialogs.ErrorDialog; @@ -399,6 +401,23 @@ public boolean onOptionsItemSelected(MenuItem item){ } } + private void movePcapFileFromCacheToStorage() + { + InputStream in = null; + OutputStream out = null; + + try { + in = new FileInputStream(mPcapFileName); + 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); + } + } + private void setStoppedState(){ if(mTcpdumpProcess != null) { mTcpdumpProcess.kill(); @@ -409,21 +428,7 @@ private void setStoppedState(){ if (mFileActivity != null) { mFileActivity.stopWatching(); mFileActivity = null; - //copy pcap file from cache to storage - try { - InputStream in = new FileInputStream(mPcapFileName); - OutputStream out = new FileOutputStream(new File(System.getStoragePath(),new File(mPcapFileName).getName())); - byte[] buf = new byte[1024]; - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - in.close(); - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - + movePcapFileFromCacheToStorage(); } } From 72c6a38e2ce4043daf137a2c13a972ab696626ba Mon Sep 17 00:00:00 2001 From: tux-mind Date: Wed, 6 Apr 2016 11:07:48 +0200 Subject: [PATCH 073/110] [Sniffer] moving a file implies it's removal... --- .../java/org/csploit/android/plugins/mitm/Sniffer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java index 5cdcee6142..3599384249 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/Sniffer.java @@ -401,13 +401,13 @@ public boolean onOptionsItemSelected(MenuItem item){ } } - private void movePcapFileFromCacheToStorage() - { + private void movePcapFileFromCacheToStorage() { + File inputFile = new File(mPcapFileName); InputStream in = null; OutputStream out = null; try { - in = new FileInputStream(mPcapFileName); + in = new FileInputStream(inputFile); out = new FileOutputStream(new File(System.getStoragePath(),new File(mPcapFileName).getName())); IOUtils.copy(in, out); } catch (IOException e) { @@ -415,6 +415,7 @@ private void movePcapFileFromCacheToStorage() } finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(out); + inputFile.delete(); } } From 3af4832c2c07f4e3f52d00d7812f38a21453d801 Mon Sep 17 00:00:00 2001 From: Eliott T Date: Tue, 21 Jun 2016 09:54:16 +0200 Subject: [PATCH 074/110] Update README.md Added supersu req --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1b11bc0197..9fd7c7d789 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ Also see the [wiki](https://github.com/cSploit/android/wiki) for instructions on * 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 From 73ee530e26cec038cbc056d3f303d5310fd906ef Mon Sep 17 00:00:00 2001 From: Artem Kulakov Date: Sat, 20 Aug 2016 03:24:59 +0300 Subject: [PATCH 075/110] Fix problems with equals --- .../src/main/java/org/csploit/android/core/ExecChecker.java | 4 +++- .../main/java/org/csploit/android/net/reference/CVE.java | 6 +++++- .../main/java/org/csploit/android/net/reference/Link.java | 6 +++++- .../main/java/org/csploit/android/net/reference/OSVDB.java | 6 +++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/ExecChecker.java b/cSploit/src/main/java/org/csploit/android/core/ExecChecker.java index 1c9b19bf22..efe029ac76 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/reference/CVE.java b/cSploit/src/main/java/org/csploit/android/net/reference/CVE.java index 8fb8504a50..95223d40f7 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/reference/Link.java b/cSploit/src/main/java/org/csploit/android/net/reference/Link.java index dfb804d05c..70158ae23f 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/reference/OSVDB.java b/cSploit/src/main/java/org/csploit/android/net/reference/OSVDB.java index 6c10f2b101..f1cbffb7be 100644 --- a/cSploit/src/main/java/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) { From 4820b3ecbd5661eed000aba52cf825ed937d64df Mon Sep 17 00:00:00 2001 From: Artem Kulakov Date: Sat, 20 Aug 2016 03:39:39 +0300 Subject: [PATCH 076/110] Fix mechanism of closing streams --- .../org/csploit/android/core/KnownIssues.java | 11 +++- .../java/org/csploit/android/core/System.java | 57 ++++++++++++------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/KnownIssues.java b/cSploit/src/main/java/org/csploit/android/core/KnownIssues.java index 1c034a63a1..66f027e0e5 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index 8480778715..5a624be1d3 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -18,24 +18,6 @@ */ package org.csploit.android.core; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningServiceInfo; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.net.wifi.WifiManager; -import android.net.wifi.WifiManager.WifiLock; -import android.os.Build; -import android.os.Environment; -import android.os.PowerManager; -import android.os.PowerManager.WakeLock; -import android.preference.PreferenceManager; -import android.util.SparseIntArray; - import org.acra.ACRA; import org.acra.ACRAConfiguration; import org.apache.commons.compress.utils.IOUtils; @@ -59,6 +41,24 @@ import org.csploit.android.services.Services; import org.csploit.android.tools.ToolBox; +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningServiceInfo; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.net.wifi.WifiManager; +import android.net.wifi.WifiManager.WifiLock; +import android.os.Build; +import android.os.Environment; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; +import android.preference.PreferenceManager; +import android.util.SparseIntArray; + import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; @@ -603,13 +603,17 @@ public static void preloadServices() { private static 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"); + fstream = new FileInputStream( + mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-mac-prefixes"); - DataInputStream in = new DataInputStream(fstream); - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + in = new DataInputStream(fstream); + reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { @@ -625,6 +629,17 @@ private static void preloadVendors() { in.close(); } 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 + } + + + } } } From c7906fbeb4ffbf18fcdf48cfaa42dfc2859f4b20 Mon Sep 17 00:00:00 2001 From: Artem Kulakov Date: Sat, 20 Aug 2016 03:51:21 +0300 Subject: [PATCH 077/110] Fix possible NPE --- cSploit/src/main/java/org/csploit/android/core/System.java | 6 +++--- .../main/java/org/csploit/android/gui/MsfPreferences.java | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index 5a624be1d3..90008cddbf 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -608,9 +608,9 @@ private static void preloadVendors() { BufferedReader reader = null; try { mVendors = new HashMap<>(); - @SuppressWarnings("ConstantConditions") - fstream = new FileInputStream( - mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-mac-prefixes"); + + fstream = new FileInputStream( + mContext.getFilesDir().getAbsolutePath() + "/tools/nmap/nmap-mac-prefixes"); in = new DataInputStream(fstream); reader = new BufferedReader(new InputStreamReader(in)); diff --git a/cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java b/cSploit/src/main/java/org/csploit/android/gui/MsfPreferences.java index a7698c25f0..72895cdc6b 100644 --- a/cSploit/src/main/java/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) { From be51023dcd595c44a02221e1e06ec5be60e76db9 Mon Sep 17 00:00:00 2001 From: Artem Kulakov Date: Sat, 20 Aug 2016 14:45:25 +0300 Subject: [PATCH 078/110] Add defensive copies of several parameters and other small changes --- cSploit/src/main/java/org/csploit/android/core/Plugin.java | 6 ++++-- cSploit/src/main/java/org/csploit/android/events/Host.java | 3 ++- .../src/main/java/org/csploit/android/net/ByteBuffer.java | 4 ++-- .../src/main/java/org/csploit/android/net/Endpoint.java | 7 ++++--- .../src/main/java/org/csploit/android/net/IP4Address.java | 5 +++-- .../csploit/android/net/http/proxy/HTTPSRedirector.java | 1 + .../org/csploit/android/net/http/proxy/ProxyThread.java | 2 -- .../org/csploit/android/net/http/server/ServerThread.java | 3 ++- .../java/org/csploit/android/net/metasploit/Option.java | 3 ++- .../android/wifi/algorithms/helpers/AliceMagicInfo.java | 6 ++++-- 10 files changed, 24 insertions(+), 16 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/Plugin.java b/cSploit/src/main/java/org/csploit/android/core/Plugin.java index 8e411e307d..afab51a3db 100644 --- a/cSploit/src/main/java/org/csploit/android/core/Plugin.java +++ b/cSploit/src/main/java/org/csploit/android/core/Plugin.java @@ -29,6 +29,8 @@ 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 +45,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 +63,7 @@ public int getDescription(){ } public Target.Type[] getAllowedTargetTypes(){ - return mAllowedTargetTypes; + return Arrays.copyOf(mAllowedTargetTypes, mAllowedTargetTypes.length); } public int getIconResourceId(){ diff --git a/cSploit/src/main/java/org/csploit/android/events/Host.java b/cSploit/src/main/java/org/csploit/android/events/Host.java index 2b58e949af..eed722263b 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/ByteBuffer.java b/cSploit/src/main/java/org/csploit/android/net/ByteBuffer.java index 252121ff06..bf808bc30d 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java index 1e26e30334..c0dfebb9e9 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -24,6 +24,7 @@ import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; +import java.util.Arrays; import org.csploit.android.core.System; import org.csploit.android.helpers.NetworkHelper; @@ -58,7 +59,7 @@ public Endpoint(String address){ public Endpoint(InetAddress address, byte[] hardware){ mAddress = address; - mHardware = hardware; + mHardware = Arrays.copyOf(hardware, hardware.length); } public Endpoint(String address, String hardware){ @@ -122,7 +123,7 @@ public void setAddress(InetAddress address){ } public byte[] getHardware(){ - return mHardware; + return Arrays.copyOf(mHardware, mHardware.length); } public String getHardwareAsString(){ @@ -139,7 +140,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/main/java/org/csploit/android/net/IP4Address.java b/cSploit/src/main/java/org/csploit/android/net/IP4Address.java index 71f2f4dfb9..3a0dbe72b4 100644 --- a/cSploit/src/main/java/org/csploit/android/net/IP4Address.java +++ b/cSploit/src/main/java/org/csploit/android/net/IP4Address.java @@ -22,6 +22,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.ByteOrder; +import java.util.Arrays; public class IP4Address implements Comparable { @@ -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(){ diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java index 6ac823861d..92d680a053 100644 --- a/cSploit/src/main/java/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 bug? headers.add(line); // \r\n\r\n received ? diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/ProxyThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/ProxyThread.java index 40fa54e6f7..3819307fd6 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/http/server/ServerThread.java b/cSploit/src/main/java/org/csploit/android/net/http/server/ServerThread.java index 852b6eff02..4d73509b66 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/metasploit/Option.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java index 31d7381c61..95147f4250 100644 --- a/cSploit/src/main/java/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. diff --git a/cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/helpers/AliceMagicInfo.java index c6ffaf6e85..142fd7d2ca 100644 --- a/cSploit/src/main/java/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(){ From 75e6a517b7bc1f4e38921d45c2670e533b4b024e Mon Sep 17 00:00:00 2001 From: Artem Kulakov Date: Sat, 20 Aug 2016 15:45:29 +0300 Subject: [PATCH 079/110] Performance improvements --- .../org/csploit/android/MainFragment.java | 1 + .../org/csploit/android/gui/FileEdit.java | 10 +++++---- .../org/csploit/android/net/RemoteReader.java | 2 +- .../android/net/http/proxy/CookieCleaner.java | 22 +++++++++++++------ .../net/http/proxy/HTTPSRedirector.java | 2 +- .../android/net/http/proxy/StreamThread.java | 9 ++++---- .../android/net/metasploit/MsfExploit.java | 6 +++-- .../android/net/metasploit/Option.java | 6 ++--- .../android/net/metasploit/ShellSession.java | 2 +- .../csploit/android/plugins/PacketForger.java | 18 +++++++-------- .../plugins/mitm/hijacker/Hijacker.java | 8 +++---- .../receivers/MsfRpcdServiceReceiver.java | 2 +- .../android/wifi/algorithms/AliceKeygen.java | 12 +++++----- .../android/wifi/algorithms/OnoKeygen.java | 12 ++++++---- 14 files changed, 65 insertions(+), 47 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/MainFragment.java b/cSploit/src/main/java/org/csploit/android/MainFragment.java index 6d1eb1e7d2..926a853157 100644 --- a/cSploit/src/main/java/org/csploit/android/MainFragment.java +++ b/cSploit/src/main/java/org/csploit/android/MainFragment.java @@ -525,6 +525,7 @@ public void onChoice(int index) { } } + //FIXME: This method is never called. Is this a bug? private void displayNetworkInterfaces() { displayNetworkInterfaces(false); } diff --git a/cSploit/src/main/java/org/csploit/android/gui/FileEdit.java b/cSploit/src/main/java/org/csploit/android/gui/FileEdit.java index b581ebafad..af03a8d927 100644 --- a/cSploit/src/main/java/org/csploit/android/gui/FileEdit.java +++ b/cSploit/src/main/java/org/csploit/android/gui/FileEdit.java @@ -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/main/java/org/csploit/android/net/RemoteReader.java b/cSploit/src/main/java/org/csploit/android/net/RemoteReader.java index bd2954d97f..5d3ae6a4f6 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/http/proxy/CookieCleaner.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/CookieCleaner.java index 05062bb96c..8aad43fd8e 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java index 92d680a053..09fadf5cef 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/HTTPSRedirector.java @@ -133,7 +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 bug? + //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/main/java/org/csploit/android/net/http/proxy/StreamThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java index 0632d030f5..78a9184c77 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java @@ -147,18 +147,19 @@ 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); diff --git a/cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java index 608108cec4..d1b2ff6573 100644 --- a/cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java +++ b/cSploit/src/main/java/org/csploit/android/net/metasploit/MsfExploit.java @@ -283,9 +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(String key : res.keySet()) { - Logger.debug(String.format("res[%s] = %s", key, res.get(key))); + + 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/main/java/org/csploit/android/net/metasploit/Option.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java index 95147f4250..d20d6de2df 100644 --- a/cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java +++ b/cSploit/src/main/java/org/csploit/android/net/metasploit/Option.java @@ -127,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/main/java/org/csploit/android/net/metasploit/ShellSession.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/ShellSession.java index 9e74c22662..ceacd8b050 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/plugins/PacketForger.java b/cSploit/src/main/java/org/csploit/android/plugins/PacketForger.java index 8051ebc589..394aeb4a16 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java index 26f24cc2ef..1277b8f816 100644 --- a/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java +++ b/cSploit/src/main/java/org/csploit/android/plugins/mitm/hijacker/Hijacker.java @@ -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/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java b/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java index d832e90f62..cbd48e2661 100644 --- a/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java +++ b/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java @@ -20,7 +20,7 @@ */ public class MsfRpcdServiceReceiver extends ManagedReceiver { - final int MSF_NOTIFICATION = 1337; + final static int MSF_NOTIFICATION = 1337; private final IntentFilter filter; public MsfRpcdServiceReceiver() { diff --git a/cSploit/src/main/java/org/csploit/android/wifi/algorithms/AliceKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/AliceKeygen.java index dd80cf5a27..9bf9c291af 100644 --- a/cSploit/src/main/java/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/main/java/org/csploit/android/wifi/algorithms/OnoKeygen.java b/cSploit/src/main/java/org/csploit/android/wifi/algorithms/OnoKeygen.java index 91f0ca0e86..f48167837e 100644 --- a/cSploit/src/main/java/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); } } From f68d1cdfdc5c5d06e9a014c36e65eb74b82f9e94 Mon Sep 17 00:00:00 2001 From: Artem Kulakov Date: Sat, 20 Aug 2016 16:01:43 +0300 Subject: [PATCH 080/110] Fix some possible multithreading troubles --- .../main/java/org/csploit/android/core/System.java | 12 ++++++------ .../csploit/android/net/metasploit/RPCClient.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index 90008cddbf..d2cd4f87fa 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -109,8 +109,8 @@ 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 SortedSet mTargets = new TreeSet<>(); private static Target mCurrentTarget = null; @@ -125,9 +125,9 @@ 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; @@ -601,7 +601,7 @@ public static void preloadServices() { } } - private static void preloadVendors() { + private static synchronized void preloadVendors() { if (mVendors == null) { FileInputStream fstream = null; DataInputStream in = null; diff --git a/cSploit/src/main/java/org/csploit/android/net/metasploit/RPCClient.java b/cSploit/src/main/java/org/csploit/android/net/metasploit/RPCClient.java index 5f861d867a..0e3fc6dacf 100644 --- a/cSploit/src/main/java/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; From 9efe765e372e43c7259fc70c6b397926eb4d0d03 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Thu, 29 Sep 2016 10:02:56 +0200 Subject: [PATCH 081/110] [MITM] handle JSON content this allow us to edit JSON traffic. this is useful for APIs injection. f.i. an app which is showing an error message coming from a JSON response with a WebView can be exploited for rendering arbitrary HTML content on the victim machine. --- .../org/csploit/android/net/http/proxy/StreamThread.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java index 78a9184c77..3a30e32e42 100644 --- a/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java +++ b/cSploit/src/main/java/org/csploit/android/net/http/proxy/StreamThread.java @@ -36,8 +36,9 @@ 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"; From 7af01d202a32b9500d629eebd2bcab9dc37cbd8a Mon Sep 17 00:00:00 2001 From: Enrico Monese Date: Sun, 2 Oct 2016 18:22:55 +0200 Subject: [PATCH 082/110] Typo fix --- cSploit/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/main/res/values-it/strings.xml b/cSploit/src/main/res/values-it/strings.xml index cb07f63da3..47c3817641 100644 --- a/cSploit/src/main/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 From 87a4539ac1f93f8849899f27164a830e6367902c Mon Sep 17 00:00:00 2001 From: Fabinho Date: Mon, 21 Nov 2016 11:23:47 -0200 Subject: [PATCH 083/110] update string --- cSploit/src/main/res/values-pt/strings.xml | 42 ++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/cSploit/src/main/res/values-pt/strings.xml b/cSploit/src/main/res/values-pt/strings.xml index 16e9a3bac0..2033befc20 100644 --- a/cSploit/src/main/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 From 62e14a63983e836db9bab70c55c74d63a1e0137c Mon Sep 17 00:00:00 2001 From: nullpointer17 Date: Fri, 13 Jan 2017 12:30:11 +0100 Subject: [PATCH 084/110] Added new magic numbers Added new magic numbers --- cSploit/src/main/res/raw/alice.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cSploit/src/main/res/raw/alice.xml b/cSploit/src/main/res/raw/alice.xml index d129f905d2..4e3cd17328 100644 --- a/cSploit/src/main/res/raw/alice.xml +++ b/cSploit/src/main/res/raw/alice.xml @@ -29,6 +29,7 @@ + @@ -56,6 +57,7 @@ + @@ -78,6 +80,7 @@ + @@ -93,6 +96,7 @@ + @@ -129,6 +133,7 @@ + @@ -151,6 +156,7 @@ + @@ -165,6 +171,7 @@ + @@ -179,8 +186,10 @@ + + @@ -192,10 +201,13 @@ + + + @@ -233,7 +245,9 @@ + + @@ -251,6 +265,7 @@ + @@ -277,11 +292,13 @@ + + @@ -294,6 +311,7 @@ + From 4da1d2724564b488db26da328f4bda732dc7c272 Mon Sep 17 00:00:00 2001 From: Salvatore Catroppa Date: Sat, 21 Jan 2017 10:47:31 +0100 Subject: [PATCH 085/110] Fixed typo --- cSploit/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/main/res/values-it/strings.xml b/cSploit/src/main/res/values-it/strings.xml index cb07f63da3..47c3817641 100644 --- a/cSploit/src/main/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 From c8e714e223ebb5357dc269fd1466e574515b5f2c Mon Sep 17 00:00:00 2001 From: pahapoika Date: Fri, 3 Feb 2017 13:40:04 +0200 Subject: [PATCH 086/110] Issue template --- ISSUE_TEMPLATE.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 ISSUE_TEMPLATE.md diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..cca0066ac0 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,35 @@ +##DEVICE: + + +##OS version: + + +##cSploit version: + + +##busybox (installed or not): + + +##Rooted with supersu? + + +##logcat (filter it!): + + +**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. From 085c8b4e9124d9af91f0ab3a1833e2c10ac65176 Mon Sep 17 00:00:00 2001 From: IwraStudios Date: Sat, 11 Feb 2017 12:05:08 +0100 Subject: [PATCH 087/110] Update Endpoint.java --- cSploit/src/main/java/org/csploit/android/net/Endpoint.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java index c0dfebb9e9..7ac25d8301 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -58,8 +58,14 @@ public Endpoint(String address){ } public Endpoint(InetAddress address, byte[] hardware){ + try{ mAddress = address; mHardware = Arrays.copyOf(hardware, hardware.length); + } + catch(Exeption e){ + System.errorLogging(e); + mAddress = null; + } } public Endpoint(String address, String hardware){ From f24da270f3e3c4b994784e32e1e7b7cd786ee7a3 Mon Sep 17 00:00:00 2001 From: IwraStudios Date: Sat, 11 Feb 2017 12:07:58 +0100 Subject: [PATCH 088/110] typo --- cSploit/src/main/java/org/csploit/android/net/Endpoint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java index 7ac25d8301..f665e71630 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -62,7 +62,7 @@ public Endpoint(InetAddress address, byte[] hardware){ mAddress = address; mHardware = Arrays.copyOf(hardware, hardware.length); } - catch(Exeption e){ + catch(Exception e){ System.errorLogging(e); mAddress = null; } From 6162c3c5935c1d46f2f683d85fc9d0ead56e287f Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 11 Feb 2017 12:37:25 +0100 Subject: [PATCH 089/110] [#831] allow creation of Endpoint with null HW address fixes #831 --- .../java/org/csploit/android/net/Endpoint.java | 16 +++++----------- .../java/org/csploit/android/net/Network.java | 12 ++++-------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java index f665e71630..2f52d5d100 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -19,6 +19,9 @@ package org.csploit.android.net; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import org.csploit.android.core.System; +import org.csploit.android.helpers.NetworkHelper; import java.io.BufferedReader; import java.math.BigInteger; @@ -26,9 +29,6 @@ import java.net.UnknownHostException; import java.util.Arrays; -import org.csploit.android.core.System; -import org.csploit.android.helpers.NetworkHelper; - public class Endpoint implements Comparable { private InetAddress mAddress = null; @@ -57,15 +57,9 @@ public Endpoint(String address){ this(address, null); } - public Endpoint(InetAddress address, byte[] hardware){ - try{ + public Endpoint(InetAddress address, @Nullable byte[] hardware){ mAddress = address; - mHardware = Arrays.copyOf(hardware, hardware.length); - } - catch(Exception e){ - System.errorLogging(e); - mAddress = null; - } + mHardware = hardware != null ? Arrays.copyOf(hardware, hardware.length) : null; } public Endpoint(String address, String hardware){ diff --git a/cSploit/src/main/java/org/csploit/android/net/Network.java b/cSploit/src/main/java/org/csploit/android/net/Network.java index a560cae834..b4ad47e191 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Network.java +++ b/cSploit/src/main/java/org/csploit/android/net/Network.java @@ -25,20 +25,15 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.support.annotation.NonNull; +import android.support.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.InetAddress; -import java.net.InterfaceAddress; -import java.net.NetworkInterface; -import java.net.NoRouteToHostException; -import java.net.SocketException; -import java.net.UnknownHostException; +import java.net.*; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; @@ -339,9 +334,10 @@ public byte[] getGatewayHardware() { return Endpoint.parseMacAddress(mWifiInfo.getBSSID()); } + @Nullable public byte[] getLocalHardware() { try { - return mInterface.getHardwareAddress(); + return mInterface.getHardwareAddress(); //FIXME: #831 } catch (SocketException e) { System.errorLogging(e); } From ff6b13aa8d0139f79dcb0cc2b892e444d2cfeaf5 Mon Sep 17 00:00:00 2001 From: tux-mind Date: Sat, 11 Feb 2017 17:14:31 +0100 Subject: [PATCH 090/110] [#831] manage Endpoint with null HW address --- .../java/org/csploit/android/core/System.java | 71 ++++++------------- .../org/csploit/android/net/Endpoint.java | 3 +- 2 files changed, 24 insertions(+), 50 deletions(-) diff --git a/cSploit/src/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index d2cd4f87fa..4c0718ebea 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -18,6 +18,24 @@ */ package org.csploit.android.core; +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningServiceInfo; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.net.wifi.WifiManager; +import android.net.wifi.WifiManager.WifiLock; +import android.os.Build; +import android.os.Environment; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.util.SparseIntArray; import org.acra.ACRA; import org.acra.ACRAConfiguration; import org.apache.commons.compress.utils.IOUtils; @@ -41,54 +59,9 @@ import org.csploit.android.services.Services; import org.csploit.android.tools.ToolBox; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningServiceInfo; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.net.wifi.WifiManager; -import android.net.wifi.WifiManager.WifiLock; -import android.os.Build; -import android.os.Environment; -import android.os.PowerManager; -import android.os.PowerManager.WakeLock; -import android.preference.PreferenceManager; -import android.util.SparseIntArray; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.io.Writer; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.NoRouteToHostException; -import java.net.Socket; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Observer; -import java.util.SortedSet; -import java.util.TreeSet; +import java.io.*; +import java.net.*; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; @@ -1062,7 +1035,7 @@ public static KnownIssues getKnownIssues() { return mKnownIssues; } - public static String getMacVendor(byte[] mac) { + public static String getMacVendor(@Nullable byte[] mac) { if (mac != null && mVendors != null && mac.length >= 3) return mVendors.get(NetworkHelper.getOUICode(mac)); else diff --git a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java index 2f52d5d100..93a696278d 100644 --- a/cSploit/src/main/java/org/csploit/android/net/Endpoint.java +++ b/cSploit/src/main/java/org/csploit/android/net/Endpoint.java @@ -122,8 +122,9 @@ public void setAddress(InetAddress address){ this.mAddress = address; } + @Nullable public byte[] getHardware(){ - return Arrays.copyOf(mHardware, mHardware.length); + return mHardware != null ? Arrays.copyOf(mHardware, mHardware.length) : null; } public String getHardwareAsString(){ From 41b9ccfef50d4c54f4c9f7e5a141d1a492e020e8 Mon Sep 17 00:00:00 2001 From: pahapoika Date: Thu, 15 Jun 2017 21:35:30 +0300 Subject: [PATCH 091/110] Update styling for more simplified template Hopefully helps issue reporting --- ISSUE_TEMPLATE.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index cca0066ac0..8a4f36434e 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -4,17 +4,19 @@ ##OS version: -##cSploit version: +##**cSploit version:** -##busybox (installed or not): +##**busybox** *(installed or not):* -##Rooted with supersu? +##**Rooted with supersu?** -##logcat (filter it!): +##**logcat** *(filter it!):* +[How-to guide] (https://forum.xda-developers.com/showthread.php?t=1726238) +------------------------------------------------------------------------------------------------------------------------------ **Daemon specific questions** @@ -26,10 +28,12 @@ ##Using Docker (incase of unofficial build.) - ##Actions performed: + #Logs: +------------------------------------------------------------------------------------------------------------------------------ + +##**Issue:** +*Remember to search for issues alike before creating new one!* -##Issue: -*Remember to search for issues alike before creating new one. From 2751837465910697218da0994955f807c861f255 Mon Sep 17 00:00:00 2001 From: pahapoika Date: Thu, 15 Jun 2017 21:38:46 +0300 Subject: [PATCH 092/110] Quick fix for styling --- ISSUE_TEMPLATE.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 8a4f36434e..526bb69521 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,39 +1,39 @@ -##DEVICE: +DEVICE: -##OS version: +OS version: -##**cSploit version:** +**cSploit version:** -##**busybox** *(installed or not):* +**busybox** *(installed or not):* -##**Rooted with supersu?** +**Rooted with supersu?** -##**logcat** *(filter it!):* +**logcat** *(filter it!):* [How-to guide] (https://forum.xda-developers.com/showthread.php?t=1726238) ------------------------------------------------------------------------------------------------------------------------------ **Daemon specific questions** -##Go version: +Go version: -##OS: +OS: -##Using Docker (incase of unofficial build.) +Using Docker (incase of unofficial build.) -##Actions performed: +Actions performed: -#Logs: +Logs: ------------------------------------------------------------------------------------------------------------------------------ -##**Issue:** +**Issue:** *Remember to search for issues alike before creating new one!* From 09bb74b4b7f08c8aa1c5ec0769b64a472a1f9920 Mon Sep 17 00:00:00 2001 From: IwraStudios Date: Thu, 15 Jun 2017 21:11:27 +0200 Subject: [PATCH 093/110] Fixed Href Link in ISSUE_TEMPLATE --- ISSUE_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index 526bb69521..72f9cc18f2 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -14,7 +14,7 @@ OS version: **logcat** *(filter it!):* -[How-to guide] (https://forum.xda-developers.com/showthread.php?t=1726238) +[How-to guide](https://forum.xda-developers.com/showthread.php?t=1726238) ------------------------------------------------------------------------------------------------------------------------------ From f794919f02b4c3bf4e43ea120d5b92a5bf2ef296 Mon Sep 17 00:00:00 2001 From: fattire Date: Thu, 15 Feb 2018 15:55:26 -0800 Subject: [PATCH 094/110] Update everything for Android 3.2a3 (big, see below) While waiting for cSploit 2.0 to come online, here's a quick refresh: * target API/sdk 27, support as far back as 14 (from 9) * update libraries and use new "implementation" build.gradle syntax * Update Java to 1.8 * Update to gradle 4.5.1 from 2.9 * Update android gradle plugin from 1.5.0 to 3.2.0-a3 * Use the google dependency repository * simplify build.gradle date stamp calculation * update ACRA (even though target end point @ iriscouch went offline). This is not really tested past the "send info" dialog (no point) * Support multi-window on chromebook. * Add Notification Channel as required by Oreo (Android 8) * Add very simple runtime permissions request * Minor changes to use .apply() instead of .commit() * Similar minor fix to use Locale with string formatting. * Minor removal of dialog theme defining itself * Fix bug in SettingsFragment where super.onViewCreated() not called * Minor fix to preferences compat xml file Th-that's all, folks! --- build.gradle | 4 +- cSploit/build.gradle | 55 +++++++++---------- cSploit/src/main/AndroidManifest.xml | 15 +++-- .../csploit/android/CSploitApplication.java | 50 ++++++++++++----- .../org/csploit/android/MainActivity.java | 50 ++++++++++++++++- .../org/csploit/android/SettingsFragment.java | 5 +- .../android/core/MultiAttackService.java | 11 ++-- .../java/org/csploit/android/core/System.java | 40 +++++++++++--- .../android/services/UpdateService.java | 41 +++++++++----- .../receivers/MsfRpcdServiceReceiver.java | 5 +- cSploit/src/main/res/values/strings.xml | 8 +++ cSploit/src/main/res/values/style.xml | 2 - cSploit/src/main/res/xml/preferences.xml | 4 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 14 files changed, 205 insertions(+), 89 deletions(-) diff --git a/build.gradle b/build.gradle index dea94eb99c..dfc3de68c0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,18 @@ // 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.5.0' + classpath 'com.android.tools.build:gradle:3.2.0-alpha03' } } allprojects { repositories { + google() jcenter() mavenCentral() } diff --git a/cSploit/build.gradle b/cSploit/build.gradle index 0002b242e6..d96c10529d 100644 --- a/cSploit/build.gradle +++ b/cSploit/build.gradle @@ -1,19 +1,17 @@ buildscript { repositories { + google() jcenter() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:3.2.0-alpha03' } } -def getDate() { - return Calendar.getInstance().getTimeInMillis(); -} - allprojects { repositories { + google() jcenter() mavenCentral() } @@ -21,28 +19,29 @@ allprojects { apply plugin: 'com.android.application' dependencies { - compile 'com.android.support:support-v4:23.1.1' - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:design:23.1.1' - compile 'com.android.support:preference-v7:23.1.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' - testCompile 'junit:junit:4.12' + implementation 'com.android.support:support-v4:27.0.2' + implementation 'com.android.support:appcompat-v7:27.0.2' + implementation 'com.android.support:design:27.0.2' + implementation 'com.android.support:preference-v7:27.0.2' + implementation 'org.apache.commons:commons-compress:1.16.1' + implementation 'commons-net:commons-net:3.6' + implementation 'com.github.zafarkhaja:java-semver:0.9.0' + implementation 'org.unbescape:unbescape:1.1.5.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.1.0' + implementation 'ch.acra:acra-notification:5.1.0' + testImplementation 'junit:junit:4.12' } android { - compileSdkVersion 23 - buildToolsVersion '23.0.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } packagingOptions { @@ -51,8 +50,8 @@ android { } defaultConfig { - minSdkVersion 9 - targetSdkVersion 22 + minSdkVersion 14 + targetSdkVersion 27 versionCode 4 versionName "1.7.0-unstable" if(System.getenv("NIGHTLY_BUILD")) { @@ -81,8 +80,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 @@ -91,8 +90,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 } diff --git a/cSploit/src/main/AndroidManifest.xml b/cSploit/src/main/AndroidManifest.xml index 84618a1962..3c6a33db5d 100644 --- a/cSploit/src/main/AndroidManifest.xml +++ b/cSploit/src/main/AndroidManifest.xml @@ -14,14 +14,19 @@ - + android:theme="@style/AppTheme" + android:resizeableActivity="true"> + + + - - = 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); @@ -44,9 +62,35 @@ protected void onCreate(Bundle savedInstanceState) { getSupportFragmentManager().beginTransaction() .add(R.id.mainframe, f).commit(); } + verifyPerms(); } - public void onBackPressed() { - f.onBackPressed(); - } + 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) { + ActivityCompat.requestPermissions(this, + new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE}, + 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/SettingsFragment.java b/cSploit/src/main/java/org/csploit/android/SettingsFragment.java index ba6db23dd2..1aea61f5fc 100644 --- a/cSploit/src/main/java/org/csploit/android/SettingsFragment.java +++ b/cSploit/src/main/java/org/csploit/android/SettingsFragment.java @@ -99,6 +99,7 @@ public static class PrefsFrag extends PreferenceFragmentCompat implements Shared @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) { @@ -140,7 +141,7 @@ public void onCreate(Bundle savedInstanceState) { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { SharedPreferences themePrefs = getActivity().getBaseContext().getSharedPreferences("THEME", 0); - themePrefs.edit().putBoolean("isDark", (Boolean) newValue).commit(); + themePrefs.edit().putBoolean("isDark", (Boolean) newValue).apply(); Toast.makeText(getActivity().getBaseContext(), getString(R.string.please_restart), Toast.LENGTH_LONG).show(); return true; } @@ -276,7 +277,7 @@ else if (checker != null && !checker.canExecuteInDir(path)) else { //noinspection ConstantConditions - getPreferenceManager().getSharedPreferences().edit().putString(key, path).commit(); + getPreferenceManager().getSharedPreferences().edit().putString(key, path).apply(); if (oldPath != null && !oldPath.equals(path)) { File current = new File(oldPath); diff --git a/cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java b/cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java index 8956a8c6de..3804258e70 100644 --- a/cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java +++ b/cSploit/src/main/java/org/csploit/android/core/MultiAttackService.java @@ -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/main/java/org/csploit/android/core/System.java b/cSploit/src/main/java/org/csploit/android/core/System.java index 4c0718ebea..be85431054 100644 --- a/cSploit/src/main/java/org/csploit/android/core/System.java +++ b/cSploit/src/main/java/org/csploit/android/core/System.java @@ -36,8 +36,7 @@ import android.preference.PreferenceManager; import android.support.annotation.Nullable; 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.WifiScannerFragment; @@ -59,9 +58,36 @@ import org.csploit.android.services.Services; import org.csploit.android.tools.ToolBox; -import java.io.*; -import java.net.*; -import java.util.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.NoRouteToHostException; +import java.net.Socket; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +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; @@ -271,12 +297,12 @@ private static void startCoreDaemon() throws SuException, DaemonException { 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; } } diff --git a/cSploit/src/main/java/org/csploit/android/services/UpdateService.java b/cSploit/src/main/java/org/csploit/android/services/UpdateService.java index 1a24cd2e22..dcbd717354 100644 --- a/cSploit/src/main/java/org/csploit/android/services/UpdateService.java +++ b/cSploit/src/main/java/org/csploit/android/services/UpdateService.java @@ -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/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java b/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java index cbd48e2661..dff6472111 100644 --- a/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java +++ b/cSploit/src/main/java/org/csploit/android/services/receivers/MsfRpcdServiceReceiver.java @@ -69,12 +69,13 @@ private void showToastForStatus(Context context, MsfRpcdService.Status status) { 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/main/res/values/strings.xml b/cSploit/src/main/res/values/strings.xml index 643793f6bd..261c012269 100644 --- a/cSploit/src/main/res/values/strings.xml +++ b/cSploit/src/main/res/values/strings.xml @@ -537,4 +537,12 @@ delete current session and start another? any interface Error initializing %s + + + csploit_channel + cSploit-related messages + + + Sorry, you need to approve both permission requests. + Thanks! diff --git a/cSploit/src/main/res/values/style.xml b/cSploit/src/main/res/values/style.xml index 628c655cfb..401b44f90c 100644 --- a/cSploit/src/main/res/values/style.xml +++ b/cSploit/src/main/res/values/style.xml @@ -47,8 +47,6 @@ @color/background_window_dark -