From 4ba06a0131ac15e41ea1b06d8f480a1e911b4bde Mon Sep 17 00:00:00 2001 From: Balint Kovacs Date: Mon, 21 Mar 2011 12:27:51 +0100 Subject: [PATCH] Initial commit So far done: - ssl proxying - basic android conversion Signed-off-by: Balint Kovacs --- .classpath | 7 + .project | 33 +++++ .settings/org.eclipse.jdt.core.prefs | 5 + AndroidManifest.xml | 23 +++ bin/SSLDroid.apk | Bin 0 -> 17935 bytes bin/classes.dex | Bin 0 -> 10172 bytes bin/resources.ap_ | Bin 0 -> 11191 bytes default.properties | 11 ++ proguard.cfg | 36 +++++ res/drawable-hdpi/icon.png | Bin 0 -> 4147 bytes res/drawable-ldpi/icon.png | Bin 0 -> 1723 bytes res/drawable-mdpi/icon.png | Bin 0 -> 2574 bytes res/layout/main.xml | 12 ++ res/values/strings.xml | 5 + src/hu/blint/ssldroid/SSLDroid.java | 66 +++++++++ src/hu/blint/ssldroid/SSLDroidGui.java | 39 +++++ src/hu/blint/ssldroid/TcpProxy.java | 189 +++++++++++++++++++++++++ 17 files changed, 426 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 AndroidManifest.xml create mode 100644 bin/SSLDroid.apk create mode 100644 bin/classes.dex create mode 100644 bin/resources.ap_ create mode 100644 default.properties create mode 100644 proguard.cfg create mode 100644 res/drawable-hdpi/icon.png create mode 100644 res/drawable-ldpi/icon.png create mode 100644 res/drawable-mdpi/icon.png create mode 100644 res/layout/main.xml create mode 100644 res/values/strings.xml create mode 100644 src/hu/blint/ssldroid/SSLDroid.java create mode 100644 src/hu/blint/ssldroid/SSLDroidGui.java create mode 100644 src/hu/blint/ssldroid/TcpProxy.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..609aa00 --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..c4e29e5 --- /dev/null +++ b/.project @@ -0,0 +1,33 @@ + + + SSLDroid + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..9504bf4 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +#Sat Mar 19 16:20:10 CET 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..ac8a37d --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bin/SSLDroid.apk b/bin/SSLDroid.apk new file mode 100644 index 0000000000000000000000000000000000000000..a7b66ce9dfe55857481bb7c5bc6d2bce2a7580c6 GIT binary patch literal 17935 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 literal 0 HcmV?d00001 diff --git a/bin/classes.dex b/bin/classes.dex new file mode 100644 index 0000000000000000000000000000000000000000..1991b02c6dcb80d91684763577a3754a8a949250 GIT binary patch literal 10172 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 literal 0 HcmV?d00001 diff --git a/bin/resources.ap_ b/bin/resources.ap_ new file mode 100644 index 0000000000000000000000000000000000000000..22208eed1e0540c01a398090350c53f731d1ebab GIT binary patch literal 11191 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 S0CZ>u7LW$&HY7T5>VE(u_Gobc literal 0 HcmV?d00001 diff --git a/default.properties b/default.properties new file mode 100644 index 0000000..46769a7 --- /dev/null +++ b/default.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-7 diff --git a/proguard.cfg b/proguard.cfg new file mode 100644 index 0000000..12dd039 --- /dev/null +++ b/proguard.cfg @@ -0,0 +1,36 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/res/drawable-ldpi/icon.png b/res/drawable-ldpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..1208a6e --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,5 @@ + + + Hello World, SSLDroidGui! + SSLDroid + diff --git a/src/hu/blint/ssldroid/SSLDroid.java b/src/hu/blint/ssldroid/SSLDroid.java new file mode 100644 index 0000000..d40ea04 --- /dev/null +++ b/src/hu/blint/ssldroid/SSLDroid.java @@ -0,0 +1,66 @@ +package hu.blint.ssldroid; + +import hu.blint.ssldroid.TcpProxy; +import android.app.*; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; +import android.widget.Toast; + +public class SSLDroid extends Service { + + final String TAG = "SSLDroid"; + + @Override + public void onCreate() { + Toast.makeText(this, "SSLDroid Service Started", Toast.LENGTH_LONG).show(); + Log.d(TAG, "onStart"); + } + + @Override + public void onStart(Intent intent, int startid) { + + int listenPort = 9999; // port to listen on + int targetPort = 443; // port to connect to + String targetHost = "sogo.balabit.com"; //remote host + String keyFile = "/mnt/sdcard/blint-imaps.p12"; + String keyPass = "titkos"; + + Toast.makeText(this, "SSLDroid Service Created", Toast.LENGTH_LONG).show(); + Log.d(TAG, "onCreate"); + + TcpProxy tp = new TcpProxy(); + try { + tp.serve(listenPort, targetHost, targetPort, keyFile, keyPass); + } catch (Exception e) { + Toast.makeText(this, "SSLDroid Sulyos Errorhiba" + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onDestroy() { + } +} + +/*public class SSLDroid +{ + + public static final int listenPort = 9999, // port to listen on + targetPort = 443; // port to connect to + public static final String targetHost = "sogo.balabit.com"; //remote host + static String keyFile = "/home/blint/vpn/blint-imaps.p12"; + static String keyPass = "titkos"; + + public static void main(String[] args) { + TcpProxy tp = new TcpProxy(); + try { + tp.serve(listenPort, targetHost, targetPort, keyFile, keyPass); + } catch (Exception e) { + } + } +} */ diff --git a/src/hu/blint/ssldroid/SSLDroidGui.java b/src/hu/blint/ssldroid/SSLDroidGui.java new file mode 100644 index 0000000..b016f55 --- /dev/null +++ b/src/hu/blint/ssldroid/SSLDroidGui.java @@ -0,0 +1,39 @@ +package hu.blint.ssldroid; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +public class SSLDroidGui extends Activity implements OnClickListener { + private static final String TAG = "ServicesDemo"; + Button buttonStart, buttonStop; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + buttonStart = (Button) findViewById(R.id.buttonStart); + buttonStop = (Button) findViewById(R.id.buttonStop); + + buttonStart.setOnClickListener(this); + buttonStop.setOnClickListener(this); + } + + public void onClick(View src) { + switch (src.getId()) { + case R.id.buttonStart: + Log.d(TAG, "onClick: starting service"); + startService(new Intent(this, SSLDroid.class)); + break; + case R.id.buttonStop: + Log.d(TAG, "onClick: stopping service"); + stopService(new Intent(this, SSLDroid.class)); + break; + } + } +} \ No newline at end of file diff --git a/src/hu/blint/ssldroid/TcpProxy.java b/src/hu/blint/ssldroid/TcpProxy.java new file mode 100644 index 0000000..deced37 --- /dev/null +++ b/src/hu/blint/ssldroid/TcpProxy.java @@ -0,0 +1,189 @@ +package hu.blint.ssldroid; + +import java.net.*; +import java.io.*; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.UnrecoverableKeyException; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +import android.util.Log; + +/** + * This is a modified version of the TcpTunnelGui utility + * borrowed from the xml.apache.org project. + * @author Balint Kovacs (blint@blint.hu) + */ +public class TcpProxy { + int listenPort; + String tunnelHost; + int tunnelPort; + String keyFile, keyPass; + Relay inRelay, outRelay; + + public TcpProxy() { + } + + public TcpProxy(int listenPort, String tunnelHost, int tunnelPort, String keyFile, String keyPass) { + this.listenPort = listenPort; + this.tunnelHost = tunnelHost; + this.tunnelPort = tunnelPort; + this.keyFile = keyFile; + this.keyPass = keyPass; + } + + public int getListenPort() { + return listenPort; + } + + public String getTunnelHost() { + return tunnelHost; + } + + public int getTunnelPort() { + return tunnelPort; + } + + public String getKeyFile() { + return keyFile; + } + public String getKeyPass() { + return keyPass; + } + + private static SSLSocketFactory sslSocketFactory; + public static final SSLSocketFactory getSocketFactory(String pkcsFile, String pwd) { + if (sslSocketFactory == null) { + try { + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + keyStore.load(new FileInputStream(pkcsFile), pwd.toCharArray()); + keyManagerFactory.init(keyStore, pwd.toCharArray()); + SSLContext context = SSLContext.getInstance("TLS"); + context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); + sslSocketFactory = (SSLSocketFactory) context.getSocketFactory(); + + } catch (FileNotFoundException e) { + Log.d("SSLDroid","Error loading the client certificate file:" + e.getMessage()); + } catch (KeyManagementException e) { + Log.d("SSLDroid","No SSL algorithm support: " + e.getMessage()); + } catch (NoSuchAlgorithmException e) { + Log.d("SSLDroid","Exception when setting up the Naive key management."); + } catch (KeyStoreException e) { + Log.d("SSLDroid","Error setting up keystore:" + e.getMessage()); + } catch (java.security.cert.CertificateException e) { + Log.d("SSLDroid","Error loading the client certificate:" + e.getMessage()); + } catch (IOException e) { + Log.d("SSLDroid","Error loading the client certificate file:" + e.getMessage()); + } catch (UnrecoverableKeyException e) { + Log.d("SSLDroid","Error loading the client certificate:" + e.getMessage()); + } + } + return sslSocketFactory; + } + + public void serve(int listenPort, String tunnelHost, int tunnelPort, String keyFile, String keyPass) throws IOException { + final TcpProxy ttg = new TcpProxy(listenPort, tunnelHost, tunnelPort, keyFile, keyPass); + + // create the server thread + Thread server = new Thread() { + public void run() { + ServerSocket ss = null; + try { + ss = new ServerSocket(ttg.getListenPort()); + } catch (Exception e) { + Log.d("SSLDroid", e.getMessage()); + //e.printStackTrace(); + System.exit(1); + } + while (true) { + try { + Log.d("SSLDroid","Listening for connections on port " + ttg.getListenPort() + " ..."); + // accept the connection from my client + Socket sc = ss.accept(); + Socket st; + + try { + st = (SSLSocket) getSocketFactory(ttg.getKeyFile(), ttg.getKeyPass()).createSocket(ttg.getTunnelHost(), ttg.getTunnelPort()); + ((SSLSocket)st).startHandshake(); + } catch (Exception e) { + Log.d("SSLDroid","SSL FAIL!\n" + e.toString()); + st = new Socket(ttg.getTunnelHost(),ttg.getTunnelPort()); + } + + Log.d("SSLDroid","Tunnelling port " + ttg.getListenPort() + " to port " + ttg.getTunnelPort() + " on host " + ttg.getTunnelHost() + " ..."); + + // relay the stuff thru + Thread fromBrowserToServer = new Relay(sc.getInputStream(), st.getOutputStream(), "<<< B2S <<<"); + Thread fromServerToBrowser = new Relay(st.getInputStream(), sc.getOutputStream(), ">>> S2B >>>"); + + fromBrowserToServer.start(); + fromServerToBrowser.start(); + + } catch (Exception ee) { + Log.d("SSLDroid","Ouch: "+ ee.getMessage()); + //ee.printStackTrace(); + } + } + } + }; + server.start(); + } + + public static class Relay extends Thread { + private InputStream in; + private OutputStream out; + private final static int BUFSIZ = 4096; + private byte buf[] = new byte[BUFSIZ]; + + public Relay(InputStream in, OutputStream out, String prefix) { + this.in = in; + this.out = out; + } + + public void run() { + int n = 0; + + try { + //System.err.println( + // "\n\n=== START OF A TRANSMISSION : " + dateFormat.format(new Date()) + " =======================================\n"); + + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + out.flush(); + + for (int i = 0; i < n; i++) { + if (buf[i] == 7) + buf[i] = '#'; + } + + //String msg = new String(buf, 0, n); + //System.out.println(prefix + " : " + msg.length()); + //System.err.println(msg); + } + } catch (SocketException e) { + } catch (IOException e) { + Log.d("SSLDroid", e.getMessage()); + //e.printStackTrace(); + } finally { + try { + in.close(); + out.close(); + } catch (IOException e) { + Log.d("SSLDroid", e.getMessage()); + //e.printStackTrace(); + } + } + + //System.out.println("Quiting stream proxy " + prefix + "..."); + } + } + + //private static final Format dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss,SSS"); +} \ No newline at end of file