Funzionalità nascosta di whatsup

Abbiamo trovato una funzione WhatsApp pre-rilasciata

Durante la ricerca WhatsApp web per un progetto di cui parleremo presto, abbiamo accidentalmente scoperto che WhatsApp ha un contrassegno per una funzionalità nascosta, che consente agli utenti di modificare la velocità di riproduzione dei messaggi vocali.

Comportamento interrotto

Uno dei nostri strumenti di ricerca ci consente di modificare la velocità di riproduzione dei messaggi vocali. Ogni messaggio vocale è essenzialmente un audio tag con un blob di una sorgente audio.

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

Questo frammento cambierebbe la velocità di tutti i messaggi vocali di WhatsApp a velocità 2x.

Eseguirlo oggi non ha fatto nulla. Nessun errore nella console o effetti collaterali cablati, i messaggi venivano riprodotti a una velocità normale.

Reverse Engineering

Siamo piuttosto fluidi nel reverse engineering sito web ed Applicazioni mobili, e avevamo già esaminato il codice sorgente web minificato di WhatsApp, quindi avevamo una buona idea di dove cercare.

Non ci è voluto molto per trovare queste righe di codice:

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

Queste righe aggiungono un ascoltatore per change:playbackRate, che viene attivato ogni volta che cambia la velocità di riproduzione di un tag audio. Quindi chiama setPttPlaybackRate, che sovrascrive la velocità di riproduzione su un valore precalcolato. Ciò impediva al nostro strumento di impostare la velocità di riproduzione.

Perché WhatsApp dovrebbe farlo? E con quale valore stavano scavalcando?

setPttPlaybackRate utilizza un Enum per determinare quale valore di velocità di riproduzione impostare:

...
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),
...

Quindi WhatsApp ha tre velocità predeterminate tra cui scegliere. Ciò ha sollevato i nostri sospetti che stesse succedendo qualcos'altro qui - forse una nuova funzionalità? Ci siamo messi a scoprire cosa stava succedendo.

Prima un contesto di fondo. Alcune parti di WhatsApp Web, e in particolare quelle che effettuano la riproduzione audio, utilizzano una "semplice" app React. Utilizza una build Webpack non così lontana dallo standard.

Analizzando i componenti che compongono i tag audio, abbiamo trovato questo:

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

...

Utilizzando Chrome DevTools, abbiamo impostato un punto di interruzione su quella riga di codice e ispezionato il valore di m.default.pttPlaybackSpeedEnabled:

Guardando dinamicamente il valore del flag di funzionalità

Interessante! Cosa accadrebbe se impostiamo questo flag su true? Siamo passati rapidamente alla console, mentre l'esecuzione era ancora interrotta dal punto di interruzione, e abbiamo eseguito:

m.default.pttPlaybackSpeedEnabled = true

E magicamente, tutti i nostri messaggi vocali avevano un nuovo indicatore della velocità di riproduzione. In un tema scuro, assomiglia a questo:

Il risultato finale
Salta al contenuto