- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已经寻找了几个小时的答案,但我无法弄清楚。请帮忙。
我想做的是使用Android中的VpnService来抓取像应用程序tPacketCapture这样的网络数据包
我首先使用来自谷歌的 ToyVpn 示例代码并对其进行修改,因此我不会将数据发送到服务器。但是,我不确定这是否正确。
我的配置方法在调用建立() 之前使用binder.addAddress() 的wlan ip 地址。我使用的是nexus 7,我使用“adb shell netcfg | grep wlan0”来获取地址:
wlan0 UP 192.168.0.6/24 0x00001043 10:bf:48:bf:5f:9d
并将其添加到我的方法中:
private void configure() throws Exception {
// If the old interface has exactly the same parameters, use it!
if (mInterface != null) {
Log.i(TAG, "Using the previous interface");
return;
}
// Configure a builder while parsing the parameters.
Builder builder = new Builder();
builder.setMtu(1500);
builder.addAddress("192.168.0.6", 24);
try {
mInterface.close();
} catch (Exception e) {
// ignore
}
mInterface = builder.establish();
}
调用它之后,我调用我修改的 run 方法来传递一个字符串而不是一个 InetSocketAddress,这并不重要,因为我没有在任何地方使用它:
private void run(String run) throws Exception {
configure();
FileInputStream in = new FileInputStream(mInterface.getFileDescriptor());
// Allocate the buffer for a single packet.
ByteBuffer packet = ByteBuffer.allocate(32767);
// We use a timer to determine the status of the tunnel. It
// works on both sides. A positive value means sending, and
// any other means receiving. We start with receiving.
int timer = 0;
// We keep forwarding packets till something goes wrong.
while (true) {
// Assume that we did not make any progress in this iteration.
boolean idle = true;
// Read the outgoing packet from the input stream.
int length = in.read(packet.array());
if (length > 0) {
Log.i(TAG,"************new packet");
while (packet.hasRemaining()) {
Log.i(TAG,""+packet.get());
//System.out.print((char) packet.get());
}
// Write the outgoing packet to the tunnel.
packet.limit(length);
// tunnel.write(packet);
packet.clear();
// There might be more outgoing packets.
idle = false;
// If we were receiving, switch to sending.
if (timer < 1) {
timer = 1;
}
}
}
}
当我执行 adb logcat 时,什么也没有发生。我这样做对吗?我觉得我错过了什么。
谢谢!
编辑:
从日志中我看到以下几行:
I/ActivityManager( 460): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.android.toyvpn/.ToyVpnClient} from pid 10247
I/ActivityManager( 460): Start proc com.example.android.toyvpn for activity com.example.android.toyvpn/.ToyVpnClient: pid=10287 uid=10122 gids={50122, 3003, 1028}
I/ActivityManager( 460): Displayed com.example.android.toyvpn/.ToyVpnClient: +1s144ms
I/Vpn ( 460): Switched from [Legacy VPN] to com.example.android.toyvpn
D/Vpn ( 460): setting state=IDLE, reason=prepare
I/ToyVpnService(10287): running vpnService
D/Vpn ( 460): setting state=CONNECTING, reason=establish
D/VpnJni ( 460): Address added on tun0: 192.168.0.6/24
I/Vpn ( 460): Established by com.example.android.toyvpn.ToyVpnService on tun0
W/ContextImpl( 460): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1406 com.android.server.connectivity.Vpn.establish:289 com.android.server.ConnectivityService.establishVpn:3263 android.net.IConnectivityManager$Stub.onTransact:504 android.os.Binder.execTransact:351
D/Vpn ( 460): setting state=AUTHENTICATING, reason=establish
所以它似乎正在连接。
完整来源:
public class ToyVpnService extends VpnService implements Handler.Callback, Runnable {
private static final String TAG = "ToyVpnService";
private Handler mHandler;
private Thread mThread;
private ParcelFileDescriptor mInterface;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// The handler is only used to show messages.
if (mHandler == null) {
mHandler = new Handler(this);
}
// Stop the previous session by interrupting the thread.
if (mThread != null) {
mThread.interrupt();
}
// Start a new session by creating a new thread.
mThread = new Thread(this, "ToyVpnThread");
mThread.start();
return START_STICKY;
}
@Override
public void onDestroy() {
if (mThread != null) {
mThread.interrupt();
}
}
@Override
public boolean handleMessage(Message message) {
if (message != null) {
Toast.makeText(this, message.what, Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
public synchronized void run() {
Log.i(TAG,"running vpnService");
try {
runVpnConnection();
} catch (Exception e) {
e.printStackTrace();
//Log.e(TAG, "Got " + e.toString());
} finally {
try {
mInterface.close();
} catch (Exception e) {
// ignore
}
mInterface = null;
mHandler.sendEmptyMessage(R.string.disconnected);
Log.i(TAG, "Exiting");
}
}
private boolean runVpnConnection() throws Exception {
configure();
FileInputStream in = new FileInputStream(mInterface.getFileDescriptor());
// Allocate the buffer for a single packet.
ByteBuffer packet = ByteBuffer.allocate(32767);
// We keep forwarding packets till something goes wrong.
while (true) {
// Assume that we did not make any progress in this iteration.
boolean idle = true;
// Read the outgoing packet from the input stream.
int length = in.read(packet.array());
if (length > 0) {
Log.i(TAG,"************new packet");
System.exit(-1);
while (packet.hasRemaining()) {
Log.i(TAG,""+packet.get());
//System.out.print((char) packet.get());
}
packet.limit(length);
// tunnel.write(packet);
packet.clear();
// There might be more outgoing packets.
idle = false;
}
Thread.sleep(50);
}
}
public String getLocalIpAddress()
{
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
Log.i(TAG,"****** INET ADDRESS ******");
Log.i(TAG,"address: "+inetAddress.getHostAddress());
Log.i(TAG,"hostname: "+inetAddress.getHostName());
Log.i(TAG,"address.toString(): "+inetAddress.getHostAddress().toString());
if (!inetAddress.isLoopbackAddress()) {
//IPAddresses.setText(inetAddress.getHostAddress().toString());
Log.i(TAG,"IS NOT LOOPBACK ADDRESS: "+inetAddress.getHostAddress().toString());
return inetAddress.getHostAddress().toString();
} else{
Log.i(TAG,"It is a loopback address");
}
}
}
} catch (SocketException ex) {
String LOG_TAG = null;
Log.e(LOG_TAG, ex.toString());
}
return null;
}
private void configure() throws Exception {
// If the old interface has exactly the same parameters, use it!
if (mInterface != null) {
Log.i(TAG, "Using the previous interface");
return;
}
// Configure a builder while parsing the parameters.
Builder builder = new Builder();
builder.setMtu(1500);
builder.addAddress("192.168.0.6", 24);
try {
mInterface.close();
} catch (Exception e) {
// ignore
}
mInterface = builder.establish();
}
}
最佳答案
好的,这并不容易,但我想出了如何捕获数据包。由于我对网络不是很熟悉(但这项新工作要求我熟悉),所以我很难正确设置所有内容。基本上在 VpnService.builder 中设置了正确的路由后,我就可以正确接收数据包了。
所以:
builder.addAddress("192.168.0.6", 24); // was wrong, you need to put an internal IP (10.0.2.0 for example)
和
builder.addRoute("0.0.0.0", 0); // needs to be this.
您无需通过 builder.addDnsServer() 设置 DnsServer 即可使其工作。希望这对任何人都有帮助!
关于Android VpnService 抓包不会抓包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17766405/
我有两个使用 VpnService 类的应用程序。但同一时间只能运行一个 VPN 连接。创建新接口(interface)时,现有接口(interface)将被停用,我希望新应用程序不要启动 vpnse
我有两个关于 VpnService.Builder 的问题类。 假设我知道一个 App 与其服务器 www.somedomain.com 通信,我知道服务器的 IP 地址是 210.32.204.16
我正在尝试使用 Android4.x VPN 服务与内部以太网服务器建立 VPN 隧道。IP 地址是 Internet 上的全局 ip。现在问题是: 1.我使用TCP dump抓包,VPN Servi
我正在创建基于 ToyVPN 的应用程序来捕获 tcp/udp 数据包。在我的应用程序中收到传出数据包后,我想将它们转发到原始目的地。我已经设法从 header 中获取目标 ip 和端口,但我不知道如
我已经关注了这个 link并使用 VpnService 创建了 Vpn 接口(interface)。将转发路由添加为“0.0.0.0”后,所有互联网流量都会转发到 Vpn 接口(interface)。
我已经寻找了几个小时的答案,但我无法弄清楚。请帮忙。 我想做的是使用Android中的VpnService来抓取像应用程序tPacketCapture这样的网络数据包 我首先使用来自谷歌的 ToyVp
我正在浏览 ToyVpn 项目中的 VpnService.java。 我最初在运行方法中看到以下几行 // Create a DatagramChannel as the VPN tunnel.
我知道 VpnService 是一个服务,并且 stopSelf() 可以停止服务本身(至少在调用 onDestroy() 之后似乎是这样)。 问题是当我在我的服务实例中调用 stopSelf() 时
我正在使用 [VpnService] ( http://developer.android.com/reference/android/net/VpnService.html )!并能够创建 VPN
我正在尝试使用来自 android 的 VpnService 在客户端和接收端设置一个简单的 tun 设备,我有一个正在运行的 C++ 服务器。 我在使用 VpnService 时遇到了很多问题。这就
我正在考虑使用新的android (4.0) VpnService 接口(interface)来实现简单的数据包捕获和分析的可能性。有谁知道是否可以获取您在 VpnService 实现中收到的数据包并
我正在探索 Android 的 VpnService 的功能。目前,我已经通过在用户空间中重建 IP 堆栈来构建一个非常基本的请求转发器:我从 VpnService 的输入流中读取 IP 数据包,解析
我想使用 android 的 VpnService 来捕获数据包并根据 IP 地址过滤它们。我可以很好地从“tun”接口(interface)获取数据包,但在那之后我不确定如何将它们转发到它们的原始目
我的应用程序实现 VpnService 来拦截网络流量并提供定制的响应。目标是处理到特定地址的流量,并丢弃其他请求。 目前,我已成功解析传入请求以及构建和发送响应。然而,问题是这些响应并不是作为对原始
我正在考虑使用新的android (4.0) VpnService 接口(interface)来实现简单的数据包捕获和分析的可能性。有谁知道是否可以获取您在 VpnService 实现中收到的数据包并
希望你们一切都好。 我在我的应用程序中实现了 VPNService。我引用了https://github.com/hexene/LocalVPN用于创建 VPN 的 github 代码。 我想知道请求
根据官方文档: Add a network address to the VPN interface. Both IPv4 and IPv6 addresses are supported. At l
我正在将 UDP 数据包写入 Android 中的 VpnService 实例,但我间歇性地收到如下错误: java.io.IOException: write failed: ENOBUFS (No
我在 kiosk 模式下使用 android 平板电脑,其中只允许一个应用程序。而且我也用3G网络。为了节省流量,我在每个使用 VpnService android API 的应用程序上都使用了特殊的
我正在我的 Activity 中启动一个 VPNService,我想在服务启动后启动一些线程。这就是我启动服务的方式: Intent intent = VpnService.prepare(getAc
我是一名优秀的程序员,十分优秀!