Packet Capture v1.4.7版本的 MD5 值为:edce2fbbf748df1d1d0ca3d6f00c9bc3

以下内容为反编译后的 MyVpnService.java 源代码,内容仅作参考


package app.greyshirts.firewall.app;

import android.content.Intent;
import android.net.VpnService;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import android.widget.Toast;
import app.greyshirts.firewall.app.debuglog.PersistentLog;
import app.greyshirts.firewall.proxy.ProxyWorker;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;

public class MyVpnService extends VpnService implements Runnable {
    private Handler handler = null;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        PersistentLog.getInstance(this).i("VpnService: onStartCommand intent=" + (intent != null ? intent.toString() : "(null)") + " flags=" + flags, new Object[0]);
        Log.i("NRFW", "VpnService onStartCommand intent=" + (intent != null ? intent.toString() : "(null)") + " flags=" + flags);
        if (intent == null) {
            Toast.makeText(this, "Service restarted", 0).show();
            Log.i("NRFW", "service restarted");
            PersistentLog.getInstance(this).i("VpnService: intent=null. that means server is restarted automatically. Send STARTVPN command myself", new Object[0]);
            Answers.getInstance().logCustom(new CustomEvent("service restarted"));
            intent = new Intent();
            intent.putExtra("cmd", 1);
        }
        int cmd2 = intent.getIntExtra("cmd", -1);
        switch (cmd2) {
            case 1:
                PersistentLog.getInstance(this).i("VpnService: CMD_STARTVPN", new Object[0]);
                this.handler = new Handler();
                new VpnStartThread(this).start();
                return 1;
            case 2:
                PersistentLog.getInstance(this).i("VpnService: CMD_STOPVPN", new Object[0]);
                stopVpn();
                PersistentLog.getInstance(this).i("VpnService: call stopSelf()", new Object[0]);
                stopSelf();
                return 1;
            default:
                Answers.getInstance().logCustom(new CustomEvent("unkonwn service cmd").putCustomAttribute("flags", Integer.valueOf(flags)).putCustomAttribute("startId", Integer.valueOf(startId)).putCustomAttribute("intent", intent.toString()));
                return 1;
        }
    }

    @Override
    public void run() {
        setupVpn();
        Log.i("NRFW", "thread end");
    }

    private void setupVpn() {
        PersistentLog.getInstance(this).i("VpnService: try to setup VPN.", new Object[0]);
        VpnService.Builder builder = new VpnService.Builder(this);
        builder.setSession("firewall");
        builder.addAddress("10.0.8.1", 32);
        builder.addRoute("0.0.0.0", 0);
        try {
            ParcelFileDescriptor pfd = builder.establish();
            if (pfd == null) {
                PersistentLog.getInstance(this).i("VpnService: builder.establish() failed. pfd==null", new Object[0]);
                if (this.handler != null) {
                    this.handler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MyVpnService.this, "Cannot establish VPN (app not prepared)", 1).show();
                        }
                    });
                    return;
                }
                return;
            }
            PersistentLog.getInstance(this).i("VpnService: call ProxyWorker.start()", new Object[0]);
            ProxyWorker.getInstance().start(this, pfd);
        } catch (IllegalStateException e) {
            PersistentLog.getInstance(this).i("VpnService: builder.establish() failed. e=" + e.toString(), new Object[0]);
            if (this.handler != null) {
                this.handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MyVpnService.this, "Cannot establish VPN (" + e.toString() + ")", 1).show();
                    }
                });
            }
        }
    }

    private void stopVpn() {
        PersistentLog.getInstance(this).i("VpnService: call ProxyWorker.stop()", new Object[0]);
        ProxyWorker.getInstance().stop();
    }

    @Override
    public void onRevoke() {
        Log.i("NRFW", "VpnService: onRevoke() called. ");
        PersistentLog.getInstance(this).i("VpnService: onRevoke() called", new Object[0]);
        stopVpn();
        PersistentLog.getInstance(this).i("VpnService: call stopSelf()", new Object[0]);
        stopSelf();
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        PersistentLog.getInstance(this).i("VpnService: onTrimMemory() called. level=%d", Integer.valueOf(level));
    }

    @Override
    public void onDestroy() {
        Log.i("NRFW", "VpnService onDestroy() called");
        PersistentLog.getInstance(this).i("VpnService: onDestroy() called", new Object[0]);
    }

    class VpnStartThread extends Thread {
        public VpnStartThread(Runnable runnable) {
            super(runnable, "vpnservice");
            MyVpnService.this.handler = new Handler();
        }
    }
}