
Herramienta de modificación de memoria para ipa refirmados que soporta aplicaciones iOS ejecutándose en iPhone y Mac con Apple Silicon sin jailbreak.
Ipa-medit es una herramienta de búsqueda y parcheo de memoria para ipa refirmados sin hacer jailbreak. Soporta aplicaciones iOS ejecutándose en iPhone y Mac con Apple Silicon. Fue creada para pruebas de seguridad en juegos móviles. Muchos juegos móviles tienen detección de jailbreak, pero ipa-medit no requiere jailbreak, por lo que la modificación de memoria se puede realizar sin evitar la detección de jailbreak.
La modificación de memoria es la forma más fácil de hacer trampa en los juegos, es uno de los elementos a verificar en la prueba de seguridad. También existen herramientas de trampas que se pueden usar de manera casual como GameGem e iGameGuardian. Sin embargo, no había herramientas disponibles para dispositivos sin jailbreak y CUI, Mac con Apple Silicon. Por eso la hice como una herramienta de pruebas de seguridad. La versión para Android es sterrasec/apk-medit.
$ brew install --HEAD libplist
$ brew install --HEAD usbmuxd
$ brew install --HEAD libimobiledevice
$ brew install --HEAD ideviceinstaller
Descargue el binario desde GitHub Releases y colóquelo en su $PATH.
Puede compilarlo usando el comando make. Se requiere el compilador Go para compilar. Si apunta a una aplicación iOS que se ejecuta en una Mac con Apple Silicon, necesitará firmarla, pero script/codesign.sh se ejecutará y firmará automáticamente.
$ git clone [email protected]:sterrasec/ipa-medit.git
$ cd ipa-medit
$ make build
El archivo .ipa de destino debe estar firmado con un certificado instalado en su computadora. Si desea modificar la memoria en aplicaciones de terceros, use una herramienta como ipautil para refirmar.
$ ipautil decode tap1000000.ipa # descomprimir
$ ipautil build Payload # refirmar y generar archivo .ipa
Para iniciarla, debe especificar la ruta del archivo ejecutable contenido en el archivo .ipa con -bin y el bundle id con -id.
$ unzip tap1000000.ipa
$ ipa-medit -bin="./Payload/tap1000000.app/tap1000000" -id="jp.hoge.tap1000000"
Para iniciarla, debe especificar el nombre del proceso con -name o el pid con -pid. El nombre del proceso y el pid de la aplicación iOS se pueden consultar en el Monitor de Actividad.
$ ipa-medit -name <nombre del proceso>
Aquí están los comandos disponibles en un prompt interactivo.
Busca el entero especificado en la memoria.
> find 999986
Éxito al detener el proceso
Escaneando: 0x00000001025e4000-0x00000001025e8000
Escaneando: 0x00000001025f4000-0x00000001025fc000
Escaneando: 0x0000000102604000-0x0000000102608000
....
Escaneando: 0x000000016eb34000-0x000000016ebbc000
Escaneando: 0x000000016ebc0000-0x000000016ebe8000
Escaneando: 0x000000016ebec000-0x000000016ec74000
Escaneando: 0x000000016ec78000-0x000000016ed00000
Encontrado: 1!!
Dirección: 0x10a2feea0
Por defecto, solo se buscan enteros cuando se apunta a aplicaciones iOS ejecutándose en iPhone, porque la API de LLDB es lenta. Cuando se apunta a una aplicación iOS ejecutándose en Mac con Apple Silicon, también se buscarán cadenas.
También puede especificar el tipo de dato como string, word, dword, qword.
> find dword 999994
Buscar Doble Palabra...
Valor Objetivo: 999994([58 66 15 0])
Encontrado: 1!!
Dirección: 0x11378aea0
Filtra los resultados de búsqueda anteriores que coinciden con los resultados de búsqueda actuales.
> filter 999842
Éxito al detener el proceso
Encontrado: 1!!
Dirección: 0x1087beea0
Escribe el valor especificado en la dirección encontrada por la búsqueda.
> patch 10
¡Parcheado exitosamente!
Se adjunta al proceso objetivo.
> attach
Éxito al detener el proceso
Se desadjunta del proceso adjunto.
> detach
Éxito al continuar el proceso
Obtiene información sobre el proceso objetivo. Solo funcionará si está apuntando a una aplicación iOS ejecutándose en 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'
Para salir de medit, use el comando exit o Ctrl-D.
> exit
¡Adiós!
Si obtiene el error /private/var/containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/hoge.app: error: failed to get reply to handshake packet y no puede comunicarse correctamente con el dispositivo iOS y lldb, inicie Xcode y compile alguna aplicación, y funcionará.
Si obtiene el error Could not connect to lockdownd. y no puede comunicarse correctamente con el dispositivo iOS e ideviceinstaller, inicie Xcode y compile alguna aplicación, y funcionará.
Si esto no soluciona el problema, actualice ideviceinstaller y libimobiledevice a las versiones más recientes usando el ejemplo de comandos en la sección Requisitos.
Esto se puede solucionar instalando el código sin versión más reciente de libimobiledevice e ideviceinstaller agregando la opción --HEAD al hacer brew install.
Licencia MIT