[TOC]
Este artículo está impulsado por mi gran interés en la ingeniería inversa. Leí "Ingeniería inversa de aplicaciones iOS" e implementé una función interesante. Quiero compartirla con ustedes y también es un resumen simple de mi propio aprendizaje. Por cierto, iOS Reverse Forum iOSRe es una buena comunidad de comunicación inversa de iOS.
Todo el código y las herramientas para este ejemplo están alojados en GitHub. Consulte https://github.com/jackrex/FakeWeChatLoc.
Todo este artículo es puramente para entretenimiento personal y valor de aprendizaje. La tecnología relacionada es solo para aprendizaje y comunicación. ¡No la utilice con fines ilegales ni con ningún otro propósito comercial! ! !
El jailbreak del sistema iOS, para decirlo sin rodeos, es similar al Root de Android. Equivale a aumentar los permisos del teléfono móvil, permitiéndote controlar cosas que antes no podías controlar.
Dado que Objective-C es un lenguaje de alto nivel orientado a objetos, el formato de archivo Mach-O utilizado por iOS contiene una gran cantidad de información de metadatos, lo que nos permite usar class-dump para restaurar sus archivos de encabezado. Este es un buen comienzo para iOS. ingeniería inversa.
MobileSubstrate es un marco que permite que el desarrollo de iOS facilite el enlace. MobileSubstrate consta de las siguientes tres partes:
Sustrato móvil
Este tipo de sistema operativo derivado de Unix generalmente tiene la misma jerarquía de directorios. También puede comparar Android y MacOS y encontrará que muchos nombres de directorios son iguales. Escojamos algunos y los expliquemos brevemente:
`/bin binnary` ,系统常用的基本二进制文件 例如 cd, ls, ps 等
`/usr` 包含大多用户工具库
`/var variable` 存放经常更改的东西,例如 logs,用户数据,/var/mobile/Applications 是纺织AppStore 下载的 App
`/Applications` 存放所有系统App,以及从Cydia下载的App路径
`/Library` 存放了系统App的数据,其中有一个/Library/MobileSubstrate 目录,MobileSubstrate 是一个hook 功能开发平台,其中内容如下图所示,我们所开发的插件都被放置到这个里面
`/Library/MobileSubstrate` 里面文件类型主要有 dylib,plist
dylib 是动态加载库,就是tweak
plist 配合dylib 使用的filter 文件,指定注入目标,及hook的目标
`/System` 存放iOS 各种系统framework
`/User` 指向 /var/mobile 即是我们一般用户的主目录
La estructura Deb es en realidad un gzip del archivo de control de Aplicaciones de biblioteca en data.tar.gz y lo coloca en control.tar.gz.
Herramientas de uso común para depuración dinámica y análisis estático en ingeniería inversa:
class-dump es una herramienta que se utiliza para volcar todos los archivos de encabezado de una aplicación con jailbreak.
IDA es la mejor herramienta de descompilación. De hecho, la ingeniería inversa simple se puede completar utilizando solo IDA.
Hopper Disassembler se puede utilizar en OS X con una tarifa de licencia baja
La poderosa herramienta de depuración dinámica funciona con IDA para hacer que todo se mueva y permanezca quieto.
Una herramienta de depuración que facilita la depuración y el posicionamiento de la UI. Podemos identificar rápidamente qué interfaz de aplicación corresponde a una determinada clase.
Práctico software asistente de gestión de archivos
OpenSSH permite que su computadora inicie sesión en su teléfono de forma remota
Una herramienta muy poderosa que permite a los desarrolladores interactuar con aplicaciones desde la línea de comandos y ver y modificar aplicaciones en tiempo de ejecución.
Un software que administra cómodamente el sistema de archivos en teléfonos móviles, como iFunbox y Re manager de Android, que puede modificar archivos e instalar archivos binarios de Deb fácilmente.
APPsync es el parche instalado con más frecuencia después del jailbreak de iPhone, iPad y iPod touch. Después de la instalación, puede omitir la verificación de firma del sistema e instalar y ejecutar software ipa descifrado a voluntad.
Según el entendimiento anterior, dado que queremos simular el posicionamiento en WeChat, usamos WeChat como nuestro objeto de análisis. Utilice class-dump para exportar el archivo de encabezado de WeChat. Aunque vemos el método de exportación directa class-dump -H xxx -o output/ en el sitio web oficial de class-dump, no es posible descomprimir directamente el wechat en ipa y. volcarlo. Se descubrió que solo había el archivo CDStructures.h en la carpeta de salida y estaba vacío.
La razón de esto es que después de cargar en la AppStore, la AppStore cifra automáticamente todos los ipas, por lo que debemos descomponer el binario de WeChat antes de volcarlo.
Primero deberíamos probar el embrague más conveniente.
Cuando Clutch falla, intente los siguientes pasos. Necesitamos una herramienta como dumpdecrypted.dylib para volcar el shell en nuestra aplicación. Primero realizamos ssh en nuestro teléfono iOS, finalizamos todos los programas, abrimos WeChat y ejecutamos.
ps - e //列出当前运行的进程
TODO Puede ver que el proceso enumerado que comienza con /var/mobile/Containers/ es el proceso WeChat. Sabemos que la ruta de la zona de pruebas de todas las aplicaciones es /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E. -0E2C6541F879/ , pero no sabemos cuál es la App 03B61840-2349-4559-B28E-0E2C6541F879 . Sería muy complicado si acudimos al directorio para encontrarlas una a una.
En este momento cycript es útil, ejecute
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
De esta manera, obtenemos el directorio de Documentos de WeChat. A continuación, use scp o ifunbox para copiar dumpdecrypted.dylib al directorio de Documentos de WeChat.
Empieza a romper el caparazón
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted se generará en el directorio actual. Este es WeChat que ha sido desgranado. Antes de volcarlo, podemos usar la herramienta otool para ver la información del archivo de Match-o.
otool -H WeChat.descifrado
Utilice otool -l WeChat.decrypted para encontrar el cryptid y utilice lipo para dividir la estructura descifrada.
implementar
./class-dump -H WeChat.decrypted --arch armv7 -o output/
Genere una carpeta de Salida en el directorio actual, que contiene todos los archivos de encabezado exportados por WeChat, incluido el SDK de terceros, etc. Colocamos todos estos archivos de encabezado en un proyecto Xcode vacío para verlos fácilmente.
Basándonos en la intuición, descubrimos que Appdelegate es MircoMessengerAppDelegate de WeChat. Podemos ver aproximadamente la estructura del proyecto de WeChat, etc. De hecho, la ingeniería inversa también es una forma de aprender.
Luego, pensemos en la función que queremos implementar. Queremos cambiar nuestra ubicación para cambiar las personas cercanas. Podemos adivinar aproximadamente que esta clase debe enviarse a Ubicación cercana o similar, y podemos buscar el archivo de encabezado correspondiente.
Descubrimos que hay tantos después de buscar en Cerca, ¿cuál es?
De hecho, además del método de eliminación y la especulación uno por uno, podemos utilizar la poderosa herramienta Reveal para ayudarnos a localizar
Se puede decir que class-dump nos ayuda a enumerar el archivo de encabezado completo, dándonos una comprensión general de la estructura general del proyecto, pero el plan de implementación correspondiente en .m sigue siendo una caja negra para nosotros. En este momento necesitamos utilizar las poderosas herramientas de análisis de la IDA.
Abra IDA y seleccione nuevo
Sacamos el binario WeChat de Wechat.app y lo arrastramos al IDA anterior. Como estoy usando la CPU itouch 5 y la arquitectura es armv7, uso el primero si se usa incorrectamente, el desplazamiento obtenido por el punto de interrupción. estará mal, por lo que no podrá debitar normalmente.
Una vez completado el procesamiento, será como se muestra en la siguiente figura.
Entre ellos, podemos ver fácilmente la implementación de métodos específicos en MicroMessengerAppDelegate. Presione la barra espaciadora para expandirse al modo de visualización.
Aquí podemos ver la implementación en .m
La depuración dinámica es cuando no tenemos el código fuente, usamos lldb para establecer puntos de interrupción en la ubicación del código para la depuración. El objetivo principal es calcular la dirección de ejecución del código correspondiente y cómo depurar para obtener el valor que queremos. . Como se mencionó anteriormente, utilizamos los resultados de descompilación de IDA
iOS abre el servidor de depuración y escucha el puerto 1234 del servidor de depuración *:1234 -a "WeChat"
Ejecute lldb en Mac y manténgase conectado al servidor iOS. Ejecute el proceso lldb connect: //iOSIP:1234.
el desplazamiento es 0xd000
Obtener la dirección del punto de interrupción br s -a 0xd000+0x649D8 // Punto de interrupción inferior
Comience a depurar ni po y otros comandos de depuración
Inicie una aplicación directamente: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
Tweak significa "ajuste fino" en la palabra. En realidad, es la biblioteca de enlaces dinámicos de terceros dylib que está escrita en base a MobileSubstrate y puede cambiar la aplicación del enlace en tiempo de ejecución.
Theos es un conjunto de herramientas de desarrollo de jailbreak. Este método también se presenta en el "Libro de ingeniería inversa de aplicaciones de iOS", pero personalmente prefiero usar iOSOpenDev para crear proyectos (ps: después de familiarizarme con la línea de comando de git, pensé en usar sourceTree Más. intuitivo), así que lo mencionaré brevemente aquí. Parece que iOSOpenDev convierte la plantilla de NIC de línea de comandos en una visual. De hecho, casi no es tan difícil.
La instalación es muy sencilla. Descarga el instalador e instálalo.
Una vez completada la instalación, cree un nuevo proyecto y iOSOpenDev aparecerá en la plantilla de iOS.
Aquí elegimos Logos Tweak y la creación se completa de la siguiente manera
Hay un archivo fakeloc.xm, que es donde queremos escribir el código. Abra el archivo fakeloc.xm y podremos ver que el código que contiene se completa con logotipos. Para los logotipos, un nuevo lenguaje, no tiene que preocuparse. Su sintaxis básica es similar a Objc. Hay varias sintaxis específicas que requieren especiales. atención:
Sintaxis básica de Logos: %hook especifica la clase que necesita ser enganchada. Debe terminar con %end. %log escribe la información de la función en syslog para imprimir la información. %orig ejecuta la función enganchada y solo se puede ejecutar dentro del método específico de %hook. .
fakeloc.xm corresponde a fakeloc.mm
estamos arriba
Como puede ver en la Configuración de compilación, hay una columna en la parte inferior llamada Definir usuario. Aquí está nuestra parte personalizada. En el lugar iOSOpenDevDevice , escriba la dirección IP de nuestro dispositivo iOS (dirección LAN como 192.168.1.103). La premisa es que el dispositivo iOS tenga instalado OpenSSH.
Error de autenticación ssh iosod sshkey -h 192.168.1.109
Al principio, pensé que la creación de una aplicación con jailbreak debía escribirse en la sintaxis de Logos, lo que me asustó muchísimo. De hecho, el desarrollo de una aplicación con jailbreak para iOS es casi exactamente el mismo que el de una aplicación normal.
Primero, todavía creamos un proyecto. Al igual que crear un proyecto normal, también puedes usar CocoaPods para administrar tus bibliotecas de terceros.
Primero cree un nuevo proyecto como de costumbre, configúrelo de la siguiente manera y luego cambie la configuración de compilación.
Agregue Run Script y elimine el control de los recursos del paquete de copia
Estructura general del proyecto
Ejecutor de compilación para creación de perfiles
Después de generar App y Tweak, ¿cómo llamamos a Tweak en nuestra App? La respuesta es usar dlopen
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY); //TWEAK_PATH 是dylib 的地址
if (handle) {
NSLog(@"handle");
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
Luego obtenga dinámicamente la clase personalizada correspondiente.
Clase TweakBridge = NSClassFromString(@"TweakBridge");
Al principio me desconcertó este problema y finalmente adopté el método más estable y simple para lograrlo, que es leer y escribir datos en el mismo archivo. Este archivo se puede utilizar como medio para transmitir datos. Pero al principio puse el archivo en /var/mobile/xxx.plist, pero tweak no pudo leer el valor. La razón es que tweak y nuestra aplicación tienen permisos diferentes, por lo que necesitamos encontrar un lugar donde pueda estar. escrito públicamente. Este lugar es **/var/mobile/Library/Preferences/ ** Por lo tanto, nuestra interacción de información de aplicación y ajustes utiliza un método de escritura y el otro método de lectura para lograr el propósito de transmisión. Método directo, puedes proponerlo, discutámoslo juntos.
Entonces el código final es:
- (void)setLocWithLat:(double)lat andLng:(double)lng {
NSLog(@"set lat & lng is %f &&&& %f", lat, lng);
Class TweakBridge = NSClassFromString(@"TweakBridge");
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY);
if (handle) {
NSLog(@"handle");
TweakBridge = NSClassFromString(@"TweakBridge");
NSDictionary *dict = @{@"lat":[NSNumber numberWithDouble:lat], @"long":[NSNumber numberWithDouble:lng]};
BOOL isSuccess = [dict writeToFile:LOCATION_PATH atomically:YES];
NSLog(@"isSuccess, %d", isSuccess);
CLLocation *location = [[TweakBridge shareInstance] getCoreLocation];
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
}
Entonces, ¿cómo combinamos nuestro Tweak con nuestra aplicación para que los usuarios puedan usarlo directamente después de la instalación? En vista del formato deb que mencionamos anteriormente, el método de empaquetado, la estructura y el zip son en realidad los mismos y pueden ser instalados por el sistema iOS. Ya hemos explicado el formato y la estructura del paquete arriba, ahora cómo generar el paquete Deb.
Sacamos los directorios generados de dylib y app respectivamente.
Colóquelos todos en un directorio de paquetes separado. La estructura del directorio final se muestra a continuación.
Organizamos todos los archivos de acuerdo con la estructura de directorios organizada por Deb de acuerdo con la jerarquía que se muestra a continuación, y luego usamos el método dpkg-deb para empaquetar. Tenga en cuenta que es mejor no tener archivos .DS_Store en deb cuando escribí. siguiente script para eliminarlo. Genere archivos Deb al mismo tiempo.
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
El paquete de instalación generado es el siguiente, y luego lo colocamos en el dispositivo
Usamos iFunbox para arrastrar el fakeLoc .deb generado al directorio raíz, luego abrimos iFile en el teléfono y hacemos clic en fakeLoc.deb para instalar el programa. Después de la instalación, reinstalamos AppSync y reiniciamos el teléfono, y luego podemos abrir nuestra aplicación. , y también descubrimos que nuestra aplicación no se puede desinstalar manteniéndola presionada, al igual que las aplicaciones del sistema, Cydia, etc. Esto debería deberse a que la instalamos en /Aplicaciones. Para desinstalarla, podemos usar la línea de comando para eliminarla, o. Usa Cydia.
Una vez completada la instalación, simplemente reinicie el dispositivo.
Abra la aplicación, ingresemos la precisión y la latitud, y luego ejecútela. Finalmente, abra WeChat People Near para ver si las personas cercanas han cambiado. Si lo hacemos mejor, la latitud de precisión se selecciona en el mapa. La función es La explicación termina aquí. Los resultados de nuestras pruebas simples son los siguientes:
Podemos seleccionar diferentes ubicaciones en el selector de direcciones del mapa para realizar pruebas.
Puedes ver que la mayoría de la gente es de Beijing.
Personas cercanas simuladas con éxito en WeChat
Esto no es como publicar en la AppStore. Primero necesitas una fuente de alojamiento. Si no quieres crearla tú mismo, puedes usar thebigboss.org/hosting-repository-cydia/submit-your-app.
Complete la información relevante, éstas no serán descritas nuevamente.
Este artículo es una introducción al tema. Espero que tenga una comprensión preliminar del jailbreak de iOS, pueda completar cualquiera de sus propias aplicaciones y desarrollar ajustes más divertidos, por ejemplo, el complemento para capturar sobres rojos en WeChat. No parece difícil de implementar. Este proyecto de ejemplo está alojado en Github, donde fakeloc es dylib, es decir, tweak TestFakeTweak es el proyecto de la aplicación, HackAppTool. Nuestro artículo anterior describe las herramientas de terceros que deben usarse.
Dirección del proyecto: https://github.com/jackrex/FakeWeChatLoc
重新安装下AppSync 并重启SpringBoard
由于iOS7之后引入一些新的类库等,在iOS6设备上的兼容性一般,所以在工程的framework 中把 require 改为 option
root密码文件存放地方: / etc / master . passwd
用iFile的文本编辑功能打开master . passwd ,更改之前记得权限
你会找到类似这样的一行字符—— root : UlD3amElwHEpc : 0 : 0 :: 0 : 0 : System
UlD3amElwHEpc就是加密过的密码
把它更替为ab3z4hnHA5WdU ,这是对应的密码就是abc123 。
保存,重启。
有了密码abc123你就可以进一步修改成其它的密码了