jueves, 20 de septiembre de 2018

Vídeos 4K en Ubuntu 18

Hola a todos, esta semana he tenido que probar si funcionan los vídeos 4K en Ubuntu 18, y la respuesta es que depende.

Vamos a dejar una cosa clara: un vídeo a 4K es mucha tela marinera. Estamos hablando de una resolución de 3840x2160. Muchos piensan que es el doble de Full HD (1920x1080) pero en realidad es el cuádruple (multiplicas por dos en ancho y luego por dos en largo). Para que os hagais una idea, podríais ver más de 15 DVDs a la vez en una pantalla 4K.

Otra cosa que hay que dejar clara es que hay infinidad de formatos de compresión de vídeo, los llamados "codecs". De hecho los hay con pérdida (la mayoría) y sin pérdida (que no pierden nada de calidad al comprimir la información a costa de ser vídeos que ocupan terabytes de datos).

Por último decir que hay que distinguir entre el codec y el contenedor de vídeo. Un contenedor puede ser por ejemplo el formato AVI o el formato MKV. Estos contenedores indican cómo se guarda la información de audio y de vídeo, pero no cómo se codifican. Es decir, un vídeo en AVI puede haber sido codificado por cualquier codec.

Y en este mar de codecs y de contenedores de vídeo llegó un momento en que un grupo de empresas se puso de acuerdo y crearon el formato MP4. ¿Que aporta? Pues los formatos MPEG son un estándar que definen no sólo el contenedor sino tambien el conjunto de codecs soportados.

¿Qué quiere decir todo esto? Que si tienes un vídeo AVI o MKV a priori no sabes si tu reproductor de vídeo sabrá reproducirlo (dependerá de los codecs), pero si tienes un vídeo en MP4 seguro que sí se reproduce (porque es un estándar).

Llegados a este punto, hay que relacionar las dos cosas: vídeo 4K con formato de vídeo. Un formato AVI o MKV donde el vídeo puede estar codificado de cualquier forma, se decodifica a base de CPU. Si intentas reproducir un vídeo 4K en Linux con el VLC (por ejemplo) en formato AVI o MKV no sólo irá dando tirones sino que verás como tu CPU se pone al 100% con el consiguiente consumo de batería.

Sin embargo, si reproduces un vídeo 4K en formato MP4 ahí entra en juego la aceleración de vídeo incluída en la tarjeta gráfica. Lo que a efectos prácticos significa que el vídeo se reproduce bien y el consumo de CPU del reproductor de vídeo será de menos de un 20%.

Para hacer pruebas podéis descargaros muestras de vídeos en formato MP4 de internet: http://4ksamples.com/

¿Y qué tiene que ver Ubuntu 18 con todo esto? Pues para empezar que los drivers de aceleración de vídeo vienen preinstalados. En Ubuntu 14 y Ubuntu 16 había que instalarlos a mano y actualizar el reproductor de vídeo, pero en Ubuntu 18 seguramente no tendrás que hacerlo.

La típica tarjeta gráfica barata de Intel integrada en la placa base que en Linux usa el driver i915 cuenta con el VA-API ya preinstalado en Ubuntu 18, de forma que el VLC lo usará inmediatamente. Aunque os recomendaría cambiar al MPV porque tiene un rendimiento un poco mejor. Y os recomiendo desinstalar Totem porque es más lento que el caballo del malo.

Para los angloparlantes aquí dejo algo más información sobre las gráficas Intel:
  https://wiki.ubuntu.com/IntelQuickSyncVideo

Así que ya veis, nada que instalar, nada que configurar, ... todo listo para usar con Ubuntu 18. Es más, los vídeos 4K de Youtube también están en formato MP4, lo que hace que podáis visualizarlos correctamente en vuestro Firefox (si contáis con un buen ancho de banda).

Por fin he dejado de avergonzarme de la reproducción de vídeo en GNU Linux. Personalmente se me caía la cara de vergüenza cuando veía una tablet Android barata reproducir vídeos MP4 con buena resolución y un consumo mínimo de CPU mientras mi PC caro con un GNU Linux no podía con esos vídeos (siendo en el fondo el mismo kernel).

RESUMIENDO: Se pueden ver vídeos en 4K en Ubuntu 18 sólo en formato MP4.

Salu2 a to2

sábado, 10 de marzo de 2018

Quitando el dnsmasq de Ubuntu

Hola a todos, en la oficina tenemos un DNS interno (en el Active Directory) que resuelve ciertas rutas de nuestra intranet, y el dnsmask que tiene por defecto en las distribuciones de Linux se lleva fatal con eso. Además yo odio el dnsmask, estoy acostumbrado a editar mi fichero "/etc/resolv.conf" y me toca las narices el dnsmask.

