Red de conocimiento informático - Conocimiento informático - Cómo habilitar el servicio de visualización del servidor en un teléfono Android

Cómo habilitar el servicio de visualización del servidor en un teléfono Android

La documentación oficial de Android menciona:

Para garantizar la seguridad, Hierarchy Viewer solo puede conectarse a dispositivos que ejecutan la versión para desarrolladores de Android.

En otras palabras, para garantizar la seguridad, el Visor de jerarquía solo puede conectarse a dispositivos que ejecutan la versión de desarrollador de Android (específicamente, solo puede conectarse si el parámetro ro.secure es igual a 0 y el El parámetro ro.debuggable es igual a 1 sistema Android). Cuando el Visor de jerarquía está conectado a un teléfono móvil, se debe iniciar un cliente llamado View Server en el teléfono móvil para comunicarse con el teléfono móvil a través de sockets. En teléfonos comerciales, View Server no se puede habilitar, por lo que Hierarchy Viewer no se puede conectar a teléfonos comerciales normales.

El código fuente de Android implementa esta restricción en el siguiente código:

Código fuente de Android root/frameworks/base/services/java/com/android/server/wm/WindowManageService .javaadb ventana 3 de llamada al servicio shell

Si el valor de retorno es: Resultado: Parcel(00000000 00000000 '.......') " significa que View Server está cerrado

Si El valor de retorno es: Resultado: Parcel(00000000 00000001 '...')" significa que View Server está abierto

Si tiene un teléfono móvil que puede abrir View Server (teléfono móvil de desarrollo de Android, simulador o teléfono que ha sido parcheado de acuerdo con los pasos de esta publicación de blog), puede usar el siguiente comando para abrir View Server:

adb shell service call window 1 i32 4939

Use The El siguiente comando cierra View Server:

adb shell service call window 2 i32 4939

Pasos de implementación:

Después de un poco de investigación y práctica, descubrí que mientras como lo tiene el teléfono. Si es root y está equipado con Busybox, puede habilitar Busybox modificando ciertos archivos en /system/framework del teléfono. Este artículo hace referencia a /tag/viewserver/, y los siguientes son los pasos específicos (el autor se basa en el sistema operativo Windows, si está utilizando el sistema operativo Linux, consulte la publicación original directamente):

La premisa es: tu teléfono móvil ha obtenido permisos ROOT y posee BUSYBOX

Además: lee atentamente los comentarios de esta publicación, tal vez obtengas algo nuevo.

1. Conecte el teléfono móvil comercial a la PC a través de USB para asegurarse de que el servicio adb se esté ejecutando normalmente.

2. teléfono móvil al ordenador.

Al realizar la copia de seguridad, asegúrese de que la estructura de carpetas de la PC donde se guarda el archivo de copia de seguridad sea la misma que /system/framework en el teléfono

Por ejemplo, cree una nueva carpeta ANDROID_SDK_ROOT\system\framework ( ANDROID_SDK_ROOT en este artículo se refiere a la instalación del directorio raíz del SDK de Android)

Luego salte a la carpeta ANDROID_SDK_ROOT\platform-tools en cmd e ingrese el siguiente código para realizar la copia de seguridad:

adb pull /system /framework ANDROID_SDK_ROOT\system/ framework

3. Vaya a adb shell y genere BOOTCLASSPATH:

Práctica recomendada:

1.

1. En adb shell echo $BOOTCLASSPATH > /sdcard/bootclasspath.txt

2. Regrese a Windows cmd y escriba adb pull /sdcard/bootclasspath.txt

3. bootclasspath.txt se guardará en C :\Users\la carpeta de su nombre de usuario

El contenido de este txt se utilizará en el paso 15.

4. Descargue las herramientas baksmali y smali. Estas dos herramientas se utilizan para descompilar y compilar archivos odex.

Descargar:

/u/5055823/baksmali-1.4.2.jar

/u/5055823/smali-1.4.2.jar

Supongamos que descargo estos dos archivos jar al directorio raíz del SDK de ANDROID.

5. Ejecute baksmali para descompilar el archivo services.odex en el marco del sistema:

