Cómo conectar el SDK de Android1.1 Descripción general Xposed es un proyecto de secuestro dinámico diseñado por rovo89 en GitHUB para la plataforma Android. Controla el proceso del cigoto reemplazando el programa /system/bin/app_process, de modo que app_process carga el paquete jar XposedBridge.jar durante el proceso de inicio, completando así el secuestro de las aplicaciones del sistema. El entorno de ejecución básico del marco Xposed es el siguiente: dado que Xposed funciona reemplazando archivos en el directorio /system/bin, se requieren permisos de root durante la instalación, pero no se requieren permisos de root durante la ejecución. Necesitarás ejecutar Xposed en una máquina con Android 4.0 o superior. 2. Los recursos de Xposed en GitHub se pueden clasificar de la siguiente manera: XposedBridge.jar: XposedBridge.jar es un archivo jar proporcionado por Xposed y es responsable de interactuar con la capa FrameWork de la capa nativa. /XposedBridge.jar: XposedBridge.jar es un archivo jar proporcionado por Xposed y es responsable de interactuar con la capa FrameWork de la capa nativa. Se carga cuando se inicia el proceso /system/bin/app_process, y el resto de los módulos se basan en este paquete jar. XposedBridge proporciona métodos JNI para XposedBridge. XposedInstaller: instalador de Xposed, responsable de configurar el entorno de trabajo de Xposed y administrar los módulos basados en el framework Xposed. XposedMods: Módulos desarrollados con Xposed. AppSettings es una aplicación que permite la gestión dinámica de permisos 1.2 Mecanismo: 1.2.1 Zygote En Android, los procesos de aplicación se traman a partir del proceso Zygote, el cual se inicia mediante el proceso Init. El proceso Zygote crea una instancia de máquina virtual Dalvik cuando se inicia. Cada vez que se genera un nuevo proceso de aplicación, copia la instancia de la máquina virtual Dalvik al nuevo proceso de aplicación, de modo que cada proceso de aplicación tenga una instancia de máquina virtual Dalvik independiente. Durante el proceso de inicio, además de crear una instancia de máquina virtual Dalvik, el proceso Zygote también carga la biblioteca de tiempo de ejecución de Java en el proceso y registra algunos métodos JNI de las clases principales de Android en la instancia de máquina virtual Dalvik creada previamente. Tenga en cuenta que cuando un proceso Zygote genera un proceso de aplicación, no solo obtiene una copia de la instancia de VM Dalvik en el proceso Zygote, sino también la biblioteca de tiempo de ejecución Java de Zygote. Es por eso que cada aplicación de Android puede cargar el archivo XposedBridge. XposedBridge tiene un método nativo privado (JNI) hookMethodNative, que también se utiliza en app_process. Esta función proporciona un objeto de método para anular métodos integrados utilizando el mecanismo de reflexión de Java. Para una implementación específica, consulte el análisis del código fuente de Xposed a continuación. 1.2.2 Ganchos/Método de reemplazo Los ganchos son lo que hacen que el marco Xposed sea realmente útil. En la tecnología Repackage, si desea realizar cambios en el APK, debe modificar las instrucciones en el código Smali. Otra técnica para modificar instrucciones dinámicamente es reemplazar código pequeño basándose en una búsqueda de coincidencias en tiempo de ejecución, pero este enfoque también es más complejo debido a la variedad y complejidad de las declaraciones de métodos. Cuando se inicia Android, el proceso cigoto carga XposedBridge y apunta todos los métodos reemplazados al método nativo xposedCallHandler a través del método JNI hookMethodNative.
Toma un objeto de método como parámetro de entrada (que se puede obtener utilizando el mecanismo de reflexión de Java) y cambia la definición del método en la máquina virtual Dalvik. Cambia el tipo del método a un tipo local y vincula la implementación del método al método de su clase genérica local. En otras palabras, cuando se llama a un método enlazado, se llama al método de clase genérico sin ningún impacto en la persona que llama. La implementación hookMethodNative llama al método handleHookedMethod en XposedBridge para pasar parámetros. El método handleHookedMethod es similar a la rutina de despacho unificado y su función subyacente de C++ es xposedCallHandler. La implementación de handleHookedMethod seleccionará funciones de enlace apropiadas según la estructura global hookedMethodCallbacks y llamará a sus funciones antes y después. Cuando varios módulos conectan un método al mismo tiempo, Xposed organizará automáticamente la prioridad de las devoluciones de llamada de acuerdo con la prioridad del módulo. La secuencia de devolución de llamada es la siguiente: A.before -> B.before -> método original -> B. after -> A. análisis del código fuente after2 2.1 La clasificación de archivos del módulo Cpp es la siguiente: app_main.cpp: similar a frameworks/base/cmds/app_process/app_main.cpp en AOSP, es decir, el código fuente de /system/bin/ app_process, la identidad real de la aplicación es zygote. Para obtener un análisis del proceso Zygote, consulte Proceso Zygote en Android: AOSP&Core. xposed.cpp: proporciona la función de llamada de app_main.cpp y la implementación del método JNI de XposedBridge. xposed.h, xposed_offsets.h: el archivo de encabezado de app_main.cpp en el marco Xposed es diferente del app_main.cpp en AOSP, principalmente porque la lógica de llamar a la función runtime.start () es diferente. app_main.cpp en el marco Xposed elegirá cargar la clase XposedBridge o la clase ZygoteInit o RuntimeInit según la situación. La carga real de XposedBridge y el registro del método JNI se produce en el cuarto paso: xposedOnVmCreated. 1. Contiene cutils/properties.h, que se utiliza principalmente para obtener y configurar variables de entorno. xposed.cpp necesita configurar XposedBridge en ClassPath. 2. Contiene xposed.cpp. ClassPath Contiene dlfcn.h, utilizado para operar bibliotecas de enlaces dinámicos. Contiene xposed.h, que se utiliza para llamar a funciones en xposed.cpp, como registrar funciones JNI al crear una máquina virtual. 4. Agregue initTypePointers, para usar con SDK de Android mayores o iguales a 18, y se usarán para configurar funciones JNI. Agregue la función initTypePointers para el SDK de Android mayor o igual a 18, el puntero de función atrace_set_tracing_enabled se obtendrá y se llamará cuando se inicie Zygote. 5. Agregue la llamada a la función xposedOnVmCreated en la función onVmCreated de la clase AppRuntime. 6. Cambie el nombre de todos los Log* en el código fuente a ALog*, de modo que Logv se reemplace por Alogv. El código fuente de Log* pasó a llamarse ALog*, por lo que Logv fue reemplazado por Alogv, pero las funciones siguieron siendo las mismas. 7. Se agrega una gran cantidad de código al comienzo de la función Principal, pero se puede ignorar para las versiones del SDK inferiores a 16.