La solución pasa por desactivarlo, para ello basta con editar el fichero /etc/NetworkManager/NetworkManager.conf, y comentar la siguiente línea:

#dns=dnsmasq

En cuanto reinicies debería pillarte los DNS que configure tu DHCP y agregártelos ordenadamente el fichero /etc/resolv.conf.

No obstante alguna vez me he encontrado con algo raro, que el DNS resolvía los nombres pero las aplicaciones no. Es decir, el comando "host" funcionaba, pero el "ping" o el "wget" no. Veámoslo con un ejemplo, el siguiente comando funcionaba y resolvía la IP:

host loquesea.midominio.local

Pero el siguiente comando fallaba y no resolvía la IP:

ping loquesea.midominio.local

Esto indica que básicamente está fallando la función "gethostbyname" de glibc. Para ello hay que revisar el fichero /etc/nsswitch.conf. En concreto la línea que empieza por "hosts" y quitar de enmedio el "[NOTFOUND=return]" y ya de paso el "mdsn4_minimal". De esta forma primero resolverá por "files" (es decir, lo que tengas en /etc/hosts) y luego por DNS.

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

#hosts:          files mdns4_minimal [NOTFOUND=return] dns

hosts:          files dns 

networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis




Este fichero configura las bases de datos a utilizar para todas las llamadas de glibc que resuelven nombres mediante DNS. Para más información podéis hacer un:

man nsswitch.conf


¿Que cuál es la raíz del problema? Por lo visto el problema radica en que Linux utiliza por defecto el ".local" para indicar las resoluciones DNS por multicast (eso es lo que hace el "mdns4_minimal").

Podéis este blog en inglés que explica un poco más sobre este tema:
  http://www.lowlevelmanager.com/2011/09/fix-linux-dns-issues-with-local.html

Salu2 a to2

jueves, 30 de noviembre de 2017

Poniendo el número de serie al emulador Android

Hola a todos. Al ir a obtener el número de serie del emulador mediante la propiedad:
   android.os.Build.SERIAL

detecté que devolvía el valor "unknown". Haciendo un "adb shell getprop" vi que la propiedad "ro.serialno" estaba vacía.

Tras muchas vueltas vi que Android Studio crea un fichero de configuración en la ruta C:\Users\<nombre de usuario>\.android\avd\<nombre del AVD>.avd\config.ini donde pueden modificarse los valores para iniciar el emulador. 

Así que hay que añadir al final de ese fichero una línea para añadir el número de serie a los parámetros del kernel:
   kernel.parameters = androidboot.serialno=123456789

De esta forma rellenamos ese "ro.serialno" que a su vez rellena el android.os.Build.SERIAL.

Salu2 a to2

jueves, 23 de marzo de 2017

Aplicaciones de Java sin ventanas

Hola a todos. A menudo ocurre que queremos ejecutar una aplicación Java en un servidor pero tiene algo, alguna librería, algo que ejecuta que necesita el sistema de ventanas X y que provoca una excepción java.awt.HeadlessException. Para evitar que esto ocurra hay dos formas, la simple y la compleja.

La forma simple, aunque no siempre funciona, es ejecutar la máquina virtual Java con los siguientes parámetros: -Djava.awt.headless=true -Dawt.toolkit=sun.awt.HToolkit

