Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用。完美替代运营商的短信与电话。并且FaceTime与iMessage的帐号不仅仅与Apple ID 绑定,同时也与使用这Apple ID的手机号码绑定,这样的漏洞自然给无孔不入的群发垃圾信息商们提供了后门。
研究怎么实现iMessage群发先是从XMPP协议开始的,因为Apple MAC os上的ichat是XMPP客户端,可以连接iMessage服务器,同时也可连接gtalk与weibo私信。但后面发现iMessage的服务器验证是加密,没办法实现非ichat XMPP客户端连接iMeesage服务器,那就自然没办法实现程序控制往iMeesage服务器批量发送信息。
只能通过MAC OS或者iOS自带的程序往iMeesage服务器发送信息,那要实现群发,自然只能想办法去调用自带的这ichat客户端,在MAC OS系统上Apple公司提供一种叫Apple script的脚本来自动实现任务。可能通过tell application "Messages"就可以激活iMessage客户端自动发送信息。这样实现的群发的思路就很清楚了
iMessage协议初接触
public class MyProxy : RealProxy { String myURIString; MarshalByRefObject myMarshalByRefObject; [PermissionSet(SecurityAction.LinkDemand)] public MyProxy(Type myType) : base(myType) { // RealProxy uses the Type to generate a transparent proxy. myMarshalByRefObject = (MarshalByRefObject)Activator.CreateInstance((myType)); // Get 'ObjRef', for transmission serialization between application domains. ObjRef myObjRef = RemotingServices.Marshal(myMarshalByRefObject); // Get the 'URI' property of 'ObjRef' and store it. myURIString = myObjRef.URI; Console.WriteLine("URI :{0}", myObjRef.URI); } [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] public override IMessage Invoke(IMessage myIMessage) { Console.WriteLine("MyProxy.Invoke Start"); Console.WriteLine(""); if (myIMessage is IMethodCallMessage) Console.WriteLine("IMethodCallMessage"); if (myIMessage is IMethodReturnMessage) Console.WriteLine("IMethodReturnMessage"); Type msgType = myIMessage.GetType(); Console.WriteLine("Message Type: {0}", msgType.ToString()); Console.WriteLine("Message Properties"); IDictionary myIDictionary = myIMessage.Properties; // Set the '__Uri' property of 'IMessage' to 'URI' property of 'ObjRef'. myIDictionary["__Uri"] = myURIString; IDictionaryEnumerator myIDictionaryEnumerator = (IDictionaryEnumerator) myIDictionary.GetEnumerator(); while (myIDictionaryEnumerator.MoveNext()) { Object myKey = myIDictionaryEnumerator.Key; String myKeyName = myKey.ToString(); Object myValue = myIDictionaryEnumerator.Value; Console.WriteLine("\t{0} : {1}", myKeyName, myIDictionaryEnumerator.Value); if (myKeyName == "__Args") { Object[] myObjectArray = (Object[])myValue; for (int aIndex = 0; aIndex < myObjectArray.Length; aIndex++) Console.WriteLine("\t\targ: {0} myValue: {1}", aIndex, myObjectArray[aIndex]); } if ((myKeyName == "__MethodSignature") && (null != myValue)) { Object[] myObjectArray = (Object[])myValue; for (int aIndex = 0; aIndex < myObjectArray.Length; aIndex++) Console.WriteLine("\t\targ: {0} myValue: {1}", aIndex, myObjectArray[aIndex]); } } IMessage myReturnMessage; myIDictionary["__Uri"] = myURIString; Console.WriteLine("__Uri {0}", myIDictionary["__Uri"]); Console.WriteLine("ChannelServices.SyncDispatchMessage"); myReturnMessage = ChannelServices.SyncDispatchMessage(myIMessage); // Push return value and OUT parameters back onto stack. IMethodReturnMessage myMethodReturnMessage = (IMethodReturnMessage) myReturnMessage; Console.WriteLine("IMethodReturnMessage.ReturnValue: {0}", myMethodReturnMessage.ReturnValue); Console.WriteLine("MyProxy.Invoke - Finish"); return myReturnMessage; } }
标签:__,Console,接触,iMessage,aIndex,WriteLine,群发 From: https://www.cnblogs.com/codtina/p/18311822