Qué pasa característica oculta

Encontramos una función de WhatsApp prelanzada

Si bien la investigación WhatsApp web para un proyecto sobre el que escribiremos pronto, descubrimos accidentalmente que WhatsApp tiene un indicador de función para una función oculta, una que permite a los usuarios cambiar la velocidad de reproducción de los mensajes de voz.

Comportamiento roto

Una de nuestras herramientas de investigación nos permite cambiar la velocidad de reproducción de los mensajes de voz. Cada mensaje de voz es esencialmente un audio etiqueta con un blob de una fuente de audio.

document.querySelectorAll('audio').forEach(e => {
  e.playbackRate = 2;
});

Este fragmento cambiaría la velocidad de todos los mensajes de voz de WhatsApp al doble de velocidad.

Ejecutarlo hoy no hizo nada. Sin errores en la consola ni efectos secundarios por cable, los mensajes se reproducían a una velocidad normal.

Ingeniería inversa

Somos bastante fluidos en ingeniería inversa web y aplicaciones móviles, y ya habíamos investigado el código fuente minimizado de la web de WhatsApp, por lo que teníamos una buena corazonada sobre dónde buscar.

No tomó mucho tiempo encontrar estas líneas de código:

...
initialize() {
  i.default.prototype.initialize.call(this),
    this.playbackRate = (0,
      s.getPttPlaybackRate)(),
    this.listenTo(this, "change:playbackRate", ((e,t)=>{
        (0,
          s.setPttPlaybackRate)(t)
      }
    ))
}
...

Estas líneas agregan un oyente para change:playbackRate, que se activa cada vez que cambia la velocidad de reproducción de una etiqueta de audio. entonces llama setPttPlaybackRate, que anula la velocidad de reproducción a un valor calculado previamente. Esto estaba deshabilitando nuestra propia herramienta para que no estableciera la velocidad de reproducción.

¿Por qué WhatsApp haría eso? ¿Y con qué valor estaban anulando?

setPttPlaybackRate utiliza un Enum para determinar qué valor de velocidad de reproducción establecer:

...
t.pttPlaybackSpeed = function(e) {
  switch (e) {
    case 1:
      return v.default.PTT_PLAYBACK_SPEED_TYPE.SPEED_1;
    case 1.5:
      return v.default.PTT_PLAYBACK_SPEED_TYPE.SPEED_1_5;
    case 2:
      return v.default.PTT_PLAYBACK_SPEED_TYPE.SPEED_2;
    default:
      throw new Error("Invalid playback rate: ".concat(e))
  }
}(this.props.pttPrefs.playbackRate),
...

Entonces, WhatsApp tiene tres velocidades predeterminadas para elegir. Esto levantó nuestras sospechas de que algo más estaba pasando aquí, ¿una nueva característica tal vez? Nos dispusimos a averiguar qué estaba pasando.

Un poco de contexto de fondo primero. Algunas partes de la web de WhatsApp, y específicamente aquellas que hacen reproducción de audio, usan una aplicación React "simple". Utiliza una compilación Webpack no tan lejos del estándar.

Trabajando a través de los componentes que componen las etiquetas de audio, encontramos esto:

...
if (m.default.pttPlaybackSpeedEnabled && "ptt" === i) {
  P = b === r.toString();
  var A = (0,
    s.default)(o.default.playbackRateButtonContainer, {
    [o.default.playbackRateButtonContainerVisible]: P
  });

...

Usando Chrome DevTools, establecimos un punto de interrupción en esa línea de código e inspeccionamos el valor de m.default.pttPlaybackSpeedEnabled:

Mirando dinámicamente el valor de la bandera de característica

¡Interesante! ¿Qué pasaría si ponemos esta bandera en true? Saltamos rápidamente a la consola, mientras la ejecución aún estaba detenida por el punto de interrupción, y ejecutamos:

m.default.pttPlaybackSpeedEnabled = true

Y mágicamente, todos nuestros mensajes de voz tenían un nuevo indicador de tasa de reproducción. En un tema oscuro, se ve así:

El resultado final
Ir al contenido