Si esto funciona perfecto, si no os funciona tendréis que recurrir a la compleja. Esta otra forma es utilizar las librerías de GhostAWT (https://github.com/Danielku15/GhostAWT).

La librería GhostAWT simulará ciertos componentes de AWT para intentar engañar a la aplicación para que funcione.

Y si la aplicación no te funciona con ninguna de estas dos alternativas, me temo que no te quedará otra que instalar el sistema de ventanas.

Salu2 a to2

miércoles, 22 de febrero de 2017

Error en la definición de políticas "inetres.admx"


Hola a todos, me ha ocurrido que un una máquina virtual con Windows Server 2008 R2, que tenía instaladas actualizaciones para tener el Internet Explorer 11, al abrir el "gpedit" para configurar las políticas de Internet Explorer me apareció el siguiente error:



  Error al analizar
  No se pudo encontrar el recurso "$(string.Advanced_EnableSSL3Fallback)" al que se hace referencia en el atributo displayName.

Archivo c:\Windows\PolicyDefinitions\inetres.admx, línea 795, columna 308


Tras mucho darle vueltas, resulta que es un fallo de una actualización de Windows y que se arregla con otra.
La cuestión es corregir ese fichero c:\Windows\PolicyDefinitions\inetres.admx sobreescribiéndolo con uno más actualizado y os recomiendo el de la actualización https://technet.microsoft.com/en-us/library/security/MS14-051 tal y como indica el siguiente blog del propio Microsoft https://blogs.msdn.microsoft.com/askie/2014/08/12/how-to-manage-the-new-blocking-out-of-date-activex-controls-feature-in-ie/

Tan sólo queda comentarios que para sobreescribir esos ficheros necesitaréis cambiarles el propietario y luego darles permiso de escritura a vuestro usuario. No basta con ser administrador ya que por defecto el propietario de esos ficheros es el Trusted Installer.

Salu2 a to2

viernes, 20 de enero de 2017

Ingeniería inversa de DLLs en Windows

Hola a todos. Hace tiempo escribí un POST sobre como comparar la ejecución de dos programas (o del mismo programa instalado en dos máquinas distintas):
  http://paridasinformaticas.blogspot.com.es/2015/03/comparando-antes-y-despues-con-windows.html

Pero el "Process Monitor" sólo traza las siguientes cosas:
  • Operaciones con disco
  • Operaciones con registro
  • Operaciones de red
  • Operaciones de procesos e hilos

Y a veces necesitamos trazar otras cosas. No sólo para comparar la ejecución de programas, sino también a veces para hacer ingeniería inversa de forma que podamos saber cómo funciona un programa por dentro.

Como primer paso, se puede utilizar el software "API Monitor" de http://www.rohitab.com/

Este es un software genial que trazará las llamadas a las distintas DLLs del sistema y que nos permite además filtrar aquellas llamadas que queremos ver y las que no. También podemos marcarlo todo, trazarlo todo, y tener una traza supercompleta aunque bastante lenta de generar.

Esto para comparar es sencillamente genial, pero para ingeniería inversa tiene una pequeña pega. La pega es que hay ciertas APIs de Microsoft que permiten digamos "saltarse" las llamadas a DLLs. Por ejemplo existe la función "InitializeSecurityContext", que puede ser llamada a través de la DLL, o por el contrario, podemos hacer una llamada a "InitSecurityInterface", traernos la tabla de funciones de seguridad y hacer la llamada a través de ella (con lo cual esa llamada no se trazaría con el API Monitor).

Para esto tenemos otra herramienta, pero que esta vez requiere codificar exactamente lo que queremos trazar, la librería "Detours". Mediante esta librería se carga el software en memoria y luego se parchean las llamadas a las funciones de las DLLs en memoria. Esto no sólo parchea las llamadas del software en sí, sino también las llamadas de las DLLs que son dependencia de ese software.

Por ejemplo, si se parchea la llamada a "AcquireCredentialsHandle", y hacemos una llamada a "AcquireCredentialsHandle" usando el paquete de seguridad "CredSSP", veremos que internamente la librería "credssp.dll" hace otras dos llamadas a "AcquireCredentialsHandle", una con "TSSSP" y otra con "Schannel" como parametros.

Para hacer esto lo más sencillo es seguir el tutorial de:
  https://blogs.msdn.microsoft.com/jannemattila/2009/12/03/modifying-application-behavior-with-detours-for-application-compatibility-reasons/

Tutorial que seguramente tendrás que complementar con algún sencillo tutorial sobre cómo crear una DLL (encontraras cientos con una búsqueda con Google).

Lo mejor de este tutorial es que me permitió conocer el software "PEBrowse" (http://www.smidgeonsoft.prohosting.com/), con el que desensamblar una DLL resulta bastante fácil.

RESUMIENDO: Si aprendes a manejar estas dos herramientas y a crear tus propias DLLs para parchear funciones con "Detours", la ingeniería inversa de una DLL (o de un software) te resultará más sencilla.

Salu2

viernes, 18 de noviembre de 2016

Añadir una resolución de nombres a Ubuntu

Hola chavales, hoy he descubierto que si quieres añadir una ruta estática en tu Linux Ubuntu, hay que hacer alguna configuración extra.

De toda la vida para añadir una ruta estática a tu Linux, editas el fichero /etc/hosts y la añades ahí:

127.0.0.1       localhost
127.0.1.1       mycomputer
192.168.1.219   test.ldap.server


El problema viene cuando quieres resolver el nombre "test.ldap.server" por DNS mediante un:
host test.ldap.server

Ubuntu resuelve las DNS internamente mediante un "dnsmasq", y eso nos permite meterle cierta configuración. Para que "dnsmasq" pille el fichero /etc/host hay que crear un fichero de configuración "/etc/NetworkManager/dnsmasq.d/hosts.conf" con el siguiente contenido:

addn-hosts=/etc/hosts

Tras esto sólo hay que hacer un "sudo  /etc/init.d/network-manager restart", y ya tendremos respuesta de:
usuario@mycomputer ~ $ host test.ldap.server
test.ldap.server has address 192.168.1.219


Salu2 a to2