AIDE - Capturar las conecciones salientes

Iniciado por Adalher, Septiembre 01, 2019, 12:32:16 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

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
Este es el mayor reproche al pueblo hispanohablante:

Que a pesar de su inteligencia y a pesar de su valentía siempre adoran el poder.

Septiembre 01, 2019, 10:23:06 PM #1 Ultima modificación: Septiembre 01, 2019, 10:25:45 PM por grep
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
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
VpnService
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Sample app: ToyVpn (from offical Android samples)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Sample app: LocalVPN
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Full sample app: NetGuard
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



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

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

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
Este es el mayor reproche al pueblo hispanohablante:

Que a pesar de su inteligencia y a pesar de su valentía siempre adoran el poder.

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

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

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:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Espero que esto pueda servirte.

Saludos

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
Este es el mayor reproche al pueblo hispanohablante:

Que a pesar de su inteligencia y a pesar de su valentía siempre adoran el poder.

Septiembre 07, 2019, 03:51:44 PM #5 Ultima modificación: Septiembre 07, 2019, 03:53:26 PM por grep
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:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



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:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos

Hola grep,

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


Gracias y saludos
Este es el mayor reproche al pueblo hispanohablante:

Que a pesar de su inteligencia y a pesar de su valentía siempre adoran el poder.