From 81868002583e44d856aac76bdb3f5024a048bde8 Mon Sep 17 00:00:00 2001 From: ga Date: Fri, 16 Oct 2015 22:14:16 +0200 Subject: [PATCH] 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 ) {