求助 hook CFNetworkCopySystemProxySettings() 会导致应用程序崩溃

不知道是不是我的代码写错了没,这是我的代码
CFDictionaryRef (*orig_CFNetworkCopySystemProxySettings)(void);
CFDictionaryRef new_CFNetworkCopySystemProxySettings(void){

NSLog(@"new_CFNetworkCopySystemProxySettings");

static CFMutableDictionaryRef proxySettings = (CFMutableDictionaryRef) orig_CFNetworkCopySystemProxySettings();

return proxySettings;

}
%ctor {
MSHookFunction((void *)CFNetworkCopySystemProxySettings, (void *)new_CFNetworkCopySystemProxySettings, (void **)&orig_CFNetworkCopySystemProxySettings);

}

我的建议是lldb里启动。crash以后看一下那块区域的内存,是不是patch错了

改成 MSHookFunction((void*)MSFindSymbol(NULL,"_CFNetworkCopySystemProxySettings"), (void *)new_CFNetworkCopySystemProxySettings, (void **)&orig_CFNetworkCopySystemProxySettings);

试试

楼主你解决了吗 最近我也想hook CFNetworkCopySystemProxySettings hook了不管用

管什么用? 用在哪里? 怎么HOOK的? 期望什么效果? 实际上是什么效果?

CFNetworkCopySystemProxySettings 这个是检测是不是代理的
正向开发的时候代码是这样的

NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@“https://www.baidu.com/”]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
NSDictionary *settings = proxies[0];
if (![[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@“kCFProxyTypeNone”]){
//检测到连接代理
}
我检测的应用中有一个方法[Proxy getProxyStatus] 我hook了这个方法 让他返回false 不管用
所以我想是不是应该hook CFNetworkCopySystemProxySettings这个函数。

那你得具体分析那个app是怎么检测的,静态分析不出结果,lldb上去就清楚了

NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:@“https://www.baidu.com/”]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
NSDictionary *settings = proxies[0];
if (![[settings objectForKey:(NSString *)kCFProxyTypeKey] isEqualToString:@“kCFProxyTypeNone”]){
//检测到连接代理
}
就是这样检测的
设置了代理了之后返回的就不是kCFProxyTypeNone了。
我现在想设置代理之后还返回kCFProxyTypeNone 跳过代理检测的限制

所以你是怎么hook的

CHDeclareClass(Proxy)

CHDeclareMethod0(id, Proxy, getProxyStatus){
return nil;
}

CHConstructor{
CHLoadLateClass(Proxy);
CHClassHook0(Proxy, getProxyStatus);
}
用的monkeydev 我手机也是越狱的

QQ20190107-142030
bool __cdecl +[Proxy getProxyStatus](Proxy_meta *self, SEL a2)
{
void *v2; // x0
void *v3; // x20
void *v4; // x0
void *v5; // x0
void *v6; // x0
void *v7; // x0
void *v8; // x19
void *v9; // x0
void *v11; // x0

v2 = (void *)CFNetworkCopySystemProxySettings(self, a2);
v3 = objc_msgSend(v2, “autorelease”);
v4 = objc_msgSend(&OBJC_CLASS___NSURL, “URLWithString:”, CFSTR(“http://www.google.com”));
v5 = (void *)CFNetworkCopyProxiesForURL(v4, v3);
v6 = objc_msgSend(v5, “autorelease”);
v7 = objc_msgSend(v6, “objectAtIndex:”, 0LL);
v8 = v7;
v9 = objc_msgSend(v7, “objectForKey:”, kCFProxyTypeKey);
if ( (unsigned __int64)objc_msgSend(v9, “isEqualToString:”, CFSTR(“kCFProxyTypeNone”)) & 1 )
return 0;
v11 = objc_msgSend(v8, “objectForKey:”, kCFProxyPortNumberKey);
return objc_msgSend(v11, “integerValue”) != (void *)4321;
}
这是ida种的伪代码。
我觉得我hook的没毛病。。

首先,别人返回的bool,你返回个id,我就觉得你的hook有毛病,虽然nil跟false没区别

其次,你还得看调用方怎么检查的返回值,这函数为什么要检查代理端口是不是4321

判断的时候就判断不是1就走所以我就hook返回值了
if ( !((unsigned __int64)+Proxy getProxyStatus & 1) )
{
v3 = -xxx paramsDict;
v4 = objc_retainAutoreleasedReturnValue(v3);
v5 = +xxx sharedRequest;
v6 = (void *)objc_retainAutoreleasedReturnValue(v5);
v7 = _NSConcreteStackBlock;
v8 = 3254779904LL;
v9 = sub_100A5F8F4;
v10 = &unk_100C052D8;
v11 = v2;
objc_msgSend(v6, “POSTWithPath:params:success:failure:”, 0LL, v4, &v7, &off_100C05328);
objc_release(v6);
objc_release(v4);
}
一开始我看返回bool类型 我也设置false 后来不管用 就试了试nil…
顺便可以请教下上面那个block我调试的时候怎么也进不去 单纯调用方法可以打全局断点进入 block里面的怎么进去呀。。。

返回0没问题, 你自己在这下个断点看看就知道了

这个CHDeclareMethod0我没用过, 你最好看看他的用法, 我感觉你写的有问题

你在■■黑产包?

tyvm dumbass