2 votos

¿Una forma alternativa de obtener una captura de pantalla de Android en el shell?

Ok, primero me di cuenta de que una de mis aplicaciones de captura de pantalla en una tablet Android 7, no funcionaba (me daba una captura de pantalla en negro), y luego me di cuenta de que esta aplicación no tiene el permiso de "Captura de pantalla"; luego busqué este permiso en Ajustes, pero no pude encontrarlo; luego me di cuenta, que la aplicación bloquea Android causando el reinicio a veces cuando le pides que capture.

(EDIT: extrañamente, - en el contexto de los problemas en este post que se enumeran más adelante, - cuando traté de tomar una captura de pantalla con la prensa de "botón de encendido y el botón de bajar el volumen", funcionó bien).

Así que me las arreglé para entrar en el dispositivo, donde puedo conseguir Root, y quería emitir un comando de captura de pantalla, y terminó así:

# screencap -p out.png
stack corruption detected
Aborted 

Intenté lo mismo que un usuario normal, ahí se reportó:

$ screencap -p out.png
Segmentation fault 

Una mierda, ¿eh? Además lo he intentado:

# screenrecord out.mp4

... y esto colapsó a Android, y lo reinició.

Por lo tanto, llegar a por qué screencap no funciona, no parece un problema trivial - pero el dispositivo por lo demás funciona, la pantalla se muestra, etc.

Así que me preguntaba - ¿hay alguna manera alternativa para capturar una pantalla en este contexto (tienen Root en la cáscara en Android 7, la pantalla se representa y se muestra bien, todo lo que aparentemente funciona, aparte de screencap mismo)?

( Tal vez algunos /dev/... archivo del nodo del dispositivo, que cuando cat El programa de la pantalla, te da el contenido actual de la pantalla píxel por píxel (que me imagino que requerirá algo de decodificación antes de que se pueda ver, pero no es un problema, puedo usar tftp para transferir los archivos fuera del dispositivo) )


EDIT: Aquí está el fragmento relacionado de logcat cuando se produce la caída de la pantalla:

