唔。。。想写个tweak,来解决其它应用域名DNS被污染的问题。。。
于是乎,查找资料,找到dns相关接口:
res_query
gethostbyname
gethostbyname2
getaddrinfo
CFHostStartInfoResolution
…
但是,hook这些并没有效果,可能NSURLSession并没有调用这些比较“上层”的接口;
即使ida分析了CFNetwork也没有神马头绪(唔,主要是里面代码封装了一层有一层,不好跟,逃)
所以大家有没有办法可以优雅的解决这个问题
(粗暴的直接将url域名改成ip地址并hook ssl verify除外~~)
可控性不高
倒是有想过hook系统解析hosts文件的过程,相比NSURLSession更难定位到代码
Zhang
4
非常闲的话可以考虑patch syscall劫持socket层的dns请求应答?
不过我觉得你这个需求dnsmasq移植到iOS可能简单些
b socket跟到一个函数叫DNSServiceProcessResult,查了下还有个DNSServiceGetAddrInfo,估计离目标不远了
妈个鸡,终结此贴
得到的教训是:以后调试不要偷懒用虚拟机,还是得在真机,不然挖坑自己跳
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了 ,不过可以看到数据,
DNSServiceGetAddrInfo调用一次会回调多次到你的函数里,至于几次取决于解析回来的ip有几个,一次一个。
你自己设置了回调接收解析回来的ip,原有的回调也就是app自己的 callBack就无法接收到对应域名的ip了
这个,转发下就好了吧。你要拦截,应该是直接返回自己解析的结果吧
ios 14及以上系统,这个函数hook不到了,有啥新的解决方案没啊老哥