Skip to content

MASTG-TECH-0055: Iniciando um Repackaged App no Debug Mode

Se você reempacotou um aplicativo com um Frida Gadget, ou se deseja anexar lldb ao aplicativo, é necessário iniciar o aplicativo no modo de depuração. Quando você inicia o aplicativo via SpringBoard, ele não será iniciado no modo de depuração e o aplicativo irá travar.

Após a instalação do aplicativo usando Instalando Aplicativos, você pode iniciá-lo no modo de depuração utilizando os seguintes comandos.

Observe que os comandos que fazem parte do Suíte libimobiledevice referem-se à versão mais recente disponível no Github. Se você os instalou via brew ou outros gerenciadores de pacotes, pode ter uma versão mais antiga com flags de linha de comando diferentes.

iOS 17 e mais recente

Primeiro, certifique-se de conhecer o Bundle Identifier correto. Dependendo de como você assinou o aplicativo, o Bundle Identifier real pode ser diferente do original. Para obter uma visão geral dos aplicativos instalados, use a ferramenta ideviceinstaller (consulte Suíte libimobiledevice):

$ ideviceinstaller list
CFBundleIdentifier, CFBundleShortVersionString, CFBundleDisplayName
sg.vp.UnCrackable1.QH868V5764, "1.0", "UnCrackable1"
org.owasp.mastestapp.MASTestApp, "3.0.0", "Adyen3DS2Demo"
com.apple.TestFlight, "3.5.2", "TestFlight"

Neste exemplo, Sideloadly anexou o identificador de equipe (QH868V5764) ao Bundle Identifier original.

Em seguida, precisamos obter o identificador correto do dispositivo, que podemos obter usando idevice_id (consulte Suíte libimobiledevice):

$ idevice_id
00008101-1234567890123456 (USB)
00008101-1234567890123456 (Network)

Agora que temos o Bundle Identifier correto e o ID do dispositivo, podemos iniciar o aplicativo usando xcrun (consulte xcrun):

xcrun devicectl device process launch --device 00008101-1234567890123456  --start-stopped sg.vp.UnCrackable1.QH868V5764
13:00:43  Enabling developer disk image services.
13:00:43  Acquired usage assertion.
Launched application with sg.vp.UnCrackable1.QH868V5764 bundle identifier.

Finalmente, você pode anexar lldb usando os seguintes comandos:

# Executa o depurador lldb
$ lldb
# Seleciona o dispositivo iOS com o qual deseja interagir
(lldb) device select 00008101-1234567890123456

# Consulta os processos em um dispositivo.
(lldb) device process list
PID    PARENT USER       TRIPLE                         NAME
====== ====== ========== ============================== ============================
1      0                                                launchd
...
771    0                                                <anonymous>
774    0                                                <anonymous>
781    0                                                ReportCrash
783    0                                                UnCrackable Level 1

# Anexa a um processo específico pelo seu ID de processo
(lldb) device process attach --pid 783
Process 783 stopped
* thread #1, stop reason = signal SIGSTOP
    frame #0: 0x0000000104312920 dyld`_dyld_start