02-12 17:05:01.285 22745 22745 D AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
02-12 17:05:01.322 22745 22745 D AndroidRuntime: CheckJNI is OFF
02-12 17:05:01.551 22745 22745 D ICU     : No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
02-12 17:05:01.718 22745 22745 W System  : ClassLoader referenced unknown path: /vendor/lib64
02-12 17:05:01.719 22745 22745 W System  : ClassLoader referenced unknown path: /system/lib64
02-12 17:05:01.930 22745 22745 E memtrack: Couldn't load memtrack module (No such file or directory)
02-12 17:05:01.930 22745 22745 E android.os.Debug: failed to load memtrack module: -2
02-12 17:05:01.951 22745 22745 I Radio-JNI: register_android_hardware_Radio DONE
02-12 17:05:02.092 22745 22745 D AndroidRuntime: Calling main entry com.android.commands.am.Am
02-12 17:05:02.228 22745 22745 D AndroidRuntime: Shutting down VM
02-12 17:05:02.358 18887 22754 I OpenGLRenderer: Initialized EGL, version 1.4
02-12 17:05:02.358 18887 22754 D OpenGLRenderer: Properties::enablePartialUpdates 1
02-12 17:05:02.359 18887 22754 D OpenGLRenderer: Properties::useBufferAge 1
02-12 17:05:02.359 18887 22754 D OpenGLRenderer: Default swap behavior 0
02-12 17:05:02.359 18887 22754 D OpenGLRenderer: Swap behavior 0
02-12 17:05:04.259 16803 16803 W WindowManager: Attempted to remove non-existing token: android.os.Binder@73bede4
02-12 17:05:10.741 22761 22761 D AndroidRuntime: >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
02-12 17:05:10.756 22761 22761 D AndroidRuntime: CheckJNI is OFF
02-12 17:05:10.890 22761 22761 D ICU     : No timezone override file found: /data/misc/zoneinfo/current/icu/icu_tzdata.dat
02-12 17:05:11.019 22761 22761 E memtrack: Couldn't load memtrack module (No such file or directory)
02-12 17:05:11.019 22761 22761 E android.os.Debug: failed to load memtrack module: -2
02-12 17:05:11.024 22761 22761 I Radio-JNI: register_android_hardware_Radio DONE
02-12 17:05:11.080 16562 16562 I main    : type=1400 audit(0.0:613): avc: denied { read } for path="/dev/socket/zygote" scontext=u:r:zygote:s0 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1
02-12 17:05:11.080 16562 16562 I main    : type=1400 audit(0.0:614): avc: denied { getattr } for path="socket:[201098]" dev=sockfs ino=201098 scontext=u:r:zygote:s0 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1
02-12 17:05:11.081 22761 22761 D AndroidRuntime: Calling main entry com.android.commands.am.Am
02-12 17:05:11.100 16562 16562 I main    : type=1400 audit(0.0:615): avc: denied { write } for path="/dev/socket/zygote" scontext=u:r:zygote:s0 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1
02-12 17:05:11.118 16803 16855 I ActivityManager: Start proc 22770:android.process.media/u0a10 for broadcast com.android.providers.media/.MediaScannerReceiver
02-12 17:05:11.189 22770 22770 W System  : ClassLoader referenced unknown path: /system/priv-app/MediaProvider/lib/arm
02-12 17:05:11.293 22770 22783 D libEGL  : loaded /vendor/lib/egl/libEGL_tegra.so
02-12 17:05:11.306 22770 22783 D libEGL  : loaded /vendor/lib/egl/libGLESv1_CM_tegra.so
02-12 17:05:11.310 22770 22770 W System  : ClassLoader referenced unknown path: /system/priv-app/DownloadProvider/lib/arm
02-12 17:05:11.312 22770 22770 D ApplicationLoaders: ignored Vulkan layer search path /system/priv-app/DownloadProvider/lib/arm:/system/priv-app/DownloadProvider/DownloadProvider.apk!/lib/armeabi-v7a:/system/lib:/vendor/lib for namespace 0xa8751090
02-12 17:05:11.479 22770 22783 D libEGL  : loaded /vendor/lib/egl/libGLESv2_tegra.so
02-12 17:05:11.560 22770 22770 D MediaScannerReceiver: action: android.intent.action.MEDIA_SCANNER_SCAN_FILE path: /
02-12 17:05:11.562 16803 16852 I ActivityManager: Killing 19204:com.android.packageinstaller/u0a17 (adj 906): empty #17
02-12 17:05:11.564 22761 22761 D AndroidRuntime: Shutting down VM
02-12 17:05:11.579 16803 17333 D GraphicsStats: Buffer count: 7
02-12 17:05:11.580 16803 17283 D ActivityManager: cleanUpApplicationRecord -- 19204
02-12 17:05:11.603 22757 22757 F libc    : stack corruption detected
02-12 17:05:11.603 22757 22757 F libc    : Fatal signal 6 (SIGABRT), code -6 in tid 22757 (screencap)
02-12 17:05:11.604   127   127 W         : debuggerd: handling request: pid=22757 uid=0 gid=0 tid=22757
02-12 17:05:11.662 22787 22787 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
02-12 17:05:11.663 22787 22787 F DEBUG   : Build fingerprint: 'samsung/GT-P7500/GT-P7500:4.0.4/IMM76D/XXLQ8:user/release-keys'
02-12 17:05:11.663 22787 22787 F DEBUG   : Revision: '14'
02-12 17:05:11.663 22787 22787 F DEBUG   : ABI: 'arm'
02-12 17:05:11.664 22787 22787 F DEBUG   : pid: 22757, tid: 22757, name: screencap  >>> screencap <<<
02-12 17:05:11.664 22787 22787 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
02-12 17:05:11.683 22787 22787 F DEBUG   : Abort message: 'stack corruption detected'
02-12 17:05:11.683 22787 22787 F DEBUG   :     r0 00000000  r1 000058e5  r2 00000006  r3 00000008
02-12 17:05:11.683 22787 22787 F DEBUG   :     r4 a9bb957c  r5 00000006  r6 a9bb9524  r7 0000010c
02-12 17:05:11.683 22787 22787 F DEBUG   :     r8 beb7ba33  r9 00000001  sl 00000500  fp 00000005
02-12 17:05:11.683 22787 22787 F DEBUG   :     ip 00000016  sp beb7b760  lr a8f2b477  pc a8f2dccc  cpsr 000f0010
02-12 17:05:11.705 22787 22787 F DEBUG   : 
02-12 17:05:11.705 22787 22787 F DEBUG   : backtrace:
02-12 17:05:11.705 22787 22787 F DEBUG   :     #00 pc 0004cccc  /system/lib/libc.so (tgkill+12)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #01 pc 0004a473  /system/lib/libc.so (pthread_kill+34)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #02 pc 0001c649  /system/lib/libc.so (raise+10)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #03 pc 00018169  /system/lib/libc.so (__libc_android_abort+34)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #04 pc 00016910  /system/lib/libc.so (abort+4)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #05 pc 0001a627  /system/lib/libc.so (__libc_fatal+22)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #06 pc 0004b183  /system/lib/libc.so (__stack_chk_fail+6)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #07 pc 00001765  /system/bin/screencap
02-12 17:05:11.705 22787 22787 F DEBUG   :     #08 pc 00016061  /system/lib/libc.so (__libc_init+48)
02-12 17:05:11.705 22787 22787 F DEBUG   :     #09 pc 00001344  /system/bin/screencap
02-12 17:05:11.767 16803 16921 W NativeCrashListener: Couldn't find ProcessRecord for pid 22757
02-12 17:05:11.767 22787 22787 E         : AM data write failed: Broken pipe
02-12 17:05:11.769   127   127 W         : debuggerd: resuming target 22757
02-12 17:05:11.771 16803 16859 I BootReceiver: Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)

