关于Hook CFNetwork/NSURLSession的DNS域名解析相关问题

唔。。。想写个tweak,来解决其它应用域名DNS被污染的问题。。。

于是乎,查找资料,找到dns相关接口:
res_query
gethostbyname
gethostbyname2
getaddrinfo
CFHostStartInfoResolution

但是,hook这些并没有效果,可能NSURLSession并没有调用这些比较“上层”的接口;
即使ida分析了CFNetwork也没有神马头绪(唔,主要是里面代码封装了一层有一层,不好跟,逃)

所以大家有没有办法可以优雅的解决这个问题:sleepy:
(粗暴的直接将url域名改成ip地址并hook ssl verify除外~~)

粗暴的修改hosts

可控性不高
倒是有想过hook系统解析hosts文件的过程,相比NSURLSession更难定位到代码:joy:

非常闲的话可以考虑patch syscall劫持socket层的dns请求应答?

不过我觉得你这个需求dnsmasq移植到iOS可能简单些

thx,我试试:kissing_closed_eyes:

你这到底是谁的小号怎么说话风格这么眼熟

b socket跟到一个函数叫DNSServiceProcessResult,查了下还有个DNSServiceGetAddrInfo,估计离目标不远了:heart_eyes:

妈个鸡,终结此贴
得到的教训是:以后调试不要偷懒用虚拟机,还是得在真机,不然挖坑自己跳
iOS 8 getaddrinfo
iOS 9.3 DNSServiceGetAddrInfo
实际上对我来说getaddrinfo就可以了

@qwertyuiop DNSServiceGetAddrInfo的hook后来做了吗?我也跟到了这里

//自己注册一个回调函数解析ip
static void MyCallBack(DNSServiceRef sdRef,
DNSServiceFlags flags,
uint32_t interfaceIndex,
DNSServiceErrorType errorCode,
const char *hostname,
const struct sockaddr *address,
uint32_t ttl,
void *context){
//解析socketaddr结构体里的ip
struct sockaddr_in sin;
memcpy(&sin, address, sizeof(sin));
NSString *ip = [NSString stringWithCString:inet_ntoa(sin.sin_addr) encoding:NSUTF8StringEncoding];
NSLog(@“IOSRE_DNSServiceGetAddrInfo hostname: %s --ip: %@LL”,hostname,ip);
}

DNSServiceErrorType my_DNSServiceGetAddrInfo(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceProtocol protocol, const char *hostname, DNSServiceGetAddrInfoReply callBack, void *context){
if(context){
//回调到自己的回调函数里解析
return orig_DNSServiceGetAddrInfo(sdRef,flags,interfaceIndex,protocol,hostname,MyCallBack,context);
}
return orig_DNSServiceGetAddrInfo(sdRef,flags,interfaceIndex,protocol,hostname,callBack,context);
}

大概这个样子,不过hook以后之前的应用就收不到dns解析的ip了:rofl: ,不过可以看到数据,
DNSServiceGetAddrInfo调用一次会回调多次到你的函数里,至于几次取决于解析回来的ip有几个,一次一个。

这个具体指?

你自己设置了回调接收解析回来的ip,原有的回调也就是app自己的 callBack就无法接收到对应域名的ip了

这个,转发下就好了吧。你要拦截,应该是直接返回自己解析的结果吧

ios 14及以上系统,这个函数hook不到了,有啥新的解决方案没啊老哥