busybox无法ping域名的解决办法
来源:互联网 发布:spring源码深度剖析 编辑:程序博客网 时间:2024/05/21 10:07
$ ping www.google.comping : bad address 'www.google.com
现在各个版本的busybox都一样, 网上有人讲需要libnss_dns* ...文件, 拷贝过去还是不能用,
手编2.6.21内核+手编1.5.1busybox+一堆deb包解压缩出gcc, 一个自定义的linux基本完成了,就差这么一个东西, hack源代码...最终发现getaddrinfo这个函数调用失败,解决思路就是模拟dns协议把域名发给dns服务器,把域名转化为ip,然后再调用getaddrinfo,试验成功。
1. 把下面这段代码加入libbb/xconnect.c 的开头。
2. 把xconnect.c的str2sockaddr函数中getaddrinfo改为hgetaddrinfo。
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define oops(msg) { perror(msg); exit(1);}
- #include<ctype.h>
- void fillip(char* buffer, const char* ip);
- char* name2ip(const char* name);
- /**
- * * head len: 12
- * * query: ? + 4
- * * total: strlen(query.buffer) + 16
- * */
- typedef struct{
- u_short txid;
- u_short flag;
- u_short question;
- u_short answer;
- u_short authority;
- u_short additional;
- char buffer[256];
- struct {
- u_short type;
- u_short cls;
- }query;
- }dns_req;
- /** length of resp: 12 */
- typedef struct{
- u_short txid;
- u_short flag;
- u_short question;
- u_short answer;
- u_short authority;
- u_short addtional;
- char buffer[1024];
- struct{
- u_short name;
- u_short type;
- u_short cls;
- u_short live_l;
- u_short live_h;
- u_short len;
- struct in_addr addr;
- }resp;
- }dns_res;
- int hgetaddrinfo(const char *node, const char *service,
- const struct addrinfo *hints,
- struct addrinfo **res){
- /* int rc = getaddrinfo(node,service,hints,res);
- * if(rc == 0)//todo: != -> ==
- * return rc;
- * */
- char *ip = name2ip(node); /// 如果 ping www.baidu.com
- return getaddrinfo(ip,service,hints,res); /// 那么此时 node 指向字符串 "www.baidu.com"
- }
- char *get_dns_name()
- {
- int fd;
- static char buf[1024],*pstr,*pdns;
- fd = open("/etc/resolv.conf",O_RDWR);
- read(fd,buf,1020);
- pstr = strstr(buf,"nameserver");
- pstr += strlen("nameserver");
- while(!isdigit(*pstr)){
- pstr ++;
- }
- pdns = pstr;
- while(isdigit(*pstr) || (*pstr == '.') ){
- pstr ++;
- }
- *pstr = '\0';
- close(fd);
- return pdns;
- }
- char * name2ip(const char *node){
- struct sockaddr_in dns;
- dns_req req;
- dns_res res;
- int sockid, len, index;
- get_dns_name();
- char dnsip[32];
- strcpy(dnsip,get_dns_name());
- sockid = socket(PF_INET, SOCK_DGRAM, 0);
- if(sockid == -1)
- oops("socket");
- memset((void*)&dns, 0, sizeof(dns));
- dns.sin_family = AF_INET;
- dns.sin_port = htons(53);
- dns.sin_addr.s_addr = inet_addr(dnsip);
- memset((void*)&req, 0, sizeof(req));
- req.txid = htons(0x4419);
- req.flag = htons(0x0100);
- req.question = htons(1);
- fillip(req.buffer,node);
- req.query.type=htons(1);
- req.query.cls=htons(1);
- memcpy(req.buffer+strlen(req.buffer)+1, (void*)(&req.query), sizeof(req.query));
- sendto(sockid, (void*)&req, strlen(req.buffer)+17, 0,
- (struct sockaddr*)&dns, sizeof(dns));
- recvfrom(sockid, (void*)&res, sizeof(res), 0,
- (struct sockaddr*)&dns, &len);
- index = strlen(res.buffer)+5;
- while(1){
- memcpy((void*)&(res.resp), res.buffer+index, 12);
- if(ntohs(res.resp.type)==1){
- memcpy((void*)&(res.resp.addr), res.buffer+index+12, 4);
- break;
- }
- index += ntohs(res.resp.len) + 12;
- }
- return inet_ntoa(res.resp.addr);
- }
- void fillip(char* buffer, const char* ip){
- int i,j=0;
- for(i = 0; ip[i] != 0; i ++){
- if(ip[i] != '.'){
- buffer[i+1] = ip[i];
- }
- else{
- buffer[j] = i - j;
- j = i + 1;
- }
- }
- buffer[j] = i - j;
- }
原文链接:
http://hankjin.blog.163.com/blog/static/337319372009327101324432/
阅读全文
0 0
- busybox无法ping域名的解决办法
- busybox无法ping域名的解决办法
- 关于安卓busybox命令无法ping域名但可以ping通ip地址问题
- godaddy域名出现ping不通的解决办法
- Linux ping不通域名的解决办法
- busybox httpd无法运行cgi的解决办法
- RedHat无法ping通Win10的解决办法
- 解决ARM板上无法ping域名的方法
- ping得通外网IP,ping不通外网域名的解决办法
- ping得通外网IP,ping不通外网域名的解决办法
- ubuntu - 域名无法ping通及访问
- 无法使用ping或ipconfig命令的解决办法
- linux与Windows之间无法ping通的解决办法
- vm中Linux无法ping通网站的解决办法
- 在开发板上 ping 域名提示无法ping通
- ping某个域名的过程
- 论坛更改域名后用户头像无法显示的解决办法
- Busybox支持中文的解决办法
- 零基础PHP自学路线图
- Eclipse中用Link方式安装Maven插件
- Eclipse Neno.3 + Jrebel 7.0.9 图文在线安装
- Oracle中的日期相关函数(部分)
- 在PHP语言中使用JSON和将json还原成数组
- busybox无法ping域名的解决办法
- Android
- Vue.js——60分钟快速入门
- 简单的算法问题2——奇怪的国家
- Android7.0中文API -- ActionMenuView
- LeetCode 517 Super Washing Machines
- java中的线程池类型
- 互联网协议入门
- Ajax关于readyState和status的讨论