安卓手機如何修改dns,android 4.3以上修改DNS流程(netd)

 2023-11-30 阅读 27 评论 0

摘要:原址 一、android中代碼framework端,設置dns服務器代碼路徑如下:kk-4.x/libcore/luni/src/main/java/java/net/InetAddress.javakk-4.x/frameworks/base/services/java/com/android/server/NetworkManagementService.javakk-4.x/frameworks/base/services/java/

原址

一、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服務器地址。安卓手機如何修改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服務器的。原理就是第一個圖。


基本請求流程如下:

android apk上從dns服務器獲取ip方式如下:

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" />

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/185631.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息