1 votos

No estoy seguro de si está relacionado, pero hay Xposed módulo DisableFlagSecure que me permite tomar capturas de pantalla de cualquier pantalla (incluso aplicaciones prohibidas como la banca)

1voto

sdaau Puntos 131

Bueno, resulta que hay algo que se puede intentar - copiar el framebuffer del dispositivo - pero todavía no resultó con la captura de pantalla completa del dispositivo para mí.

¿Por qué falta el FrameBuffer en algunos dispositivos Android?

en Android es /dev/graphics/fbX, usually /dev/graphics/fb0`

para mí:

 ls -la /dev/graphics/                                                                   
total 0
drwxr-xr-x  2 root root          80 2022-02-12 13:09 .
drwxr-xr-x 18 root root        2560 2022-02-12 13:10 ..
crw-rw----  1 root graphics 29,   0 2022-02-12 13:09 fb0
crw-rw----  1 root graphics 29,   1 2022-02-12 13:09 fb1

https://www.kernel.org/doc/html/latest/fb/framebuffer.html

Los dispositivos de memoria intermedia también son dispositivos de memoria normales, es decir, se puede leer y escribir su contenido. Puedes, por ejemplo, hacer una instantánea de la pantalla:

cp /dev/fb0 myfile

Y finalmente https://stackoverflow.com/questions/12456174/how-to-convert-a-raw-rgb-frame-buffer-file-to-a-viewable-format/16936538#16936538 :

Para no reinventar la rueda, he intentado reutilizar la herramienta existente: ...

He llamado al script de ese post get_android_fb_format.sh , es posible que tengas que cambiar la línea principal por esta:

    ffmpeg -f rawvideo -pix_fmt $item -s $FB_RESOLUTION -i androidFB $OUTPUT_DIR/$item.png

Por lo tanto, tratando desde el PC:

$ adb pull /dev/graphics/fb0 androidFB
adb: error: failed to copy '/dev/graphics/fb0' to 'androidFB': remote open failed: Permission denied

No se puede - debe hacer como Root desde el dispositivo:

# cd /sdcard/Download
# cp /dev/graphics/fb0 androidFB 

... que funcionaba; luego en el PC - adb pull guarda un archivo llamado androidFB en el dispositivo, en el que ejecuto el script:

$ adb pull /sdcard/Download/androidFB
$ bash get_android_fb_format.sh

Obtengo una carpeta fbresult/ creado, donde se pueden ver diferentes intentos de descodificación. Esta es la parte interesante:

  • Para mí, /dev/graphics/fb0 sostuvo el logo de arranque de Samsung (obtuve la decodificación correcta, pero me gustó esta):
    enter image description here
  • Sin embargo, /dev/graphics/fb1 siempre está en blanco

Así que, probablemente esto no es lo correcto - volver a ¿Por qué falta el FrameBuffer en algunos dispositivos Android? :

Ninguna aplicación de Android maneja directamente /dev/fb0 ¿Existe o no existe?
...
Ni siquiera el Flinger de la superficie puede ver el /dev/fb0 directamente.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X