aamir0
(aamir0)
1
开发了一个tweak,hook到一些自己需要的数据,需要通过UDP发送给PC来实时观察。
现在遇到了一个问题 引用asyncUdpSocket
/初始化udp
AsyncUdpSocket* asyncUdpSocket = [AsyncUdpSocket alloc] initWithDelegate:self];
NSError *err = nil;
[asyncUdpSocket enableBroadcast:YES error:&err];
[asyncUdpSocket bindToPort:8001 error:&err];
[asyncUdpSocket joinMulticastGroup:@"254.0.0.1" error:&err];
NSData * sendData=@"key" dataUsingEncoding:NSASCIIStringEncoding];
到这一步崩溃: BOOL b= [asyncUdpSocket sendData:sendData
toHost:@“255.255.255.255”
port:8001
withTimeout:-1
tag:1];
请问是什么问题?
aamir0
(aamir0)
2
会不会是引用了asyncUdpSocket.h asyncUdpSocket.m这个外部类?不属于tewak的类
aamir0
(aamir0)
4
无任何报错,也可以编译到手机,但是运行就崩溃。
自己尝试了一模一样的代码 在OS 、APP里面全部正常运行。 但是放在tweak里面 就崩溃
管理大大可以再tweak里面试一下,不知道问题,但是又必须使用UDP
为了您方便,库上传给您
CocoaAsyncSocket-master.zip (785 KB)
代码:
AsyncUdpSocket *udpSocket; udpSocket = [AsyncUdpSocket alloc] initWithDelegate:self];
NSError *error = nil;
[udpSocket bindToPort:0 error:&error];
[udpSocket receiveWithTimeout:-1 tag:0];
[udpSocket enableBroadcast:YES error:nil];
[udpSocket joinMulticastGroup:@"254.0.0.1" error:nil];
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
这里崩溃: [udpSocket sendData:data toHost:@“255.255.255.255” port:8001 withTimeout:-1 tag:0];
这代码把人给看瞎了,不会不报错吧,你把syslog贴出来看看
aamir0
(aamir0)
6
。。刚刚重新复制了下 怎么就乱码了。 syslog无任何提示。。
aamir0
(aamir0)
7
麻烦管理抽空看一下把。也许就一个小问题,就够新手折腾很久了。。我已经自己在这里折腾1天了,资料看的眼疼。
我告诉你一个笨但是有用的办法
NSLog(@"hello1");
[udpSocket sendData:data toHost:@"255.255.255.255" port:8001 withTimeout:-1 tag:0];
NSLog(@"hello2");
然后把崩溃重现一下,再把syslog传上来看看
下载这个ondeviceconsole,ssh到iOS上,运行ondeviceconsole,可以看到实时log,先将就用着调试一下吧
aamir0
(aamir0)
11
这个实时还挺方便的。。能不看看指定app的log?
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : MS:Notice: Injecting: com.tencent.mqq [QQ] (1141.14)
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/hiOicq.dylib
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : *** -[NSKeyedUnarchiver initForReadingWithData:]: data is empty; did you forget to send -finishEncoding to the NSKeyedArchiver?
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : assertion failed: 12B411: libxpc.dylib + 51947 [DBA1E85F-5C4C-3026-9B98-A82D2E332ED6]: 0x7d
Oct 29 16:07:29 dingpengrude-iPhone Unknown[779] :
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : hello1
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : hello2
Oct 29 16:07:29 dingpengrude-iPhone QQ[779] : *** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
Oct 29 16:07:30 dingpengrude-iPhone ReportCrash[784] : MS:Notice: Injecting: (null) [ReportCrash] (1141.14)
Oct 29 16:07:30 dingpengrude-iPhone ReportCrash[784] : task_set_exception_ports(B07, 400, F03, 0, 0) failed with error (4: (os/kern) invalid argument)
Oct 29 16:07:30 dingpengrude-iPhone ReportCrash[784] : ReportCrash acting against PID 779
第二次LOG:
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : MS:Notice: Injecting: com.tencent.mqq [QQ] (1141.14)
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : MS:Notice: Loading: /Library/MobileSubstrate/DynamicLibraries/hiOicq.dylib
Oct 29 16:12:44 dingpengrude-iPhone pasteboardd[810] : MS:Notice: Injecting: (null) [pasteboardd] (1141.14)
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : *** -[NSKeyedUnarchiver initForReadingWithData:]: data is empty; did you forget to send -finishEncoding to the NSKeyedArchiver?
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : assertion failed: 12B411: libxpc.dylib + 51947 [DBA1E85F-5C4C-3026-9B98-A82D2E332ED6]: 0x7d
Oct 29 16:12:44 dingpengrude-iPhone Unknown[808] :
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : hello1
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : hello2
Oct 29 16:12:44 dingpengrude-iPhone QQ[808] : *** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
Oct 29 16:12:45 dingpengrude-iPhone ReportCrash[813] : MS:Notice: Injecting: (null) [ReportCrash] (1141.14)
Oct 29 16:12:45 dingpengrude-iPhone ReportCrash[813] : task_set_exception_ports(B07, 400, F03, 0, 0) failed with error (4: (os/kern) invalid argument)
Oct 29 16:12:45 dingpengrude-iPhone ReportCrash[813] : ReportCrash acting against PID 808
Oct 29 16:12:45 dingpengrude-iPhone ReportCrash[813] : Formulating crash report for process QQ[808]
Oct 29 16:12:45 dingpengrude-iPhone mediaserverd[26] : ‘’ com.tencent.mqq(pid = 808) setting DiscoveryMode = DiscoveryMode_None, currentDiscoveryMode = DiscoveryMode_None
Oct 29 16:12:45 dingpengrude-iPhone ReportCrash[813] : Saved report to /var/mobile/Library/Logs/CrashReporter/QQ_2014-10-29-161245_dingpengrude-iPhone.ips
Oct 29 16:12:45 dingpengrude-iPhone SpringBoard[389] : Unable to get short BSD proc info for 808: No such process
Oct 29 16:12:45 dingpengrude-iPhone SpringBoard[389] : Application ‘UIKitApplication:com.tencent.mqq[0x6670]’ crashed.
aamir0
(aamir0)
12
好像这一句也运行了
[udpSocket sendData:data toHost:@“255.255.255.255” port:8001 withTimeout:-1 tag:0];
NSLog(@“hello2”);
hello2也输出了 之后崩溃。。
注意这个提示:
之后,QQ崩溃:
而这个函数的文档上说:
所以我觉得应该是这个函数的参数为0导致了崩溃
那我猜
[udpSocket sendData:data toHost:@"255.255.255.255" port:8001 withTimeout:-1 tag:0];
可能是另起了一个线程异步执行的,其下一句hello2得到调用后,
udpSocket sendData:toHost:port:withTimeout:
内部调用了
NSKeyedUnarchiver initForReadingWithData:
,导致崩溃。你可以看看udpSocket的源代码,有没有
NSKeyedUnarchiver initForReadingWithData:
aamir0
(aamir0)
17
最后发现这里出的问题
+(void)Send :(NSString*)Send
value:(NSData*)value{
NSString*str=[self dataToHexString:value];
str=[NSString stringWithFormat:@"%@:%@",Send,str];
NSData * sendData=[str dataUsingEncoding:NSUTF8StringEncoding];
//直接发送VALUE,则任何问题没有
[udpSocket sendData:sendData toHost:@“255.255.255.255” port:8001 withTimeout:-1 tag:0];
return ;
}
我是先把要发的数据转换成16进制HEX,任何拼接key,再转为NSData,再发送,这样就会导致崩溃。。。
但是代码好像没有写错。
转换的代码
-
(NSString *)dataToHexString:(NSData )Data{
NSData myD=Data;
Byte *bytes = (Byte *)[myD bytes];
//下面是Byte 转换为16进制。
NSString *hexStr=@"";
for(int i=0;i<[myD length];i++)
{
NSString *newHexStr = [NSString stringWithFormat:@"%X",bytes[i]&0xff];///16进制数
if([newHexStr length]==1)
hexStr = [NSString stringWithFormat:@"%@0%@ ",hexStr,newHexStr];
else
hexStr = [NSString stringWithFormat:@"%@%@ ",hexStr,newHexStr];
}
return hexStr;
}
aamir0
(aamir0)
19
Hook里面
-(NSData*)Body{
NSData* data=%orig;
[SendMsg Send: @“Body”
value:data];
return data;
}