mirror of
https://github.com/moparisthebest/SSLDroid
synced 2024-11-27 11:22:20 -05:00
Huge amount of changes:
* moved TcpProxy server thread into separate class * implemented on boot startup * fixed service stop problem and anything else I forgot about (bad boy, should commit more often) Signed-off-by: Balint Kovacs <blint@blint.hu>
This commit is contained in:
parent
36414ea0b9
commit
2ebebbd896
@ -2,29 +2,27 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="hu.blint.ssldroid" android:versionCode="1"
|
package="hu.blint.ssldroid" android:versionCode="1"
|
||||||
android:versionName="1.0">
|
android:versionName="1.0">
|
||||||
<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER"></uses-permission>
|
|
||||||
|
|
||||||
<application android:label="@string/app_name" android:icon="@drawable/icon">
|
<application android:label="@string/app_name" android:icon="@drawable/icon">
|
||||||
<activity android:name=".SSLDroidGui" android:label="@string/app_name">
|
<activity android:name="SSLDroidGui" android:label="@string/app_name">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<service android:enabled="true" android:name=".SSLDroid" />
|
<service android:enabled="true" android:name="SSLDroid">
|
||||||
</application>
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
||||||
|
|
||||||
<receiver android:name=".BootStartupReceiver"
|
|
||||||
android:enabled="true" android:exported="false" android:label="StartServiceAtBootReceiver">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action._BOOT_COMPLETED" />
|
<action android:name="hu.blint.ssldroid.SSLDroid" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
<receiver android:name="BootStartupReceiver">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
|
<category android:name="android.intent.category.HOME" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
</application>
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
</manifest>
|
</manifest>
|
BIN
bin/SSLDroid.apk
BIN
bin/SSLDroid.apk
Binary file not shown.
BIN
bin/classes.dex
BIN
bin/classes.dex
Binary file not shown.
Binary file not shown.
@ -7,8 +7,10 @@ import android.content.Intent;
|
|||||||
public class BootStartupReceiver extends BroadcastReceiver {
|
public class BootStartupReceiver extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
Intent serviceIntent = new Intent();
|
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
|
||||||
serviceIntent.setAction("hu.blint.ssldroid.SSLDroid");
|
Intent i = new Intent();
|
||||||
context.startService(serviceIntent);
|
i.setAction("hu.blint.ssldroid.SSLDroid");
|
||||||
|
context.startService(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,12 +2,9 @@ package hu.blint.ssldroid;
|
|||||||
|
|
||||||
import hu.blint.ssldroid.TcpProxy;
|
import hu.blint.ssldroid.TcpProxy;
|
||||||
import android.app.*;
|
import android.app.*;
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
public class SSLDroid extends Service {
|
public class SSLDroid extends Service {
|
||||||
|
|
||||||
@ -16,31 +13,31 @@ public class SSLDroid extends Service {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
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 listenPort = 9999; // port to listen on
|
||||||
int targetPort = 443; // port to connect to
|
int targetPort = 443; // port to connect to
|
||||||
String targetHost = "sogo.balabit.com"; // remote host
|
String targetHost = "sogo.balabit.com"; // remote host
|
||||||
String keyFile = "/mnt/sdcard/blint-imaps.p12";
|
String keyFile = "/mnt/sdcard/blint-imaps.p12";
|
||||||
String keyPass = "titkos";
|
String keyPass = "titkos";
|
||||||
|
|
||||||
Toast.makeText(this, "SSLDroid Service Started", Toast.LENGTH_LONG).show();
|
//Toast.makeText(this, "SSLDroid Service Started", Toast.LENGTH_LONG).show();
|
||||||
Log.d(TAG, "onCreate");
|
createNotification("SSLDroid is running", "SSLDroid service is running");
|
||||||
|
Log.d(TAG, "SSLDroid Service Started");
|
||||||
|
|
||||||
|
//createNotification("test", "This is a test of the emergency broadcast system");
|
||||||
|
|
||||||
tp = new TcpProxy();
|
tp = new TcpProxy();
|
||||||
try {
|
try {
|
||||||
tp.serve(listenPort, targetHost, targetPort, keyFile, keyPass);
|
tp.serve(listenPort, targetHost, targetPort, keyFile, keyPass);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.d(TAG, "SSLDroid Sulyos Errorhiba" + e.getMessage());
|
Log.d(TAG, "Error" + e.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
return START_STICKY;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBinder onBind(Intent intent) {
|
public IBinder onBind(Intent intent) {
|
||||||
return null;
|
return null;
|
||||||
@ -50,10 +47,26 @@ public class SSLDroid extends Service {
|
|||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
try {
|
try {
|
||||||
tp.stop();
|
tp.stop();
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
|
notificationManager.cancel(0);
|
||||||
|
Log.d(TAG, "SSLDroid Service Stopped");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.d("SSLDroid", "Error stopping service: " + e.getMessage());
|
Log.d("SSLDroid", "Error stopping service: " + e.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void createNotification(String title, String text) {
|
||||||
|
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
|
Notification notification = new Notification(R.drawable.icon,
|
||||||
|
"SSLDroid startup", System.currentTimeMillis());
|
||||||
|
// Hide the notification after its selected
|
||||||
|
//notification.flags |= Notification.FLAG_AUTO_CANCEL;
|
||||||
|
|
||||||
|
Intent intent = new Intent(this, SSLDroidGui.class);
|
||||||
|
PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);
|
||||||
|
notification.setLatestEventInfo(this, title, text, activity);
|
||||||
|
notificationManager.notify(0, notification);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -9,8 +9,8 @@ import android.view.View.OnClickListener;
|
|||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
public class SSLDroidGui extends Activity implements OnClickListener {
|
public class SSLDroidGui extends Activity implements OnClickListener {
|
||||||
private static final String TAG = "ServicesDemo";
|
private static final String TAG = "SSLDroidGui";
|
||||||
Button buttonStart, buttonStop;
|
Button buttonStart, buttonStop, showLog;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -1,20 +1,13 @@
|
|||||||
package hu.blint.ssldroid;
|
package hu.blint.ssldroid;
|
||||||
|
|
||||||
import java.net.*;
|
import java.io.FileWriter;
|
||||||
import java.io.*;
|
import java.io.IOException;
|
||||||
import java.security.KeyManagementException;
|
import java.io.PrintWriter;
|
||||||
import java.security.KeyStore;
|
import java.net.ServerSocket;
|
||||||
import java.security.KeyStoreException;
|
import java.sql.Timestamp;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.util.Date;
|
||||||
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;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a modified version of the TcpTunnelGui utility borrowed from the
|
* This is a modified version of the TcpTunnelGui utility borrowed from the
|
||||||
@ -25,13 +18,13 @@ public class TcpProxy {
|
|||||||
String tunnelHost;
|
String tunnelHost;
|
||||||
int tunnelPort;
|
int tunnelPort;
|
||||||
String keyFile, keyPass;
|
String keyFile, keyPass;
|
||||||
Relay inRelay, outRelay;
|
|
||||||
Thread server = null;
|
Thread server = null;
|
||||||
|
ServerSocket ss = null;
|
||||||
|
|
||||||
public TcpProxy() {
|
public TcpProxy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public TcpProxy(int listenPort, String tunnelHost, int tunnelPort,
|
/*public TcpProxy(int listenPort, String tunnelHost, int tunnelPort,
|
||||||
String keyFile, String keyPass) {
|
String keyFile, String keyPass) {
|
||||||
this.listenPort = listenPort;
|
this.listenPort = listenPort;
|
||||||
this.tunnelHost = tunnelHost;
|
this.tunnelHost = tunnelHost;
|
||||||
@ -59,168 +52,52 @@ public class TcpProxy {
|
|||||||
public String getKeyPass() {
|
public String getKeyPass() {
|
||||||
return keyPass;
|
return keyPass;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
private static SSLSocketFactory sslSocketFactory;
|
public void createNotification(String title, String text) {
|
||||||
|
|
||||||
public static final SSLSocketFactory getSocketFactory(String pkcsFile,
|
|
||||||
String pwd) {
|
|
||||||
if (sslSocketFactory == null) {
|
|
||||||
try {
|
try {
|
||||||
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");
|
FileWriter outFile = new FileWriter("/mnt/sdcard/ssldroid.txt");
|
||||||
KeyStore keyStore = KeyStore.getInstance("PKCS12");
|
PrintWriter out = new PrintWriter(outFile);
|
||||||
keyStore.load(new FileInputStream(pkcsFile), pwd.toCharArray());
|
Date date= new Date();
|
||||||
keyManagerFactory.init(keyStore, pwd.toCharArray());
|
|
||||||
SSLContext context = SSLContext.getInstance("TLS");
|
|
||||||
context.init(keyManagerFactory.getKeyManagers(), null,
|
|
||||||
new SecureRandom());
|
|
||||||
sslSocketFactory = (SSLSocketFactory) context
|
|
||||||
.getSocketFactory();
|
|
||||||
|
|
||||||
} catch (FileNotFoundException e) {
|
out.println(new Timestamp(date.getTime())+" "+title+" "+text);
|
||||||
Log.d("SSLDroid", "Error loading the client certificate file:"
|
out.close();
|
||||||
+ e.getMessage());
|
|
||||||
// Toast.makeText(none, "SSLDroid Sulyos Errorhiba" +
|
|
||||||
// e.getMessage(), Toast.LENGTH_LONG).show();
|
|
||||||
} catch (KeyManagementException e) {
|
|
||||||
Log
|
|
||||||
.d("SSLDroid", "No SSL algorithm support: "
|
|
||||||
+ e.getMessage());
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
Log.d("SSLDroid", "No common SSL algorithm found: "
|
|
||||||
+ e.getMessage());
|
|
||||||
} 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){
|
} catch (IOException e){
|
||||||
Log.d("SSLDroid", "Error loading the client certificate file:"
|
return;
|
||||||
+ 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,
|
public void serve(int listenPort, String tunnelHost, int tunnelPort,
|
||||||
String keyFile, String keyPass) throws IOException {
|
String keyFile, String keyPass) throws IOException {
|
||||||
final TcpProxy ttg = new TcpProxy(listenPort, tunnelHost, tunnelPort,
|
//final TcpProxy ttg = new TcpProxy(listenPort, tunnelHost, tunnelPort,keyFile, keyPass);
|
||||||
keyFile, keyPass);
|
|
||||||
|
|
||||||
// create the server thread
|
// create the server thread
|
||||||
server = new Thread() {
|
|
||||||
public void run() {
|
|
||||||
ServerSocket ss = null;
|
|
||||||
try {
|
try {
|
||||||
ss = new ServerSocket(ttg.getListenPort());
|
ss = new ServerSocket(listenPort);
|
||||||
Log.d("SSLDroid", "Listening for connections on port "
|
Log.d("SSLDroid", "Listening for connections on port "
|
||||||
+ ttg.getListenPort() + " ...");
|
+ listenPort + " ...");
|
||||||
|
//ttg.doLog("Listening for connections on port " + ttg.getListenPort() + " ...");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.d("SSLDroid", "Error setting up listening socket: "
|
Log.d("SSLDroid", "Error setting up listening socket: "
|
||||||
+ e.getMessage());
|
+ e.toString());
|
||||||
|
//createNotification(e.getMessage(), "Error setting up listening socket: "+e.toString());
|
||||||
//e.printStackTrace();
|
//e.printStackTrace();
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
while (true) {
|
server = new TcpProxyServerThread(ss, listenPort, tunnelHost, tunnelPort, keyFile, keyPass);
|
||||||
try {
|
|
||||||
// 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 failure: " + 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();
|
|
||||||
|
|
||||||
if (server.isInterrupted()) {
|
|
||||||
ss.close();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception ee) {
|
|
||||||
Log.d("SSLDroid", "Ouch: " + ee.getMessage());
|
|
||||||
// ee.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
if (server != null)
|
if (server != null){
|
||||||
|
try {
|
||||||
|
ss.close();
|
||||||
server.interrupt();
|
server.interrupt();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d("SSLDroid", "Interrupt failure: " + e.toString());
|
||||||
|
createNotification(e.getMessage(), "Ouch: "+e.toString());;
|
||||||
|
}
|
||||||
|
}
|
||||||
Log.d("SSLDroid", "Stopping service");
|
Log.d("SSLDroid", "Stopping service");
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|
||||||
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] = '#';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Thread.interrupted()) {
|
|
||||||
// We've been interrupted: no more serving.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (SocketException e) {
|
|
||||||
Log.d("SSLDroid", e.getMessage());
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.d("SSLDroid", e.getMessage());
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
in.close();
|
|
||||||
out.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.d("SSLDroid", e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.d("SSLDroid", "Quitting stream proxy...");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
224
src/hu/blint/ssldroid/TcpProxyServerThread.java
Normal file
224
src/hu/blint/ssldroid/TcpProxyServerThread.java
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
package hu.blint.ssldroid;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.net.SocketException;
|
||||||
|
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 java.sql.Timestamp;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.net.ssl.KeyManagerFactory;
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import javax.net.ssl.SSLSocket;
|
||||||
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class TcpProxyServerThread extends Thread {
|
||||||
|
|
||||||
|
int listenPort;
|
||||||
|
String tunnelHost;
|
||||||
|
int tunnelPort;
|
||||||
|
String keyFile, keyPass;
|
||||||
|
Relay inRelay, outRelay;
|
||||||
|
ServerSocket ss = null;
|
||||||
|
|
||||||
|
public TcpProxyServerThread(ServerSocket ss, 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;
|
||||||
|
this.ss = ss;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@Override
|
||||||
|
public static void yield(){
|
||||||
|
try {
|
||||||
|
ss.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("SSLDroid", "Error loading the client certificate file:" + e.toString());
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static SSLSocketFactory sslSocketFactory;
|
||||||
|
|
||||||
|
public final SSLSocketFactory getSocketFactory(String pkcsFile,
|
||||||
|
String pwd) {
|
||||||
|
if (sslSocketFactory == null) {
|
||||||
|
try {
|
||||||
|
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");
|
||||||
|
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.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "Error loading the client certificate file:" + e.toString() + "\n";
|
||||||
|
// Toast.makeText(none, "SSLDroid Sulyos Errorhiba" +
|
||||||
|
// e.toString(), Toast.LENGTH_LONG).show();
|
||||||
|
} catch (KeyManagementException e) {
|
||||||
|
Log.d("SSLDroid", "No SSL algorithm support: " + e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "No SSL algorithm support: " + e.toString() + "\n";
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
Log.d("SSLDroid", "No common SSL algorithm found: " + e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "No common SSL algorithm found: " + e.toString() + "\n";
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
Log.d("SSLDroid", "Error setting up keystore:" + e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "Error setting up keystore:" + e.toString() + "\n";
|
||||||
|
} catch (java.security.cert.CertificateException e) {
|
||||||
|
Log.d("SSLDroid", "Error loading the client certificate:"
|
||||||
|
+ e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "Error loading the client certificate:" + e.toString() + "\n";
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("SSLDroid", "Error loading the client certificate file:"
|
||||||
|
+ e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "Error loading the client certificate file:" + e.toString() + "\n";
|
||||||
|
} catch (UnrecoverableKeyException e) {
|
||||||
|
Log.d("SSLDroid", "Error loading the client certificate:"
|
||||||
|
+ e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
//log += "Error loading the client certificate:" + e.toString() + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sslSocketFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createNotification(String title, String text) {
|
||||||
|
try {
|
||||||
|
FileWriter outFile = new FileWriter("/mnt/sdcard/ssldroid.txt");
|
||||||
|
PrintWriter out = new PrintWriter(outFile);
|
||||||
|
Date date= new Date();
|
||||||
|
|
||||||
|
out.println(new Timestamp(date.getTime())+" "+title+" "+text);
|
||||||
|
out.close();
|
||||||
|
} catch (IOException e){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public 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) {
|
||||||
|
this.in = in;
|
||||||
|
this.out = out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
while ((n = in.read(buf)) > 0) {
|
||||||
|
if (Thread.interrupted()) {
|
||||||
|
// We've been interrupted: no more relaying
|
||||||
|
Log.d("SSLDroid", "Interrupted thread");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
out.write(buf, 0, n);
|
||||||
|
out.flush();
|
||||||
|
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (buf[i] == 7)
|
||||||
|
buf[i] = '#';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SocketException e) {
|
||||||
|
Log.d("SSLDroid", e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("SSLDroid", e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
in.close();
|
||||||
|
out.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.d("SSLDroid", e.toString());
|
||||||
|
createNotification(e.getMessage(), e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.d("SSLDroid", "Quitting stream proxy...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
if (isInterrupted()){
|
||||||
|
Log.d("SSLDroid", "Interrupted server thread, closing sockets...");
|
||||||
|
ss.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// accept the connection from my client
|
||||||
|
Socket sc = null;
|
||||||
|
try {
|
||||||
|
sc = ss.accept();
|
||||||
|
} catch (SocketException e){
|
||||||
|
Log.d("SSLDroid", "Accept failure: " + e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Socket st = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
st = (SSLSocket) getSocketFactory(keyFile, keyPass).createSocket(tunnelHost, tunnelPort);
|
||||||
|
((SSLSocket) st).startHandshake();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d("SSLDroid", "SSL failure: " + e.toString());
|
||||||
|
//createNotification(e.getMessage(), "SSL failure: "+e.toString());
|
||||||
|
Thread.sleep(10000);
|
||||||
|
continue;
|
||||||
|
//st = new Socket(ttg.getTunnelHost(), ttg.getTunnelPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d("SSLDroid", "Tunnelling port "
|
||||||
|
+ listenPort + " to port "
|
||||||
|
+ tunnelPort + " on host "
|
||||||
|
+ tunnelHost + " ...");
|
||||||
|
|
||||||
|
// relay the stuff thru
|
||||||
|
Thread fromBrowserToServer = new Relay(
|
||||||
|
sc.getInputStream(), st.getOutputStream());
|
||||||
|
Thread fromServerToBrowser = new Relay(
|
||||||
|
st.getInputStream(), sc.getOutputStream());
|
||||||
|
|
||||||
|
fromBrowserToServer.start();
|
||||||
|
fromServerToBrowser.start();
|
||||||
|
|
||||||
|
} catch (Exception ee) {
|
||||||
|
Log.d("SSLDroid", "Ouch: " + ee.toString());
|
||||||
|
createNotification(ee.getMessage(), "Ouch: "+ee.toString());
|
||||||
|
//ttg.doLog("Ouch: " + ee.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user