java -jar ANDROID_SDK_ROOT\baksmali-1.4.2.jar -a 17 -x ANDROID_SDK_ROOT\system \framework\services.odex -d ANDROID_SDK_ROOT\system\framework

Descripción del parámetro: /p/smali/wiki/DeodexInstructions

Lo que queremos especificar es que después de "-a" El número representa el nivel API del sistema (relacionado con la versión del sistema). La relación entre la versión del sistema y el nivel de API es la siguiente:

\

(Por cierto, ni siquiera puedes ejecutar java -jar, ¿verdad? ¡Instala jdk!)

Si completa este paso con éxito, se creará una carpeta de salida en la misma carpeta (para mí era ANDROID_SDK_ROOT).

archivo dex: Dex es el nombre completo de la ejecución de la máquina virtual Dalvik, es decir, el programa ejecutable de Android Dalvik. No es un código de bytes de Java, sino un código de bytes de Dalvik, que son instrucciones de máquina hexadecimales.

Archivo odex: se forma un archivo dex optimizado en función del archivo dex optimizado para un modelo específico para mejorar la velocidad de ejecución del software y reducir el uso de RAM del software en ejecución.

archivo pequeño: convierte archivos dex en formato de código legible y descompila archivos en formatos generales.

6. Utilice Eclipse para abrir el archivo outcom\android\server\wm\WindowManagerService.smali

Busque la función .method private isSystemSecure()Z

=== === ============================================== === ===========

.método privado isSystemSecure()Z

.registers 4

.prologue

.line 5965

const-string v0, "1″

const-string v1, "ro.secure"

const-string v2 , "1 ″

invocar-estático {v1, v2}, Landroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/ lang/String;

mover-resultado-objeto v1

invocar-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

Mover resultado v0

if-eqz v0, :cond_22

const-string v0, "0″

const-string v1, "ro.

const-string v2, "0"

invoke-static {v1, v2}, Landroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/ lang /String; )Ljava/lang/String;

mover-resultado-objeto v1

invocar-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava /lang/ Objeto;)Z

mover-resultado v0

if-eqz v0, :cond_22

const/4 v0, 0×1

:goto_21

devolver v0

:cond_22

const /4 v0, 0×0

ir a :goto_21

método .end

=================================== ====== ===========================

En la penúltima línea de este código, es decir , las líneas 7 y 8, agregue "const/4 v0, 0×0" entre ":goto_21" y "return v0". Esto hará que el valor devuelto por v0 siempre sea 0 × 0, es decir, falso, omitiendo así el juicio de isSystemSecure en WindowManagerService.java.

La función .method private isSystemSecure()Z finalmente se convierte en:

========================= ========================================

privado esSystemSecure. ()Z

.registers 4

.prologue

.line 6276

const-string v0, "1″

const-string v1, "ro.secure"

const-string v2, "1″

invoke-static {v1, v2}, Landroid/os/ SystemProperties ;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

mover-resultado-objeto v1

