android 4.3以上修改DNS流程(netd)
2023-09-14 09:16:12 时间
一、android中代码
framework端,设置dns服务器代码路径如下:
kk-4.x/libcore/luni/src/main/java/java/net/InetAddress.java
kk-4.x/frameworks/base/services/java/com/android/server/NetworkManagementService.java
kk-4.x/frameworks/base/services/java/com/android/server/NativeDaemonConnector.java
NetworkManagementService中函数setDnsServersForInterface
最终会通过本地socket传输命令到守护进程netd
所以framework层还可以使用INetworkManagementService mNetd 来更改dns地址
二、和dns相关libc代码路径如下:
kk-4.x/bionic/libc/netbsd
三、netd模块,netd是一个守护进程
kk-4.x/system/netd
四、其他命令设置dns
iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 202.96.134.33:53
取消设置的DNS:
iptables -t nat -L OUTPUT -n -v --line-numbers
iptables -t nat -D OUTPUT *linenumber*
五、第一次开机起来后获取DNS:
/data/data/com.android.providers.settings/databases/Settings.db 里面有保存dns数据在开机状态下,获取DNS:
EthernetManager可以设置获取DNS,这个dns是保存在内存的键值对中。
六、流程
android 4.3之后通过DNS获取ip,采用netd代理,
netd是一个守护进程。
通过ndc命令可以配置DNS服务器:
ndc resolver setifdns eth0 "" 8.8.8.8 8.8.4.4
各个版本支持的ndc命令:
https://github.com/bparmentier/DNSSetter/wiki/ndc-resolver-commands
1、ndc通过本地socket将命令传给netd
2、通过netd调用res_cache将dns1和dns2等信息保存到cache中
3、 netd调用bionic libc下netbsd中函数getaddrinfo
4、libc更新要访问的dns服务器ip地址
android中请求DNS服务器,获取ip流程如下
上层应用设置dns
NativeDaemonConnector通过java本地socket,将命令发送给NetD。
如果不走netd,流程如下:
注:lbc为android下bionic里面的libc
如果4.3之后有需求,需要和4.3之前一样,通过属性配置DNS。
那么可以合并4.0.3代码,即res_init.c中合并通过属性获取DNS
服务器ip地址代码,通过在自己的程序中设置环境变量:
setenv("ANDROID_DNS_MODE", "local", 1);
不要export。
当然不合并代码也是可以的,只需要修改dns服务器地址。
在res_init中res_setservers里面可以修改
struct addrinfo hints, *ai;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_NUMERICHOST;
sprintf(sbuf, "%u", NAMESERVER_PORT);
sprintf(propname, "net.dns%d", i+1);
__system_property_get(propname,propvalue);
printf(" propname: %s \n",propname);
printf("propvalue dns: %s \n",propvalue);
char* p = propvalue;
while (*p == ' ' || *p == '\t')
p++;
p[strcspn(p, ";# \t\n")] = '\0';
if (getaddrinfo(propvalue, sbuf, &hints, &ai) != 0){
memcpy(&statp->nsaddr_list[nserv],&set->sin, size);
}else{
memcpy(&statp->nsaddr_list[nserv],ai->ai_addr, ai->ai_addrlen);
}
如果不修改底层代码,是可以通过ndc命令修改DNS服务器的。原理就是第一个图。
基本请求流程如下:
new Thread( networkTask).start();
Runnable networkTask = new Runnable() {
@Override
public void run() {
try {
InetAddress inetAddress = InetAddress.getByName( "www.baidu.com");
Log. i( TAG, "Address is getHostName:" + inetAddress.getHostName());
Log. i( TAG, "Address is " + inetAddress.getHostAddress());
} catch (Exception e) {
e.printStackTrace();
Log. i( TAG, "Address is Exception");
}
}
};
< uses-permission android:name = "android.permission.INTERNET" />
相关文章
- Android开发之Audio播放:竞争Audio之Audio Focus的应用
- Android Studio(十):添加assets目录
- Android 自定义界面的弹出框(可输入数据)
- [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)
- [Android Pro] AOSP download
- [Android Pro] android 禁用和开启四大组件的方法(setComponentEnabledSetting )
- 使用Android Studio搭建Android集成开发环境(图文教程)
- 深入理解Android 自定义attr Style styleable以及其应用
- 导入旧版本Android项目时的“Unable to resolve target ‘android
- Android API之android.content.AsyncQueryHandler
- Android插件化 热修复热门框架简析(转载)
- EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
- Android Matrix类以及ColorMatri
- 【VLC-Android】vlc-android简例
- android studio运行应用执行代码流程
- android系统构建流程
- Android 如何缩小Ratingbar的大小?
- Android【报错】java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.Bu
- Android 10.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现
- android 10.0 SystemUI状态栏高度设置为0时微信头部异常问题的解决
- android Q(10.0)拨打电话(拨号)功能屏蔽流程(一)
- Android 7.1.2 SystemUI--Recents Task 加载显示流程
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 类加载器构造函数分析 | DexPathList 引入 )
- 【Android 逆向】逆向修改游戏应用 ( APK 解析工具 | 解包 -> 分析 -> 重打包 -> 签名 流程 )
- Android - TextView Ellipsize属性
- Android自己主动化构建之Ant多渠道打包实践(下)
- Android - 监听Activity点击无效
- Android audio(app到driver)打开Mic流程(三十四)
- Android Track的play流程(三十二)
- Android audio切换设备通道流程(二十八)
- Android修改kernel logo和开机动画(android)
- android binder机制之——(创建binder服务)
- Android培训班(68)dex文件打开流程
- android Unable to inflate view tag without class attribute
- Android Jetpack架构组件从入门到精通,一文通解!
- Android上层进入recovery流程
- 如何解决Android Studio的import android.support.v7.widget.RecyclerView的RecyclerView标红问题
- Android Binder Driver流程分析
- Android SurfaceFlinger与OpenMax流程(好文)