10 KiB
macOS GCD - Grand Central Dispatch
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.
Informações Básicas
Grand Central Dispatch (GCD), também conhecido como libdispatch, está disponível tanto no macOS quanto no iOS. É uma tecnologia desenvolvida pela Apple para otimizar o suporte de aplicativos para execução concorrente (multithreaded) em hardware multicore.
GCD fornece e gerencia filas FIFO para as quais seu aplicativo pode enviar tarefas na forma de objetos de bloco. Blocos enviados para filas de despacho são executados em um pool de threads totalmente gerenciado pelo sistema. O GCD cria automaticamente threads para executar as tarefas nas filas de despacho e agenda essas tarefas para serem executadas nos núcleos disponíveis.
{% hint style="success" %} Em resumo, para executar código em paralelo, os processos podem enviar blocos de código para o GCD, que cuidará de sua execução. Portanto, os processos não criam novas threads; o GCD executa o código fornecido com seu próprio pool de threads. {% endhint %}
Isso é muito útil para gerenciar a execução paralela com sucesso, reduzindo significativamente o número de threads que os processos criam e otimizando a execução paralela. Isso é ideal para tarefas que requerem grande paralelismo (força bruta?) ou para tarefas que não devem bloquear a thread principal: por exemplo, a thread principal no iOS lida com interações de interface do usuário, então qualquer outra funcionalidade que possa fazer com que o aplicativo trave (pesquisar, acessar a web, ler um arquivo...) é gerenciada dessa maneira.
Objective-C
No Objective-C, existem diferentes funções para enviar um bloco para ser executado em paralelo:
- dispatch_async: Envia um bloco para execução assíncrona em uma fila de despacho e retorna imediatamente.
- dispatch_sync: Envia um objeto de bloco para execução e retorna após a conclusão desse bloco.
- dispatch_once: Executa um objeto de bloco apenas uma vez durante a vida útil de um aplicativo.
- dispatch_async_and_wait: Envia um item de trabalho para execução e retorna somente após a conclusão. Ao contrário de
dispatch_sync
, essa função respeita todos os atributos da fila ao executar o bloco.
Essas funções esperam os seguintes parâmetros: dispatch_queue_t
queue,
dispatch_block_t
block
Esta é a estrutura de um Bloco:
struct Block {
void *isa; // NSConcreteStackBlock,...
int flags;
int reserved;
void *invoke;
struct BlockDescriptor *descriptor;
// captured variables go here
};
E este é um exemplo de como usar paralelismo com dispatch_async
:
#import <Foundation/Foundation.h>
// Define a block
void (^backgroundTask)(void) = ^{
// Code to be executed in the background
for (int i = 0; i < 10; i++) {
NSLog(@"Background task %d", i);
sleep(1); // Simulate a long-running task
}
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Create a dispatch queue
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.example.backgroundQueue", NULL);
// Submit the block to the queue for asynchronous execution
dispatch_async(backgroundQueue, backgroundTask);
// Continue with other work on the main queue or thread
for (int i = 0; i < 10; i++) {
NSLog(@"Main task %d", i);
sleep(1); // Simulate a long-running task
}
}
return 0;
}
Swift
A biblioteca libswiftDispatch
fornece ligações Swift para o framework Grand Central Dispatch (GCD), que é originalmente escrito em C.
A biblioteca libswiftDispatch
envolve as APIs C do GCD em uma interface mais amigável para Swift, tornando mais fácil e intuitivo para os desenvolvedores Swift trabalharem com GCD.
DispatchQueue.global().sync{ ... }
DispatchQueue.global().async{ ... }
let onceToken = DispatchOnce(); onceToken.perform { ... }
async await
var (data, response) = await URLSession.shared.data(from: URL(string: "https://api.example.com/getData"))
Exemplo de código:
import Foundation
// Define a closure (the Swift equivalent of a block)
let backgroundTask: () -> Void = {
for i in 0..<10 {
print("Background task \(i)")
sleep(1) // Simulate a long-running task
}
}
// Entry point
autoreleasepool {
// Create a dispatch queue
let backgroundQueue = DispatchQueue(label: "com.example.backgroundQueue")
// Submit the closure to the queue for asynchronous execution
backgroundQueue.async(execute: backgroundTask)
// Continue with other work on the main queue
for i in 0..<10 {
print("Main task \(i)")
sleep(1) // Simulate a long-running task
}
}
Frida
O seguinte script Frida pode ser usado para interceptar várias funções dispatch
e extrair o nome da fila, o rastreamento de pilha e o bloco: https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js
frida -U <prog_name> -l libdispatch.js
dispatch_sync
Calling queue: com.apple.UIKit._UIReusePool.reuseSetAccess
Callback function: 0x19e3a6488 UIKitCore!__26-[_UIReusePool addObject:]_block_invoke
Backtrace:
0x19e3a6460 UIKitCore!-[_UIReusePool addObject:]
0x19e3a5db8 UIKitCore!-[UIGraphicsRenderer _enqueueContextForReuse:]
0x19e3a57fc UIKitCore!+[UIGraphicsRenderer _destroyCGContext:withRenderer:]
[...]
Ghidra
Atualmente, o Ghidra não entende nem a estrutura dispatch_block_t
do ObjectiveC, nem a estrutura swift_dispatch_block
.
Portanto, se você quiser que ele entenda, você pode apenas declará-las:
Em seguida, encontre um local no código onde elas são usadas:
{% hint style="success" %} Observe todas as referências feitas a "block" para entender como você pode descobrir que a estrutura está sendo usada. {% endhint %}
Clique com o botão direito na variável -> Retype Variable e selecione neste caso swift_dispatch_block
:
O Ghidra irá reescrever automaticamente tudo:
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Você quer ver sua empresa anunciada no HackTricks? ou quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra The PEASS Family, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.