Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Adalher en Septiembre 01, 2019, 12:32:16 PM

Título: AIDE - Capturar las conecciones salientes
Publicado por: Adalher en Septiembre 01, 2019, 12:32:16 PM
Hola a todos,

¿cómo puedo capturar las conecciones salientes de mi navegador en Android con Java? Osea, ¿cómo puedo bloquear una página web en Android con Java?


Gracias y saludos
Título: Re:AIDE - Capturar las conecciones salientes
Publicado por: grep en Septiembre 01, 2019, 10:23:06 PM
Hola,

Creo que lograr eso de bloquear el acceso a ciertos dominios o páginas es posible, pero la solución NO se puede lograr con pocas líneas de código, suponiendo que el objetivo es hacer una app que intercepte el tráfico en un Android sin rootear. Por eso, creo que usar una app como AIDE para desarrollar aplicaciones es impractico, yo preferiría hacerlo desde una computadora.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
¿cómo puedo capturar las conecciones salientes de mi navegador en Android con Java?
Entendiendo que deseas hacer eso desde otra aplicación funcionando en el mismo sistema Android, tengo entendido que una aplicación puede tomar el control del tráfico entrante y saliente creando un servicio VPN el cual por defecto captura el tráfico de todas las aplicaciones. A continuación te dejo enlaces que explican como crear un servicio VPN y algunas apps de ejemplo.

Android VPN Developers Guide
https://developer.android.com/guide/topics/connectivity/vpn
VpnService
https://developer.android.com/reference/android/net/VpnService
Sample app: ToyVpn (from offical Android samples)
https://android.googlesource.com/platform/development/+/master/samples/ToyVpn
Sample app: LocalVPN
https://github.com/hexene/LocalVPN
Full sample app: NetGuard
https://github.com/M66B/NetGuard



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
¿cómo puedo bloquear una página web en Android con Java?
Una vez que logres interceptar el tráfico que pasa por la interfaz VPN (aqui tengo entendido que este será todos los headers y el payload de la capa IP), supongo que podrías parsear el contenido con las apis de java y determinar que respuesta devolver, la original o una creada por vos.

Espero que esto pueda servirte para orientarte un poco, no puedo dar códigos de ejemplo porque nunca antes indagué en el tema.

Saludos
Título: Re:AIDE - Capturar las conecciones salientes
Publicado por: Adalher en Septiembre 04, 2019, 07:59:54 AM
Hola grep,

Citar
Por eso, creo que usar una app como AIDE para desarrollar aplicaciones es impractico, yo preferiría hacerlo desde una computadora.
Tienes razón. Lo que pasa es que mi Network no cumple con los requisitos para instalar Android Studio. Es por eso que lo hago con AIDE.

Tengo una pregunta con respecto a este código:
Código (java) [Seleccionar]

package com.mycompany.myapp2;

import android.app.*;
import android.os.*;

import android.net.VpnService;

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

run();
    }

public void run() {
VpnService.prepare(MainActivity.this);
VpnService.Builder builder = new VpnService.Builder();

// Create a local TUN interface using predetermined addresses. In your app,
// you typically use values returned from the VPN gateway during handshaking.
ParcelFileDescriptor localTunnel = builder
.addAddress("192.168.2.2", 24)
.addRoute("0.0.0.0", 0)
.addDnsServer("192.168.1.1")
.establish();
}
}


AIDE me larga el siguiente error: A reference to an enclosing class is required.

No lo entiendo. Que tengo que hacer para solucionar este problema?


Gracias y saludos
Título: Re:AIDE - Capturar las conecciones salientes
Publicado por: grep en Septiembre 04, 2019, 03:12:48 PM
Esto tiene que ver con el lenguaje en sí.

La clase "VpnService" tiene una clase interna, no static, llamada "Builder". El hecho de que esta clase interna no sea static impide que la misma pueda ser intanciada de la manera en la que intentas hacerlo.

Existen dos formas de instanciar la clase "Builder", y las dos requieren de una instancia de VpnService o una instancia de una clase que la extienda.