invocar-virtual { v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

Mover el resultado v0

if-eqz v0, :cond_22

const-string v0, "0″

const-string v1, "ro.debuggable"

const-string v2, "0″

invocar - estático {v1, v2}, Landroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

Mover objeto-resultado v1

invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

Mover el resultado v0

if-eqz v0, :cond_ 22

const/4 v0, 0×1

:goto_21

const/4 v0, 0×0

devolver v0

:cond_22

const/4 v0, 0×0

ir a :goto_21

. método final

========================================== === ===========================================

7 Ahora ejecute smali y vuelva a compilar: <

java -jar SMALI-1.4.2.jar -o Classes.dex

En este punto, el archivo Classes.dex debería. aparece en la carpeta de archivos ANDROID_SDK_ROOT

8. Descarga la utilidad zip para Windows:

/u/5055823/zip.exe

Supongamos que también pongo zip. exe En la carpeta ANDROID_SDK_ROOT

9. Asegúrese de que todos los comandos contenidos en la línea de comando cmd actual se hayan ejecutado

10. Asegúrese de que el directorio de ejecución de la línea de comando cmd actual sea ANDROID_S.

DK_ROOT, ejecute:

zip.exe services_hacked .jar. /classes.dex

Esta vez en la carpeta ANDROID_SDK_ROOT, aparece el paquete services_hacked.jar

10. Ingrese a adb shell, ingrese su para obtener permisos ROOT

11. Luego ingrese mount para verificar qué partición está montada/sistema. Por ejemplo, mi partición de montaje es:

\

A continuación, ingrese el siguiente comando para volver a montar /system y cambiar los permisos en /system (reemplace "/dev/ block/mmcblk0p25 "reemplazar con su partición de montaje /system):

Luego, ingrese adb shell e ingrese su para obtener permisos ROOT

11. (Reemplace "/dev/ block/mmcblk0p25 "replace con su partición de montaje /system):

mount -o rw,remount -t yaffs2 /dev/block/mmcblk0p25

chmod -R 777 /system , haciendo que /system esté disponible para nosotros para modificar a voluntad

Esto es principalmente para el paso 17 para cambiar los permisos de /system/framework.services.odex en /system/framework. Si este paso no tiene éxito, es posible que obtenga un error en el paso 17 indicando que no tiene permisos suficientes para reemplazarlo (sistema de archivos de solo lectura)

12. Descargue el archivo dexopt-wrapper

/u/5055823/dexopt-wrapper

También colocaremos el archivo dexopt-wrapper en la carpeta ANDROID_SDK_ROOT

13 Copiamos services_hacked.jar y dexopt-wrapper a /. carpeta data/local/tmp del teléfono móvil

adb push ANDROID_SDK_ROOT/services_hacked.jar /data/local/tmp

adb push ANDROID_SDK_ROOT/dexopt-wrapper /data/local/tmp

14. Vaya a adb shell, escriba su y luego configure dexopt-wrapper en 777

chmod 777 /data/local/tmp/dexopt-wrapper

15. En adb shell, vaya a la carpeta /data/local/tmp y ejecute:

./dexopt-wrapper ./services_hacked.jar ./services_hacked.odex

Este paso es la séptima parte de la generación del archivo dex, que eventualmente se optimizará en un archivo odex.

============================================ === ================================================= === ======

Por ejemplo, mi comando es ./dexopt-wrapper ./services_hacked.jar ./services_hacked.odex /system/framework/core.jar:/system/framework /core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/

framework.jar:/system/framework/framework2.jar: /system/ framework/android.policy.jar:/ system/

framework/apache-xml.jar:/system/framework/HTCDev.jar:/system/framework/HTCExtension.jar:/system/

framework/ filterfw.jar:/system/framework/com.htc.android.bluetooth.jar:/system/framework/wimax.jar:

/system/framework/usbnet .jar: /system/framework/com.orange.authentication.simcard.jar:/system/framework/com.htc.android.bluetooth.jar:/system/framework/wimax.jar:

jar :

=========================================== ==== ======================== ======================= ==== ====

Esto generará nuestro propio odex en la carpeta /data/local/tmp: services_hacked.odex

16 firma hacked.odex:

busybox dd if=/system/framework/services.odex of=/data/local/tmp/services_hacked.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

Descripción de parámetros:

if = archivo de entrada

of = archivo de salida

bs = tamaño de bloque (1 byte)

count = número de bloques

skip = desplazamiento del archivo de entrada

seek = desplazamiento del archivo de salida

conv=notrunc - No trunca el archivo de salida.

17. sistema/framework y reemplace services.odex con nuestro propio services_hacked.odex.

dd if=/data/local/tmp/services_hacked.odex of=/system/framework/services.odex

Después de ejecutar este paso, el teléfono estará en poco tiempo (¡Se reiniciará automáticamente después de menos de 1 minuto)! ¡Un momento, por favor!

18. Después de que el reinicio sea exitoso, use el siguiente comando para abrir View Server:

adb shell service call window 1 i32 4939

Use el siguiente comando para comprobar si View Server está abierto:

ventana 3 de llamada al servicio de shell adb

Si el valor de retorno es Resultado: Parcel(00000000 00000001 '...'), significa que sí. ha sido abierto!