Perguntas da entrevista sobre segurança móvel - relacionadas ao iOS

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:

  1. 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.
  2. Obtenha o caminho para o sheller: você precisa obter o caminho para o aplicativo de destino para executá-lo em uma etapa posterior.
  3. 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
  1. 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.
  2. 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:

  1. 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:
  2. 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;
}
  1. 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.

Acho que você gosta

Origin blog.csdn.net/u010671061/article/details/132268639
Recomendado
Clasificación