安卓增加网络防火墙

news/2025/2/21 4:25:07/

目录

安卓framework只有对后台流量的限制.这里不赘述了,有兴趣的可以参考

言归正传:我们要加的防火墙 分为两种

1.允许/不允许 xx进程 使用wifi网络

2.允许/不允许 xx进程 使用移动网络

1.在netd中增加接口.

接下来要往framework走

第三方调用可以重新封装接口,或者反射,不过多赘述.


安卓framework只有对后台流量的限制.这里不赘述了,有兴趣的可以参考

https://www.jianshu.com/p/5940ba4debf3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

原理就是根据uid设置黑白名单,名单的存放位置在:

data/system/netpolicy.xml

注意: 这里有一个很重要的概念 : uid(不多说了.不了解的自己查),安卓所有的网络策略都是根据这个来的. 所以,如果一个应用和别人共享了uid,那么你们的流量就分不开了,都会计算在一起.

言归正传:我们要加的防火墙 分为两种

1.允许/不允许 xx进程 使用wifi网络

2.允许/不允许 xx进程 使用移动网络

这里截屏华为的效果图如下:这就是我们想要的效果.

//我们在这里备注下 代码实际上执行的指令:
 

 (全部网络)
adb shell iptables -t filter -D OUTPUT -m owner --uid-owner=10077 -j DROP(wlan0网络)
adb shell iptables -t filter -D OUTPUT -o wlan0  -m owner --uid-owner=10077 -j DROP (移动网络,这里xxx是泛指,需要查下)
adb shell iptables -t filter -D OUTPUT -o xxx -m owner --uid-owner=10077 -j DROP 

代码分为几块:

1.在netd中增加接口.

        在system/netd/server目录下的FirewallController.h中定义:

class FirewallController {  public:  . . .  //addint initIptableFirewall(void);int setMobileDataUidRule(int, FirewallRule);  int setWifiDataUidRule(int, FirewallRule);  //add. . .  
}  

        system/netd/server目录下的FirewallController.cpp实现:

