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