[转]Android DNS 代码分析
来源:互联网 发布:mac 网页抓取工具 编辑:程序博客网 时间:2024/04/28 05:34
转自:http://blog.csdn.net/span76/article/details/41478555
Android DNS 代码都在bionic/libc/netbsd中
(虽然netbsd 是个废弃的项目,但dns功能部分代码被 Android用上了)
netbsd 代码晦涩难懂,只有一边写程序,一边打log验证
照抄了一个简单程序, 在android 下面用 mmm 编译可以得到 py_getaddr 可执行文件, 用adb 登陆到 devices 再到 system/bin 下去执行
- payne@payne-desktop:~/njb/getaddr$ cat py_getaddr.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <string.h>
- int main(int argc, char **argv)
- {
- if (argc != 2) {
- fprintf(stderr, "Usage: %s hostname\n",
- argv[0]);
- exit(1);
- }
- struct addrinfo *answer, hint, *curr;
- char ipstr[16];
- bzero(&hint, sizeof(hint));
- hint.ai_family = AF_INET;
- hint.ai_socktype = SOCK_STREAM;
- int ret = getaddrinfo(argv[1], NULL, &hint, &answer);
- if (ret != 0) {
- fprintf(stderr,"getaddrinfo: %s\n",
- gai_strerror(ret));
- exit(1);
- }
- for (curr = answer; curr != NULL; curr = curr->ai_next) {
- inet_ntop(AF_INET,
- &(((struct sockaddr_in *)(curr->ai_addr))->sin_addr),
- ipstr, 16);
- printf("%s\n", ipstr);
- }
- freeaddrinfo(answer);
- exit(0);
- }
- cat Android.mk
- LOCAL_PATH:= $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:= py_getaddr.c
- LOCAL_MODULE := py_getaddr
- LOCAL_STATIC_LIBRARIES := libcutils libc
- include $(BUILD_EXECUTABLE)
到运行 py_getadd sohu.com 的时候, 调用过程如下
_files_getaddrinfo 是读取/system/etc/hosts 检索
_dns_getaddrinfo 是访问dns server
在访问构造 dns 访问的时候,如何找到 dns server, 原来在 __res_get_state 调用返回 __res_state (这个复杂的结构定义在 bionic/libc/private/resolv_private.h#__res_state )
在调用过程中 __res_vinit 使用了系统设置的 8.8.8.8 nameserver (jeallybean 代码在bionic/libc/netbsd/resolv/res_init.c#339)
之后res_queryN 用 res_nmkquery 构造dns 查询,并用 res_nsend 发送查询,并得到返回结果。
运行程序和 log 的打印结果如下:
py_getaddr sohu.com
======================= _files_getaddrinfo
======================= _dns_getaddrinfo
=========== getaddrinfo cp 8.8.8.8, subf 53
================ res_searchN sohu.com
================ res_querydomainN name sohu.com, domain (null)
================ res_queryN sohu.com
;; res_nmkquery(QUERY, sohu.com, IN, A)
================getanswer sohu.com
220.181.90.240
123.125.116.19
- [转]Android DNS 代码分析
- Android DNS 代码分析
- dns解析相关代码分析
- dns解析相关代码分析
- DNS故障分析【转】
- traffic server dns解析相关代码分析
- 【转+原】Android代码反编译及分析
- [转]Android Looper类代码分析1
- [转]Android Looper类代码分析2
- Android代码分析
- Android Recovery 代码分析
- Android init代码分析
- android init 代码分析
- Android init代码分析
- Android init代码分析
- Android Recovery 代码分析
- Android Recovery 代码分析
- android 代码性能分析
- web端登录页面 弹框 --短信防盗链
- BIOS工程师手边事--GPT
- Oracle数据库安全性有关的对象
- Android APP权限之sharedUserId和签名
- WebView加载html代码并附加css,js
- [转]Android DNS 代码分析
- Linux vi中查找字符内容的方法
- [转]关于 android 5.0 网络图标上的感叹号及其解决办法
- “段错误 (核心已转储) ”一种可能原因及其解决方法
- [转]android中动态和静态版本都有的库
- nginx重启 错误解释
- Android利用Fiddler进行网络数据抓包
- 《不负韶华》
- [转]Android -- Looper.prepare()和Looper.loop()