关于udpsocket使用问题

开发了一个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];

请问是什么问题?

会不会是引用了asyncUdpSocket.h asyncUdpSocket.m这个外部类?不属于tewak的类

报的错是什么?

无任何报错,也可以编译到手机,但是运行就崩溃。

自己尝试了一模一样的代码 在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贴出来看看

。。刚刚重新复制了下 怎么就乱码了。 syslog无任何提示。。

麻烦管理抽空看一下把。也许就一个小问题,就够新手折腾很久了。。我已经自己在这里折腾1天了,资料看的眼疼。

我告诉你一个笨但是有用的办法

NSLog(@"hello1");
[udpSocket sendData:data toHost:@"255.255.255.255" port:8001 withTimeout:-1 tag:0];
NSLog(@"hello2");

然后把崩溃重现一下,再把syslog传上来看看

我是IOS8:sad: syslogd不支持

下载这个ondeviceconsole,ssh到iOS上,运行ondeviceconsole,可以看到实时log,先将就用着调试一下吧

这个实时还挺方便的。。能不看看指定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.

好像这一句也运行了
[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:

最后发现这里出的问题

+(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;
    }

这个

Send:value:

是谁,在哪里调用的?

Hook里面
-(NSData*)Body{
NSData* data=%orig;
[SendMsg Send: @“Body”
value:data];
return data;
}

这是你自己写的方法还是UDPSocket库里的?