Android VpnService抓包不会抓包

2023-12-06

我已经寻找答案几个小时了,但我无法弄清楚。请帮忙。

我想做的是使用Android中的VpnService像应用程序一样抓取网络数据包数据包捕获

我首先使用 google 的 ToyVpn 示例代码并对其进行修改,这样我就不会将数据发送到服务器。但是,我不确定这是否正确。

我的配置方法在调用建立()之前使用binder.addAddress()的wlan ip地址。我使用的是 Nexus 7,我使用“adb shell netcfg | grep wlan0”来获取地址:

wlan0 上 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 方法,我修改该方法以传递 String 而不是 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 时,什么也没有发生。我的做法正确吗?我觉得我失去了一些东西。

谢谢你!

EDIT:

从日志中我看到以下几行:

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 中设置正确的路由后,我可以正确接收数据包。

So:

builder.addAddress("192.168.0.6", 24); // was wrong, you need to put an internal IP (10.0.2.0 for example)

and

builder.addRoute("0.0.0.0", 0); // needs to be this.

您不需要通过 builder.addDnsServer() 设置 DnsServer 即可使其工作。希望这对任何人都有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android VpnService抓包不会抓包 的相关文章

  • Gradle 构建错误:内存不足

    当我使用 gradle 构建时 它失败并显示以下信息 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x0000000788800000 89128960 0 failed e
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 如何在 Android TextView 中使用土耳其语字符,如“ş ç ı ö”?

    我想在 android TextView 中写入 ile 但它没有正确绘制 怎样才能使用这样的字符呢 例如 我将文本视图设置为 ile 它显示为 ile 我怎样才能解决这个问题 尝试以下方法 看看是否有帮助 source http grou
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • Android 版 jTwitter 授权错误

    我在我的 Android 应用程序中使用 jTwitter 库 直到前天一切都运转良好 但今天遇到异常 服务提供商响应错误 301 请帮助我 这是堆栈跟踪 02 21 21 07 27 258 E AndroidRuntime 4013 F
  • 使用 Android Firebase 堆栈推送通知

    我开发了使用 Firebase 接收推送通知的 Android 应用程序 我的代码基于 Firebase Google 官方文档 https firebase google com docs cloud messaging android
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • 来自相机的 MediaCodec 视频流方向和颜色错误

    我正在尝试流式传输视频捕获直接从相机适用于 Android 设备 到目前为止 我已经能够从 Android 相机捕获每一帧预览帧 byte data Camera camera 函数 对数据进行编码 然后成功解码数据并显示到表面 我用的是安
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • 在 Nougat 7.1.1 中点击应用程序快捷方式时出现应用程序未安装错误

    我在向现有应用程序添加静态应用程序快捷方式时遇到一些问题 我按照以下步骤操作https developer android com guide topics ui shortcuts html https developer android
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • 在 Android 手机中通过耳机插孔发送数据

    我目前正在处理一个新项目 我必须通过具有特定电压的耳机插孔发送数据 然后我可以在该电压上工作 所以这里我需要根据我的数据来编程具体电压 我是否可以在android中访问耳机的输出电压 然后创建一个应用程序来控制该电压 这是一篇讨论此问题的
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码
  • 如何正确编写AttributeSet的XML?

    我想创建一个面板适用于 Android 平台的其他小部件 http code google com p android misc widgets 在运行时 XmlPullParser parser getResources getXml R
  • R.java是手动修改的!恢复到生成的版本

    我在布局中添加了一个 xml 文件 之后这个错误就来了 但问题是我还没有接触过 R java 文件 现在 在我的新活动中 我要将其内容视图设置为我新创建的 xml 文件 但是当我执行 R layout 时 新创建的 xml 不会出现在建议中

