在 Android 中创建交互式防火墙应用程序

问题描述 投票:0回答:3

我想为Android创建防火墙应用程序,当应用程序想要连接到互联网时显示应用程序的名称并让用户永久阻止它或暂时阻止它或允许它,当该应用程序想要从网络接收数据时显示应用程序名称和用户可以允许或拒绝。

我查看了这个问题:创建防火墙,但它不能满足我的需求。

有什么建议来检测哪些应用程序可以访问网络和/或从中接收数据?

谢谢!

android firewall
3个回答
7
投票

这是很有可能的,而且以前已经做过了。
请参阅这些应用程序/实施:

根据实施情况,可能需要您的设备获得 root 权限。

通用、非 ROOT 的方法是创建自定义 VPN 服务并使用 NFLOG/ULOG 内核用户空间模块跟踪连接。

查看其他 QA 供参考:


0
投票

还可以使用 VPNService 和一些 C 代码来创建非根防火墙来处理 tcp/udp。 NetGuard 就是一个很好的例子:

https://github.com/M66B/NetGuard


0
投票

使用您所描述的功能创建适用于 Android 的防火墙应用程序涉及多个步骤和注意事项。以下是一些可以帮助您实现这一目标的建议:

1.了解Android的安全模型

出于安全原因,Android 应用程序被沙箱化。这意味着对其他应用程序网络活动的直接操纵受到限制。您将需要使用 Android 的现有 API,并可能需要 root 您的设备才能进行更深入的访问。

2.所需的权限和 API

您的应用程序将需要某些权限,并且可能会利用多个 API:

  • 权限
    INTERNET
    ACCESS_NETWORK_STATE
    FOREGROUND_SERVICE
  • VpnService:创建 VPN 服务来监视和控制网络流量。
  • UsageStatsManager:监控应用程序使用情况和网络活动。

3.实施 VPN 服务

使用

VpnService
可以让您的应用充当 VPN,可以拦截和控制网络流量。以下是如何实现这一点的高级概述:

a.创建 VPN 服务

public class MyVpnService extends VpnService {
    private ParcelFileDescriptor vpnInterface;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Builder builder = new Builder();
        
        // Configure the VPN interface
        builder.addAddress("10.0.0.2", 24);
        builder.addRoute("0.0.0.0", 0);
        
        // Establish the VPN interface
        vpnInterface = builder.establish();
        
        // Start a new thread to handle the VPN connection
        new Thread(new VpnRunnable(vpnInterface)).start();

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        if (vpnInterface != null) {
            try {
                vpnInterface.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            vpnInterface = null;
        }
        super.onDestroy();
    }
}

b.处理网络数据包

创建一个单独的线程来处理VPN截获的网络数据包:

private class VpnRunnable implements Runnable {
    private ParcelFileDescriptor vpnInterface;

    VpnRunnable(ParcelFileDescriptor vpnInterface) {
        this.vpnInterface = vpnInterface;
    }

    @Override
    public void run() {
        FileInputStream in = new FileInputStream(vpnInterface.getFileDescriptor());
        FileOutputStream out = new FileOutputStream(vpnInterface.getFileDescriptor());
        
        // Use a buffer to read and write packets
        ByteBuffer packet = ByteBuffer.allocate(32767);

        try {
            while (true) {
                // Read a packet from the input stream
                int length = in.read(packet.array());
                if (length > 0) {
                    // Process the packet
                    packet.limit(length);
                    // Display app name and ask user for action
                    handlePacket(packet);
                    packet.clear();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void handlePacket(ByteBuffer packet) {
        // Extract packet information
        // Identify the application responsible for the packet
        // Display app name and ask user for action
        // Apply user decision (block, allow, etc.)
    }
}

4.用于决策的用户界面

您将需要创建一个用户界面,显示应用程序名称并让用户决定是否阻止、暂时阻止或允许网络访问。

决策 UI 示例

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/appName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="App Name" />

    <Button
        android:id="@+id/allowButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Allow" />

    <Button
        android:id="@+id/blockButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Block" />

    <Button
        android:id="@+id/tempBlockButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Temporary Block" />
</LinearLayout>

5.存储用户偏好设置

将用户首选项(允许、阻止、临时阻止)存储在本地数据库或共享首选项中。

6.监控网络访问

要检测哪些应用程序可以访问网络,您可以使用

UsageStatsManager
收集网络活动数据:

UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long endTime = System.currentTimeMillis();
long startTime = endTime - 1000 * 60 * 60; // Last hour

List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(
    UsageStatsManager.INTERVAL_DAILY, startTime, endTime);

for (UsageStats usageStats : usageStatsList) {
    Log.d("AppUsage", "Package: " + usageStats.getPackageName() + " Last time used: " + usageStats.getLastTimeUsed());
}

7.处理权限

确保您的应用程序请求必要的权限,包括用于监控应用程序活动的使用访问权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>

挑战与思考

  • Root 访问权限:某些高级功能可能需要 root 访问权限。
  • 电池消耗:持续监控网络流量会消耗大量电池电量。
  • 用户隐私:确保您负责任地处理用户数据并遵守隐私法规。

这是一个复杂的项目,涉及网络编程、用户界面设计,可能还涉及系统级权限。确保彻底测试您的应用程序的性能和安全问题。

这是chatgpt 协助的。因此,请更改代码以符合您的规格

© www.soinside.com 2019 - 2024. All rights reserved.