iOS: agrega "objetos" a la aplicación existente(con jailbreak)
tweak tampering (2)
¿Cómo agregar "objetos" a una aplicación existente?
Por ejemplo, el ajuste EasyRefresh for Chrome , habilita un nuevo botón dentro de la aplicación Chrome de iOS, al igual que muchos otros ajustes.
¿Cómo puedo agregar un UIButton
simple a, por ejemplo, la aplicación de Twitter?
¿Hay algún proyecto de GitHub que pueda ayudarme a entender cómo se hace?
Fuente de la imagen: ModMyI
Gracias.
El truco implica algo de ingeniería inversa (muy básica) y se compone de varios pasos; Trataré de explicarlos lo más claramente posible.
Paso cero: si la aplicación se descarga desde AppStore, se cifra. Tienes que descifrarlo usando uno de los scripts / aplicaciones que normalmente se usan para descifrar aplicaciones; una secuencia de comandos de línea de comandos es poedCrack.sh (google, lo encontrará rápidamente en uno de los sitios de pegado), una aplicación GUI es Crakculous (está disponible en Cydia). Tenga en cuenta que uno de estos son necesarios para un descifrado fácil (automático): el método de descifrado manual es demasiado complicado para poner una respuesta de , por eso sugiero estas herramientas.) Sin embargo, no aliento de ninguna manera. usted para crackear aplicaciones! (Básicamente, te estoy pidiendo que no uses estas herramientas para su propósito original :) Si quieres echar un vistazo al proceso de descifrado manual, dirígete aquí.
Paso uno: debes hacer las clases que la aplicación usa / crea. Para esto, necesita la utilidad class-dump o class-dump-z. Esta aplicación de línea de comandos invierte el archivo ejecutable binario de la aplicación y genera declaraciones de interfaz para todas las clases de Objective-C que la aplicación usa y tiene dentro. Puede encontrar class-dump-z, la variante más avanzada y preferida here.
Paso dos: después de tener las declaraciones de clase, tendrás que adivinar qué clase hace qué y cuándo (sí, un poco confuso). Por ejemplo, en uno de los archivos generados desde la aplicación anterior, Google Chrome, por class-dump-z, puede encontrar algo similar:
@interface ChromeUrlToolbar: UIToolbar {
UISearchBar *urlBar;
}
- (id)initWithFrame:(CGRect)frame;
- (void)loadURL:(NSURL *)url;
@end
Bueno, eso suena bien, ¿no? Puede ver que su implementación tiene un método initWithFrame: (como todas las subclases UIView), ¿por qué no intentar modificarlo?
Paso tres: para esta modificación, necesitarás MobileSubstrate . MobileSubstrate es una biblioteca de desarrolladores creada por Saurik, el creador de Cydia, para facilitar la inyección de código a las aplicaciones. Puedes encontrar algunos tutoriales realmente buenos en la web, incluido este . Entonces, tienes una clase y quieres "engancharla", así que escribes un código como este:
static IMP __original_init; // A
id __modified_init(id __self, SEL __cmd, CGRect frame) // B
{
__self = __original_init(__self, __cmd, frame); // C
// D
UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[newButton setTitle:@"Chrome Pwned"];
newButton.frame = CGRectMake(0, 0, 100, 40);
[__self addSubview:newButton];
return __self;
}
// E
__attribute__((constructor))
void init()
{
Class clazz = objc_getClass("ChromeUrlToolbar"); // F
MSHookMessageEx(clazz, @selector(initWithFrame:), __modified_init, &__original_init); // G
}
Explicación: vamos a empezar desde el final. La función de init
(E) se declara __attribute__((constructor))
. Eso significa que se llama automáticamente cuando la biblioteca que crearemos a partir de este código se cargará en Chrome. Eso es exactamente lo que queremos porque queremos modificar el comportamiento de nuestra aplicación antes de haberla iniciado.
En la línea marcada // F
, capturamos el objeto de clase que queremos modificar. Objective-C es un lenguaje altamente dinámico; eso significa que podemos obtener y modificar información sobre las clases y los objetos en tiempo de ejecución. En la línea marcada // G
, usamos la función más importante de la API de MobileSubstrate: MSHookMessageEx. Para entender cómo funciona (más bien lo que hace), debe saber lo siguiente: Objective-C se implementa como una biblioteca de C simple: el lenguaje en sí, bajo los capítulos, es simplemente C. Por lo tanto, todos los mensajes se envían en Obejctive -C es en realidad una llamada a la función C. Estas funciones de C tienen dos argumentos especiales: self
y cmd
: el primero es el puntero al objeto que se está enviando, el último es el selector (un puntero único y especial al nombre del mensaje que se envía). Entonces, lo que MSHookMessageEx hace es tomar una clase y un selector, encuentra la implementación de la función correspondiente e intercambia esa función con la función suministrada en su tercer argumento ( __modified_init
en este caso). Para no perder datos, también devuelve la función en su 4to parámetro (aquí está __original_init
).
Entonces, ahora que la inicialización de la barra de herramientas de la URL de Chrome se redirige a nuestra función, ¿qué hacemos a continuación? Bueno, nada especial: primero llamamos a la función de inicialización original (observe los primeros dos argumentos especiales, __self y __cmd!) Que crea la barra de herramientas como si normalmente (esta línea de código se denota por // C
). Luego, hacemos la modificación real: en la sección // D
, creamos un UIButton, establecemos su título y lugar, y agregamos una subvista a nuestra barra de herramientas recién creada. Luego, sabiendo que esta es una función de inicialización, devolvemos la instancia original junto con el código de nuestro botón inyectado en ella.
Bueno, eso es básicamente lo que necesitas saber sobre esto; Si está interesado en detalles más profundos sobre cómo funciona Objective-C y cómo puede crear ajustes geniales de iOS, le sugiero que lea la documentación oficial de Apple sobre el tema y que pueda navegar por algunos de mis ajustes Cydia de código abierto. también.
¡Espero que esto ayude!
Necesita hacer esto para comprender cómo funciona el tiempo de ejecución de Objective-C. Especialmente el sistema de mensajería (es decir, llamar a un método). En particular, los métodos para llamar se determinan en tiempo de ejecución, en comparación con otros idiomas donde se encuentra en tiempo de compilación. Esto permite el cambio global de métodos particulares, también conocido como método swizzling .
Usando la MobileSubstrate , se le permitirá reemplazar cualquier implementación de método con la suya, e incluso llamar a la implementación original. Por supuesto, usted necesita saber el nombre del método y el argumento que toma, así como la clase a la que pertenece.
Entonces, para modificar el SpringBoard, por ejemplo, deberías saber qué clase contiene y qué método. Tendrá que usar la utilidad class-dump
o class-dump-z
, que lo hace por usted ( class-dump-z
es más reciente y más usado para el desarrollo de iOS, class-dump
es más versátil y compatible con binarios más antiguos como así como 64 bits).
Entonces, para volcar el SpringBoard en clase, deberías ingresar en Terminal.app
class-dump -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard
Para class-dump-z, la opción -p
generará @property
lugar de getters / setters, lo que es más claro, por lo que probablemente escriba
class-dump-z -p -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard
Esa línea creará una carpeta en su escritorio con todas las definiciones de clases de SpringBoard. Por supuesto, es posible que deba cambiar la ruta de acceso a una adecuada para su sistema (al respecto, para las versiones recientes de Xcode, la carpeta del desarrollador está en Xcode, por lo que necesitará algo como
/Applications/Xcode/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard
También puede encontrar en Internet personas que lo hicieron por usted para la mayoría de los marcos existentes, esto es muy útil si se asegura de que estén en la versión correcta para su sistema.
Ahora, para las aplicaciones de la AppStore, primero tendrá que descifrarlas ya que están protegidas. Probablemente deba encontrar los nombres y los enlaces de cada uno, ya que esto probablemente esté en contra de los Términos de Uso del Desbordamiento de Pila, aunque el uso de gdb
puede lograr ese propósito.
Para facilitar el trabajo, se han creado algunas herramientas como Logos (es probable que también necesite ver Theos ) que reducen el código necesario. También hay una plantilla xcode (bastante antigua) y un tutorial para el soporte móvil que proporciona una buena ayuda.
Logos hace que sea fácil enganchar el método del method
de la clase nombre de classname
:
%hook classname //declares the class from your application you''re going to override
-(void)method {
dosomethingnew(); //put all your new code for the method here
return %orig; //this calls the original definition of the method
}
%end //end hooking classname
Para obtener una lista de los marcos en el sistema y para qué sirven, vea here
Lo último: una lista de ajustes populares que se abren (enlaces a GitHub cuando sea posible):
- Personalizador Chrome
- MobileNotifier
- UISettings (la versión de iOS 5 también estaba aquí, ¿pero parece que se retiró?)
- Spire
- IconRenamer
- Maxoimizer
- IconRotator
- QuickReply
- WinterBoard
- Veency
Finalmente, eche un vistazo a WeekTweak , ellos lanzan tweak de código abierto cada semana para que pueda aprender mirando la fuente de otra persona para probar y hacer sus propias cosas. Y el #theos chan en IRC (irc.saurik.com) también proporcionará ayuda si lo pides amablemente.