随机推荐

  • 从具有重复元素的数组中随机找到一个组合,并且其总和等于 n

    如何从一个随机数中找到一个组合array具有重复元素且其总和相等n Example array is 1 2 2 3 and n is 3 答案是1 2 1 2 3 If randomSubsetSum array n 是解 那么rando
  • PyQt5 找不到已安装的 Qt5 库

    On Ubuntu 16 0 4 我正在尝试跑步这个 PyQt5 脚本 我有分布式包Qt5 via apt and PyQt5 via pip3 已安装 Error sudo video qt py 回溯 最近一次调用最后一次 文件 vid
  • 从互联网访问本地主机[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我需要在短时间内转发我的本地主机以进行测试 必须从公共互联网访问它 我怎样才能实现这个目标 有一些很好的免费服务可以让您做同样的事情 非常适合在开发 测试期间快速显示某些内容 htt
  • 使用Java进行RSA加密/解密

    我正在编写一个简单的程序 使用 Java 中的 RSA 算法进行加密 解密 我创建一个密码对象如下 Create a Cipher object Cipher rsaCipher Cipher getInstance RSA ECB NoP
  • JS:Promise 没有返回值

    我需要获取异步函数的值 我尝试使用 Promise 但这不起作用 const res new Promise function resolve reject gm readStream size bufferStream true func
  • 为什么 API 调用需要 80 毫秒的延迟才能到达控制器(在 Google App Engine 中)?

    对于到达控制器的每个 Api 调用 都需要 80 毫秒的延迟 我已经尝试了所有实例类 结果是相同的 我还没有找到任何解决方案 如图所示 RPC 调用在第 80 毫秒开始 剩余时间花在我的代码之外 嗯 可能有a lot为每个请求执行的 GAE
  • 位图大小超出特定活动的 VM 预算

    我有活动 A B 和 C 它们都设置了 ContentView 其中 XML 使用可绘制对象和背景 我将背景可绘制图像放在可绘制 nodpi 文件夹中 然而 每隔一段时间 我就会在活动 B 的崩溃报告中得到以下异常 java lang Ou
  • 使用 NumPy 步幅沿 2D 数组的最后一个轴滑动窗口以给出 3D 数组

    我正在尝试使用该功能as strided from numpy lib stride tricks从更大的二维数组中提取子系列 但我很难找到合适的东西来编写strides争论 假设我有一个矩阵m其中包含 5 个长度为 a 10 我想提取长度
  • Matlab中的样条插值以预测值

    我遇到的情况如下图所示 该图是两个向量的结果 fi 41 309180589278 41 8087915220215 42 8081880760916 43 8078181874395 44 8076823745539 45 8077808
  • ES6 承诺执行顺序

    我希望以下代码片段的输出是1 2 3 4 但是 实际的输出顺序是1 4 3 2 self promiseChain new Promise function resolve reject setTimeout resolve 4000 th
  • 如何迭代字典列表中的嵌套字典?

    对 Python 还很陌生 需要一些帮助 我找到了一些迭代字典列表的答案 但没有找到字典列表中嵌套字典的答案 这是字典列表中单个字典的粗略结构 a 1 b 2 c 3 d ab 12 cd 34 ef 56 e 4 f etc dict l
  • 如何仅通过给出元素的 id 来获取该元素的所有应用样式?

    我试图编写一个函数 它获取元素的 Id 并给出应用于该元素的所有样式属性 及其值 的列表 它应该考虑内联样式以及 css 文件中定义的样式 当我在参数中提供样式属性名称和元素的 id 时 我可以让该函数工作 但我只想传递元素的 id 并且应
  • 在Python中使用过滤器和生成器生成无限素数

    下面是我发现的一个 python 程序 它可以使用以下命令来查找素数 埃拉托斯特尼筛法 它使用过滤器和发生器 我无法理解 def odd iter n 1 while True n n 2 yield n def not divisible
  • 为什么这个使用lookbehinds的正则表达式在R中无效?

    我正在尝试在 R 中执行后向正则表达式来查找模式 我预计这会拉出 bob 中的 b 但我收到了一个错误 gt regexpr lt a b thingamabob Error in regexpr lt a b thingamabob in
  • 嵌入 Google 群组 - 未登录 Google 时不会显示任何内容

    我正在尝试使用为群组提供的嵌入代码将 Google 网上论坛论坛嵌入到页面中 当我登录 Google 时它工作正常 但如果我没有登录 嵌入代码 创建 iframe 会抛出以下错误 在 Chrome 中 拒绝显示文档 因为显示禁止 X 框架选
  • Python 漂亮的 XML 打印机与 lxml

    使用 丑陋 的 XML 读取现有文件并进行一些修改后 漂亮的打印不起作用 我试过了etree write FILE NAME pretty print True 我有以下 XML
  • 如何在Mac上通过chrome和firefox保存SSL证书?

    本博客介绍了如何在 Chrome 和 Firefox 中保存 SSL 证书 但我无法遵循它 我的操作系统是Mac 我不确定这是否是因为 mac 和 windows 之间的差异 有人可以告诉我如何在 Mac 上保存 SSL 证书吗 https
  • 如何在 python 中显示图片?

    我想知道 python 可以显示图像吗 最简单的方法是使用PIL和图片展示方法 这会在图像上打开一个外部查看器程序
  • iostream 和 No_delay 选项

    我正在尝试使用同一问题的答案来禁用 Nagle 算法 ASIO ip tcp iostream 和 TCP NODELAY boost asio ip tcp iostream socketStream const boost asio i
  • Android VpnService抓包不会抓包

    我已经寻找答案几个小时了 但我无法弄清楚 请帮忙 我想做的是使用Android中的VpnService像应用程序一样抓取网络数据包数据包捕获 我首先使用 google 的 ToyVpn 示例代码并对其进行修改 这样我就不会将数据发送到服务器