1) Crear una clase que extienda "VpnService" e intanciar "Builder" dentro de la misma:

Código (java) [Seleccionar]

import android.net.VpnService;

public class MyVpnService extends VpnService {
    ...

    public Builder getBuilder() {
        Builder builder = new Builder();
        // or VpnService.Builder builder = new VpnService.Builder();
        ...
    }
   
    ...
}



2) Usar una instancia ya creada de "VpnService" y a partir de la misma crear una instancia de "Builder":

Código (java) [Seleccionar]

import android.net.VpnService;

public class Config {
    ...

    public VpnService.Builder getBuilderOfVpnService(VpnService service) {
        VpnService.Builder builder = service.new Builder();
    }

    ...
}



Ahora me translado al entorno de la aplicación Android en si. Para poder usar VpnService es obligatorio crear una clase que la extienda (como lo hice en el primer ejemplo), esta clase sera el servicio que tienes que poner a funcionar. La documentatión misma lo dice:

Citar
To add a VPN service to your app, create an Android service inheriting from VpnService.

puedes observar la app de ejemplo de google para orientarte un poco:
https://android.googlesource.com/platform/development/+/master/samples/ToyVpn

Espero que esto pueda servirte.

Saludos
Título: Re:AIDE - Capturar las conecciones salientes
Publicado por: Adalher en Septiembre 07, 2019, 09:38:27 AM
Hola grep,

1) La primera manera en que instancias Builder... es necesario el método de tipo Builder?

2) Para poder interceptar el tráfico saliente tengo que llamar al método establish de la clase Builder cada vez que lo quiero hacer? Y luego tengo que leer de alguna forma el dato de tipo ParcelFileDescriptor que este método retorna?

La app de ejemplo de google, aparte de poder tener unos fallos al ser ejecutada, creo que tiene más bien el fin de ser conectada a un servicio de VPN real que interceptar el tráfico.


Gracias y saludos
Título: Re:AIDE - Capturar las conecciones salientes
Publicado por: grep en Septiembre 07, 2019, 03:51:44 PM
Hola Adalher,

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
1) La primera manera en que instancias Builder... es necesario el método de tipo Builder?
Te refieres a  "getBuilder()"?, no es necesario, solo quería señalar que la única forma de obtener una instancia de Builder de la forma "new Builder()" es si esto se hace dentro de una clase que extienda a VpnService.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
2) Para poder interceptar el tráfico saliente tengo que llamar al método establish de la clase Builder cada vez que lo quiero hacer? ...
La guia dice:
Citar
Call VpnService.Builder.establish() so that the system establishes the local TUN interface and begins routing traffic through the interface.
La respuesta es no, al invocar establish, la interfaz es creada y la misma interceptará el tráfico. No tienes que  llamarla más de una vez.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
... Y luego tengo que leer de alguna forma el dato de tipo ParcelFileDescriptor que este método retorna?
si, la instancia de tipo ParcelFileDescriptor devuelta por establish la debes usar para leer y escribir los paquetes IP al buffer de esta interfaz de red creada con establish.

puedes observar esta clase en el proyecto LocalVPN para ver como es usada la instancia de ParcelFileDescriptor:
https://github.com/hexene/LocalVPN/blob/master/app/src/main/java/xyz/hexene/localvpn/LocalVPNService.java



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
La app de ejemplo de google, aparte de poder tener unos fallos al ser ejecutada, creo que tiene más bien el fin de ser conectada a un servicio de VPN real que interceptar el tráfico.
Solo para aclarar algo, ese "servicio de VPN" en la guía lo conocen como "VPN gateway". Aunque un poco más complejo, puedes ver este proyecto que no usa ningun VPN gateway y lo único que hace es reenviar los paquetes:
https://github.com/hexene/LocalVPN

Saludos
Título: Re:AIDE - Capturar las conecciones salientes
Publicado por: Adalher en Septiembre 08, 2019, 10:01:56 AM
Hola grep,

muchas gracias por tu ayuda. Esta vez no la merecía.


Gracias y saludos