Pereiti prie turinio

Imituoti VPN'ą. Android


Rekomenduojami pranešimai

Sveiki,

 

Bandau įgyvendinti vieną projektą ir man tam reikia sukurti Virtualų privatų tinklą, tačiau tokį, kuris realaus susijungimo su serveriu nedaro. To pasekoje galėčiau stebėti interneto srautą ir atitinkamai kažką praleisti, kažką blokuoti.

 

Esamoje stadijoje susidūriau su problema ir nežinau kaip teisingai reikėtų judėti toliau, konkrečiai - padaryti, kad susijungimas su tinklapiais/aplikacijomis įvyktų.

 

Šiuo metu pagaunu paketus, kuriuos iššifravus gaunu panašią informaciją:

IP Version:4

Header Length:20

Total Length:60

Protocol:6

Source IP:36.36.36.36 (Dar nepataisytas formatas)

Destination IP:5.20.5.59

Hostname:clients4.google.com

 

Man reiktų sužinoti, kaip gavus tarkim tokius duomenis kaip IP, serverio adresą ar hostname'ą, portą (Nesu tikras, kad teisingą gaunu) padaryti taip, kad užkrautų tiek tinklapius, tiek aplikacijas. Kaip viskas turėtų vykti.

 

Šiek tiek informacijos esu radęs, tik taip pat nežinau ar ji yra teisinga:

 

reikia interneto srauto gautus paketus iššifruoti, išmesti headerį (Tiksliai dar neišsiaiškinau kurį ar nuo kurios vietos būtent), išsiųsti paketą per naują Socket susijungimą gautu adresu ir gavus atsaką, perkonstruoti atitinkamai paketą ir įdėti į išvedimo srautą.

 

Pridedu ir kodo šiek tiek, kad būtų aiškiau kaip kas vyksta.

 

   private static final String TAG = "VpnService";

   private String mServerAddress = "127.0.0.1";
   private int mServerPort = 55555;

   private Handler mHandler;
   private Thread mThread;

   private ParcelFileDescriptor mInterface;

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       if (mHandler == null) {
           mHandler = new Handler(this);
       }

       if (mThread != null) {
           mThread.interrupt();
       }
       mThread = new Thread(this, "VpnThread");
       mThread.start();
       return START_STICKY;
   }

   @Override
   public void onDestroy() {
       if (mThread != null) {
           mThread.interrupt();
       }
       super.onDestroy();
   }

   @Override
   public boolean handleMessage(Message message) {
       if (message != null) {
           Toast.makeText(this, (String) message.obj, Toast.LENGTH_SHORT).show();
       }
       return true;
   }

   @Override
   public synchronized void run() {
       try {
           Log.i(TAG, "Starting");
           InetSocketAddress server = new InetSocketAddress(mServerAddress, mServerPort);
           run(server);

       } catch (Exception e) {
           Log.e(TAG, "Got " + e.toString());
           try {
               mInterface.close();
           } catch (Exception e2) {  }
           Message msgObj = mHandler.obtainMessage();
           msgObj.obj = "Disconnected";
           mHandler.sendMessage(msgObj);

       } finally {

       }
   }

   DatagramChannel mTunnel = null;


   protected boolean run(InetSocketAddress server) throws Exception {
       boolean connected = false;

       mTunnel = DatagramChannel.open();

       if (!protect(mTunnel.socket())) {
           throw new IllegalStateException("Cannot protect the tunnel");
       }

       mTunnel.connect(server);

       mTunnel.configureBlocking(false);
       handshake();

       connected = true;
       Message msgObj = mHandler.obtainMessage();
       msgObj.obj = "Connected";
       mHandler.sendMessage(msgObj);



       new Thread ()
       {

           public void run ()
           {
               FileInputStream in = new FileInputStream(mInterface.getFileDescriptor());
               ByteBuffer packet = ByteBuffer.allocate(32767);

               DatagramChannel tunnel = mTunnel;
               FileOutputStream out = new FileOutputStream(mInterface.getFileDescriptor());
               int length;
               String destIP;

               try
               {

                   while (true)
                   {
                       while ((length = in.read(packet.array())) > 0) {
                           packet.limit(length);
                           Log.d(TAG, "Total Length:" + mTunnel.socket().getInetAddress());

                           mTunnel.write(packet);
                           packet.flip();
                           TCP_IP TCP_debug = new TCP_IP(packet);
                           TCP_debug.debug();
                           destIP = TCP_debug.getDestination();

                           mServerAddress = destIP;
                           mServerPort = TCP_debug.getPort();
                           //InetAddress address = InetAddress.getByName(destIP);
                         //  System.out.println(address.getHostAddress()); // Gaunamas IP (185.11.24.36)
                         //  System.out.println(address.getHostName()); // www.15min.lt
                          // Socket conn = new Socket(address.getHostName(), TCP_debug.getPort());

                           out.write(packet.array(), 0, length);
                           packet.clear();

                           Thread.sleep(100);

                       }
                   }

               }
               catch (IOException e)
               {
                   e.printStackTrace();
               } catch (Exception e) {
                   e.printStackTrace();
               }

           }

       }.start();


       return connected;
   }

   private void makeConnection(String destination, int port) {
       try {
           run(new InetSocketAddress(destination, port));
       }
       catch (Exception e) {
           Log.d(TAG, "klaida jungiantis");
       }
   }


   private void handshake() throws Exception {

       if (mInterface == null)
       {
           Builder builder = new Builder();

           //builder.setMtu(1500);
           //builder.addAddress("10.0.2.0", 32);
          // builder.addRoute("0.0.0.0", 0);
            builder.addAddress("192.168.0.1", 24);
            builder.addDnsServer("8.8.8.8");
            builder.addRoute("0.0.0.0", 0);

           try {
               mInterface.close();
           } catch (Exception e) {
               // ignore
           }

           mInterface = builder.setSession("VPN'as").establish();
       }
   }

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...