O princípio da ferramenta iOS Smashing (DYLD_INSERT_LIBRARIES injeta biblioteca dinâmica dylib)
Na plataforma iOS, descompactar (descompactar) refere-se à descriptografia de um aplicativo criptografado baixado da App Store em um formato não criptografado. As ferramentas Shell são frequentemente usadas para fins de engenharia reversa e depuração.
DYLD_INSERT_LIBRARIES é uma variável de ambiente para o vinculador dinâmico (dyld) nas plataformas iOS e macOS que permite que uma ou mais bibliotecas dinâmicas sejam inseridas na inicialização do programa. Ao inserir uma biblioteca dinâmica contendo a função de shell, a parte criptografada do programa pode ser interceptada e descriptografada quando o programa está em execução, de modo a atingir o objetivo de shell.
A seguir está o princípio básico de uso de DYLD_INSERT_LIBRARIES para obter sucesso:
- Escrevendo uma biblioteca dinâmica de shell: Primeiro, precisamos escrever uma biblioteca dinâmica que contenha a função de shell. Esta biblioteca precisa implementar as seguintes funções:
- Interceptar chamadas de sistema relacionadas ao mapeamento de memória, como mmap e mremap_encrypted;
- Na chamada do sistema interceptada, quando um segmento de memória criptografado (identificado pelo campo cryptid) for detectado, use o método de descriptografia fornecido pelo sistema (como mremap_encrypted) para descriptografá-lo;
- Remapeie o segmento de memória descriptografado de volta ao programa.
- Obtenha o caminho para o sheller: você precisa obter o caminho para o aplicativo de destino para executá-lo em uma etapa posterior.
- Use DYLD_INSERT_LIBRARIES para injetar a biblioteca dinâmica do shell: Antes de executar o programa de destino, defina a variável de ambiente DYLD_INSERT_LIBRARIES para o caminho da biblioteca dinâmica do shell, por exemplo:
export DYLD_INSERT_LIBRARIES=/path/to/your/dylib
- Execute o programa alvo: Agora você pode executar o programa alvo. Como DYLD_INSERT_LIBRARIES foi definido, dyld carregará automaticamente a biblioteca dinâmica do shell quando o programa for iniciado, para descriptografar a parte criptografada do programa em tempo de execução.
- Exportar o programa descriptografado: Após concluir as etapas acima, você pode usar outras ferramentas (como class-dump, MachOView, etc.) para exportar o programa descriptografado para análise posterior e engenharia reversa.
O acima é o princípio básico do uso de DYLD_INSERT_LIBRARIES para injetar a biblioteca dinâmica do shell. Observe que a viabilidade real deste método na plataforma iOS pode ser afetada por fatores como versão do sistema, status do jailbreak, etc.
Como o iOS hook a c funciona sem jailbreak?Você conhece o anzol, Método Swizzling?
Uma maneira de conectar funções C em dispositivos iOS sem jailbreak é usar a biblioteca fishhook. fishhook é uma ferramenta leve de conexão de biblioteca de links dinâmicos desenvolvida pelo Facebook que pode ser usada em iOS e macOS. Ele pode religar (religar) símbolos C em tempo de execução para atingir o objetivo de conectar funções C.
A seguir estão as etapas básicas para conectar uma função C usando o anzol:
- Importe a biblioteca de anzóis: Primeiro, você precisa importar a biblioteca de anzóis para o seu projeto. Pode ser importado clonando o repositório oficial ou usando CocoaPods:
- Clone o repositório oficial: https://github.com/facebook/fishhook
- Usando CocoaPods: adicione pod 'fishhook' ao Podfile e execute pod install.
- Escreva a função hook: Em seguida, escreva a função hook que substitui a função C original. Por exemplo, se você deseja conectar a função printf, você pode escrever a seguinte função de gancho: objcCopy
#include <stdio.h>
static int (*orig_printf)(const char * restrict format, ...);
int hook_printf(const char * restrict format, ...) {
// 在这里编写你的 hook 逻辑
// 例如,在原始 printf 输出的基础上添加前缀
va_list args;
va_start(args, format);
int result = orig_printf("[HOOK] ");
result += orig_printf(format, args);
va_end(args);
return result;
}
- Revincular usando anzol: Em seguida, use a função rebind_symbols da biblioteca anzol para religar símbolos. No exemplo acima, você faria: objcCopy
#import <fishhook/fishhook.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 在这里进行符号重绑定
rebind_symbols((struct rebinding[1]){
{
"printf", hook_printf, (void *)&orig_printf}}, 1);
// 接下来的 printf 调用将使用 hook 函数
printf("Hello, world!\n");
return YES;
}
Quanto ao Method Swizzling, é uma técnica em Objective-C para substituir implementações de métodos em tempo de execução. No entanto, esta técnica se aplica principalmente a métodos Objective-C, não a funções C. Se você deseja conectar métodos Objective-C, você pode usar o Method Swizzling; se precisar conectar funções C, você pode usar ferramentas como o anzol.