#include <cutils/properties.h>  
//add  by xiaoxsen
const char* op_3g;  
const char* op_wifi;  
. . .  
int FirewallController::initIptableFirewall(void) {  int res = 0;  op_3g = "ccmni+"; //网络端口op_wifi = "wlan0";//wifi网络端口 //查看网络端口的方法://1.输入adb shell  //2.输入netcfg// 新建一个drop_wall链表  res |= execIptables(V4V6, "-w", "-N", "drop_wall", NULL);  // 把新建的drop_wall链表添加到OUTPUT链表目录下  res |= execIptables(V4V6, "-w", "-A", "OUTPUT", "-j", "drop_wall", NULL);  
}  
int FirewallController::setMobileDataUidRule(int uid, FirewallRule rule) {  char uidStr[16];  sprintf(uidStr, "%d", uid);  const char* op;  if (rule == ALLOW) {  op = "-D";// 删除链表中的规则  } else {  op = "-A";// 添加规则到链表  }  int res = 0;  res |= execIptables(V4V6, "-w", op, "drop_wall", "-o", op_3g, "-m", "owner",  "--uid-owner", uidStr, "-j", "REJECT", NULL);  return res;  
} int FirewallController::setWifiDataUidRule(int uid, FirewallRule rule) {  char uidStr[16];  sprintf(uidStr, "%d", uid);  const char* op;  if (rule == ALLOW) {  op = "-D";// 删除链表中的规则  } else {  op = "-A";// 添加规则到链表  }  int res = 0;  res |= execIptables(V4V6, "-w", op, "drop_wall", "-o", op_wifi, "-m", "owner",  "--uid-owner", uidStr, "-j", "REJECT", NULL);  return res;  
}  

        

初始化:

CommandListener::CommandListener() :FrameworkListener("netd", true) {//add  sFirewallCtrl->initIptableFirewall();// 开机初始化//add .......}

在 system/netd/server目录下int CommandListener::FirewallCmd::runCommand()中添加监听:


if (!strcmp(argv[1], "set_mobile_data_uid_rule")) {  if (argc != 4) {  cli->sendMsg(ResponseCode::CommandSyntaxError,  "Usage: firewall set_mobile_data_uid_rule <1000> <allow|deny>",  false);  return 0;  }  int uid = atoi(argv[2]);  FirewallRule rule = parseRule(argv[3]);  int res = sFirewallCtrl->setMobileDataUidRule(uid, rule);  return sendGenericOkFail(cli, res);  }  
if (!strcmp(argv[1], "set_wifi_data_uid_rule")) {  if (argc != 4) {  cli->sendMsg(ResponseCode::CommandSyntaxError,  "Usage: firewall set_wifi_data_uid_rule <1000> <allow|deny>",  false);  return 0;  }  int uid = atoi(argv[2]);  FirewallRule rule = parseRule(argv[3]);  int res = sFirewallCtrl->setWifiDataUidRule(uid, rule);  return sendGenericOkFail(cli, res);  }  

        至此netd部分完成.

接下来要往framework走

我们需要把我们控制网络的方法声明在

frameworks/base/core/Java/android/os/INetworkManagementService.aidl中:

interface INetworkManagementService
{
……
void setMobileDataUidRule(int uid, boolean allow);void setWifiDataUidRule(int uid, boolean allow);
……
}

在frameworks/base/services/core/java/com/android/server目录下的.java中实现我们声明的两个方法:

 public void setMobileDataUidRule(int uid, boolean allow) {  enforceSystemUid();//checktry {  final String rule = allow ? "allow" : "deny";mConnector.execute("firewall", "set_mobile_data_uid_rule", uid, rule);  } catch (NativeDaemonConnectorException e) {  throw e.rethrowAsParcelableException();  }  }  public void setWifiDataUidRule(int uid, boolean allow) {  enforceSystemUid();  try { final String rule = allow ? "allow" : "deny";mConnector.execute("firewall", "set_wifi_data_uid_rule", uid, rule);  } catch (NativeDaemonConnectorException e) {  throw e.rethrowAsParcelableException();  }  } 

最后是framework调用:

networkManagementService = INetworkManagementService.
Stub.asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)); if (networkManagementService != null) {    networkManagementService. setMobileDataUidRule (10038,true);networkManagementService. setWifiDataUidRule (10048, true);  }

获取uid的方式


List<AppdataInfo> installApplictionList = new ArrayList<AppdataInfo>();
pm = mContext.getPackageManager();
List<ApplicationInfo> installedApplications = pm.getInstalledApplications(PackageManager.GET_META_DATA);for (ApplicationInfo applicationInfo : installedApplications) {if (applicationInfo != null && PackageManager.PERMISSION_GRANTED == pm.checkPermission(Manifest.permission.INTERNET,applicationInfo.packageName)) {//这样就能获取到有网络权限应用的uidint uid = applicationInfo.uid

第三方调用可以重新封装接口,或者反射,不过多赘述.


http://www.ppmy.cn/news/744242.html

相关文章

大数据之数据采集项目延伸——sqoop

承接上篇文章 大数据之数据采集项目总结——hadoop&#xff0c;hive&#xff0c;openresty&#xff0c;frcp&#xff0c;nginx&#xff0c;flume https://blog.csdn.net/qq_43759478/article/details/131520375?spm1001.2014.3001.5501 在上个阶段&#xff1a;完成了数据收集&…

23西安电子科技大学光电工程学院851考研录取情况

01、光电工程学院各个方向 02、23光电工程学院一志愿考研录取情况总览、平均分 PS&#xff1a;在23年&#xff0c;西电物理与光电工程学院拆分为两个院&#xff0c;分别是&#xff1a;物理学院和光电工程学院。其中物理学院改考602高等数学872普通物理&#xff0c;光电学院专业…

未来的苹果和谷歌到底哪家强?

深度对决&#xff0c;未来的苹果和谷歌到底哪家强&#xff1f;&#xff08;转&#xff09; 文/王新喜 日前,前苹果公司CEO约翰斯卡利称&#xff0c;他认为在科技领域中作出下一个重大创新的很可能不会是苹果公司&#xff0c;而会是谷歌等其他公司。他认为谷歌未来作出重大创新…

Magic UI四子围城,2022折叠屏灵魂觉醒

2022年&#xff0c;消费电子产品有哪些动向值得期待&#xff1f;折叠屏绝对排在TOP1。 从行业趋势来看&#xff0c;智能手机行业高端市场竞争加剧&#xff0c;折叠屏的出现既带来软硬件的诸多新可能&#xff0c;打破了手机创新乏力的局面&#xff0c;又比传统智能手机有更好的利…

雷鸟Air上手体验:140英寸高清大屏,口袋XR观影眼镜

对于观影需求而言&#xff0c;BirdBath&#xff08;简称BB&#xff09;可以看作是目前兼具高清沉浸显示、环境透视、高性价比于一身的解决方案。视觉上&#xff0c;通常结合Micro OLED可带来极佳显示素质&#xff1b;同时具备通透性&#xff0c;整机重量可控制在100g以内&#…

附录7-用户列表案例,element-ui

目录 1 效果 1.1 查询所有用户 1.2 添加新用户 1.3 删除用户 1.4 用户详情 2 后端 2.1 查询所有 2.2 添加 2.3 删除 2.4 查询单个 3 前端 3.1 环境 3.2 main.js 3.3 userList.vue 3.4 userInfo.vue 1 效果 1.1 查询所有用户 1.2 添加新用户 …

罗永浩谈手机:苹果零创新、雷军太土、黄章太笨

有钱人用破手机也不会心虚 骂九宫格的很多人就是穷&#xff0c;没有安全感&#xff0c;手机是他们获得社会认同和存在感的这么一个东西。如果你有钱呢&#xff0c;你用一个破手机也不会心虚&#xff0c;用贵手机也不会骄傲。比如我年薪百万的话&#xff0c;我不会因为拿着一款5…

手机信息通知标为已读实现原理_27条iPhone苹果(附iPhoneX)手机使用技巧,你用过多少条?...

阅读本文前&#xff0c;请您先点击上面的蓝色字体“电子荟”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。 随着电子信息技术的日新月异&#xff0c;电子产品的更新换代速度越来越快&…