Skip to content

MASTG-TECH-0095: Interceptação de Métodos

Frida

Em Rastreamento de Execução, utilizamos o frida-trace ao navegar para um site no Safari e descobrimos que o método initWithURL: é chamado para inicializar um novo objeto de solicitação de URL. Podemos consultar a declaração desse método no Apple Developer Website:

- (instancetype)initWithURL:(NSURL *)url;

Usando essa informação, podemos escrever um script do Frida que intercepta o método initWithURL: e imprime o URL passado para o método. O script completo está abaixo. Certifique-se de ler o código e os comentários inline para entender o que está acontecendo.

import sys
import frida


# JavaScript a ser injetado
frida_code = """

    // Obtém uma referência ao método initWithURL: da classe NSURLRequest
    var URL = ObjC.classes.NSURLRequest["- initWithURL:"];

    // Intercepta o método
    Interceptor.attach(URL.implementation, {
        onEnter: function(args) {
            // Obtém um handle para NSString
            var NSString = ObjC.classes.NSString;

            // Obtém uma referência à função NSLog e a usa para imprimir o valor do URL
            // args[2] refere-se ao primeiro argumento do método (NSURL *url)
            var NSLog = new NativeFunction(Module.findExportByName('Foundation', 'NSLog'), 'void', ['pointer', '...']);

            // Devemos sempre inicializar um pool de autorelease antes de interagir com APIs Objective-C
            var pool = ObjC.classes.NSAutoreleasePool.alloc().init();

            try {
                // Cria um binding JS a partir de um NativePointer.
                var myNSURL = new ObjC.Object(args[2]);

                // Cria um objeto de string ObjC imutável a partir de um objeto de string JS.
                var str_url = NSString.stringWithString_(myNSURL.toString());

                // Chama a função NSLog do iOS para imprimir o URL nos logs do dispositivo iOS
                NSLog(str_url);

                // Usa o console.log do Frida para imprimir o URL no seu terminal
                console.log(str_url);

            } finally {
                pool.release();
            }
        }
    });
"""

process = frida.get_usb_device().attach("Safari")
script = process.create_script(frida_code)
script.load()

sys.stdin.read()

Inicie o Safari no dispositivo iOS. Execute o script Python acima no seu host conectado e abra o log do dispositivo (conforme explicado na seção "Monitoring System Logs" do capítulo "iOS Basic Security Testing"). Tente abrir um novo URL no Safari, por exemplo, https://github.com/OWASP/mastg; você deverá ver a saída do Frida nos logs, assim como no seu terminal.

Claro, este exemplo ilustra apenas uma das coisas que você pode fazer com o Frida. Para desbloquear todo o potencial da ferramenta, você deve aprender a usar sua JavaScript API. A seção de documentação do site do Frida possui um tutorial e exemplos para usar o Frida no iOS.