
Outil de modification de la mémoire pour les ipa re-signés prenant en charge les applications iOS s'exécutant sur iPhone et Apple Silicon Mac sans jailbreak.
Ipa-medit est un outil de recherche et de modification mémoire pour ipa re-signé sans jailbreak. Il prend en charge les applications iOS fonctionnant sur iPhone et Apple Silicon Mac. Il a été créé pour les tests de sécurité de jeux mobiles. De nombreux jeux mobiles ont une détection de jailbreak, mais ipa-medit ne nécessite pas de jailbreak, donc la modification de la mémoire peut être effectuée sans contourner la détection de jailbreak.
La modification de la mémoire est le moyen le plus simple de tricher dans les jeux, c'est l'un des éléments à vérifier lors du test de sécurité. Il existe également des outils de triche utilisés couramment comme GameGem et iGameGuardian. Cependant, il n'y avait aucun outil disponible pour les appareils non jailbreakés et en CUI, Apple Silicon Mac. Je l'ai donc créé comme outil de test de sécurité. La version Android est sterrasec/apk-medit.

$ brew install --HEAD libplist
$ brew install --HEAD usbmuxd
$ brew install --HEAD libimobiledevice
$ brew install --HEAD ideviceinstaller
Téléchargez le binaire depuis GitHub Releases et placez-le dans votre $PATH.
Vous pouvez le construire en utilisant la commande make.
Le compilateur Go est nécessaire pour la construction.
Si vous ciblez une application iOS fonctionnant sur un Apple Silicon Mac, vous devrez la signer, mais script/codesign.sh sera exécuté et signé automatiquement.
$ git clone [email protected]:sterrasec/ipa-medit.git
$ cd ipa-medit
$ make build
Le fichier .ipa cible doit être signé avec un certificat installé sur votre ordinateur. Si vous souhaitez modifier la mémoire sur des applications tierces, veuillez utiliser un outil tel que ipautil pour la re-signature.
$ ipautil decode tap1000000.ipa # unzip
$ ipautil build Payload # re-sign and generate .ipa file
Pour le lancer, vous devez spécifier le chemin du fichier exécutable contenu dans le fichier .ipa avec -bin et l'identifiant du bundle avec -id.
$ unzip tap1000000.ipa
$ ipa-medit -bin="./Payload/tap1000000.app/tap1000000" -id="jp.hoge.tap1000000"
Pour le lancer, vous devez spécifier le nom du processus avec -name ou le pid avec -pid.
Le nom du processus et le pid de l'application iOS peuvent être vérifiés dans le Moniteur d'activité.
$ ipa-medit -name <process name>
Voici les commandes disponibles dans une invite interactive.
Recherche l'entier spécifié en mémoire.
> find 999986
Success to halt process
Scanning: 0x00000001025e4000-0x00000001025e8000
Scanning: 0x00000001025f4000-0x00000001025fc000
Scanning: 0x0000000102604000-0x0000000102608000
....
Scanning: 0x000000016eb34000-0x000000016ebbc000
Scanning: 0x000000016ebc0000-0x000000016ebe8000
Scanning: 0x000000016ebec000-0x000000016ec74000
Scanning: 0x000000016ec78000-0x000000016ed00000
Found: 1!!
Address: 0x10a2feea0
Par défaut, seuls les entiers sont recherchés lors du ciblage d'applications iOS fonctionnant sur iPhone, car l'API LLDB est lente. Lors du ciblage d'une application iOS fonctionnant sur Apple Silicon Mac, les chaînes de caractères seront également recherchées.
Vous pouvez également spécifier le type de données comme string, word, dword, qword.
> find dword 999994
Search Double Word...
Target Value: 999994([58 66 15 0])
Found: 1!!
Address: 0x11378aea0
Filtre les résultats de recherche précédents qui correspondent aux résultats de recherche actuels.
> filter 999842
Success to halt process
Found: 1!!
Address: 0x1087beea0
Écrit la valeur spécifiée à l'adresse trouvée par la recherche.
> patch 10
Successfully patched!
Attache au processus cible.
> attach
Success to halt process
Détache du processus attaché.
> detach
Success to continue process
Obtenez des informations sur le processus cible. Cela ne fonctionnera que si vous ciblez une application iOS fonctionnant sur un iPhone.
> ps
SBProcess: pid = 926, state = running, threads = 37, executable = tap1000000
State: Running
thread #1: tid = 0x545ee, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, queue = 'com.apple.main-thread'
thread #3: tid = 0x54619, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #4: tid = 0x5461a, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #5: tid = 0x5461b, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #6: tid = 0x5461c, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #7: tid = 0x5461d, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.uikit.eventfetch-thread'
thread #8: tid = 0x5461e, 0x00000001bd6791ac libsystem_kernel.dylib`__psynch_cvwait + 8, name = 'GC Finalizer'
thread #9: tid = 0x5461f, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 0'
thread #10: tid = 0x54620, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 1'
thread #11: tid = 0x54621, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 2'
...
thread #35: tid = 0x54659, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'AURemoteIO::IOThread'
thread #36: tid = 0x54662, 0x00000001bd679814 libsystem_kernel.dylib`__semwait_signal + 8
thread #37: tid = 0x54663, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.CoreMotion.MotionThread'
thread #38: tid = 0x54664, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Loading.PreloadManager'
Pour quitter medit, utilisez la commande exit ou Ctrl-D.
> exit
Bye!
Si vous obtenez l'erreur /private/var/containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/hoge.app: error: failed to get reply to handshake packet et que vous ne pouvez pas communiquer correctement avec le périphérique iOS et lldb, lancez Xcode et construisez une application, cela fonctionnera.
Si vous obtenez l'erreur Could not connect to lockdownd. et que vous ne pouvez pas communiquer correctement avec le périphérique iOS et ideviceinstaller, lancez Xcode et construisez une application, cela fonctionnera.
Si cela ne résout pas le problème, veuillez mettre à jour ideviceinstaller et libimobiledevice vers les dernières versions en utilisant l'exemple de commandes dans la section Requirements.
Cela peut être corrigé en installant le dernier code non versionné de libimobiledevice et ideviceinstaller en ajoutant l'option --HEAD lors de l'exécution de brew install.
MIT License