dyld`_dyld_start:
->  0x104312920 <+0>:  mov    x0, sp
    0x104312924 <+4>:  and    sp, x0, #0xfffffffffffffff0
    0x104312928 <+8>:  mov    x29, #0x0 ; =0
    0x10431292c <+12>: mov    x30, #0x0 ; =0
Target 0: (UnCrackable Level 1) stopped.

# Continua a execução de todas as threads no processo atual.
(lldb) c
Process 783 resuming
(lldb)

Mais informações sobre depuração de aplicativos iOS podem ser encontradas em Depuração.

Se você injetou manualmente um Frida Gadget, o Frida agora estará aguardando que você se conecte a ele. Até que você faça isso, o aplicativo parecerá congelado.

$ frida-ps -Ua
PID  Name           Identifier
---  -------------  -------------------------------
389  Calendar       com.apple.mobilecal
783  Gadget         re.frida.Gadget
336  TestFlight     com.apple.TestFlight
783  UnCrackable1   sg.vp.UnCrackable1.QH868V5764
339  Weather        com.apple.weather

O processo 783 iniciou uma nova thread chamada Gadget à qual você pode se conectar:

$ frida -U -n Gadget
     ____
    / _  |   Frida 16.5.9 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to iPhone (id=00008101-000628803A69001E)

[iPhone::Gadget ]-> ObjC.available
true

Após a conexão, o aplicativo continuará a execução normalmente.

iOS 16 e mais antigo

Em versões mais antigas do iOS, você pode usar idevicedebug (consulte Suíte libimobiledevice) ou ios-deploy para iniciar o aplicativo no modo de depuração.

Usando idevicedebug

# Obtém o nome do pacote
$ ideviceinstaller list
CFBundleIdentifier, CFBundleShortVersionString, CFBundleDisplayName
sg.vp.UnCrackable1.QH868V5764, "1.0", "UnCrackable1"
com.apple.TestFlight, "3.7.0", "TestFlight"
com.google.Maps, "24.50.0", "Google Maps"

# Executa no modo de depuração
$ idevicedebug -d run sg.vp.UnCrackable1.QH868V5764
working_directory: /private/var/mobile/Containers/Data/Application/438DE865-2714-4BD9-B1EE-881AD4E54AD1

Setting logging bitmask...
Setting maximum packet size...
Setting working directory...
Setting argv...
app_argv[0] = /private/var/containers/Bundle/Application/E21B5B13-DD85-4C83-9A0E-03FCEBF95CF5/UnCrackable Level 1.app/UnCrackable Level 1
Checking if launch succeeded...
Setting thread...
Continue running process...

Usando ios-deploy

Para usar ios-deploy, primeiro você precisa descompactar o arquivo IPA:

$ unzip Uncrackable1-frida-codesigned.ipa -d unzipped

Em seguida, use o ios-deploy com o caminho da pasta do aplicativo dentro do IPA descompactado:

$ ios-deploy --bundle 'unzipped/Payload/UnCrackable Level 1.app' -W -d -v
ios-deploy --bundle 'pram/Payload/UnCrackable Level 1.app' -W -d -v
[....] Waiting for iOS device to be connected
Handling device type: 1
Already found device? 0
Hardware Model: D211AP
Device Name: NVISO’s iPhone JBE
Model Name: iPhone 8 Plus
SDK Name: iphoneos
Architecture Name: arm64
Product Version: 16.6.1
Build Version: 20G81
[....] Using 593ad60af30ad045b9cb99d2901031226c1b8c84 (D211AP, iPhone 8 Plus, iphoneos, arm64, 16.6.1, 20G81) a.k.a. '**NVISO**’s iPhone JBE'.
------ Install phase ------
[  0%] Found 593ad60af30ad045b9cb99d2901031226c1b8c84 (D211AP, iPhone 8 Plus, iphoneos, arm64, 16.6.1, 20G81) a.k.a. 'NVISO’s iPhone JBE' connected through USB, beginning install
[  5%] Copying /Users/MAS/unzipped/Payload/UnCrackable Level 1.app/META-INF/ to device
[  5%] Copying /Users/MAS/unzipped/Payload/UnCrackable Level 1.app/META-INF/com.apple.ZipMetadata.plist to device
[  6%] Copying /Users/MAS/unzipped/Payload/UnCrackable Level 1.app/META-INF/com.apple.ZipMetadata.plist to device
...

Conectando o Frida

Se o seu aplicativo foi reempacotado com um Frida Gadget, o aplicativo aguardará que você se conecte a ele antes de continuar a inicialização.

Em uma nova janela do terminal, conecte-se ao gadget Frida, assim como no cenário do iOS 17:

$ frida-ps -Ua
PID  Name           Identifier
---  -------------  -----------------------------
...
468  Gadget         re.frida.Gadget
...
468  UnCrackable1   sg.vp.UnCrackable1.QH868V5764


$ frida -U -n Gadget
     ____
    / _  |   Frida 16.5.9 - A world-class dynamic instrumentation toolkit
   | (_| |
    > _  |   Commands:
   /_/ |_|       help      -> Displays the help system
   . . . .       object?   -> Display information about 'object'
   . . . .       exit/quit -> Exit
   . . . .
   . . . .   More info at https://frida.re/docs/home/
   . . . .
   . . . .   Connected to iPhone (id=593ad60af30ad045b9cb99d2901031226c1b8c84)
[iPhone::Gadget ]-> ObjC.available
true