This is an article draft, it may contain errors, mistakes, and refuses.

Zoom per MacOS reverse engineering

Published at January 1, 0001 – 3 min read

Zoom.us è un particolare servizio che permette di tenere un meeting online senza complicati e costosi setup. È diventato popolare negli ultimi tempi per aver permesso la continuazione delle lezioni didattiche online in Italia, dopo l’annuncio della sospensione delle lezioni a causa del COVID-19.

Una semplice interfaccia utente e una varietà di impostazioni tra cui la condivisione schermo fanno sì che stia diventando molto diffuso tra le nostre case. Tuttavia un’altra questione rimane da affrontare: come funziona Zoom? che tecnologie utilizza? come si comporta?

Sembrano in realtà domande banali perché qualcuno mi potrebbe dire “guardati la documentazione dei loro SDK”: non tutto però è così scontato.

Zoom Meeting Client

Per semplicità, analizzerò solo il contenuto dell’app sviluppata per MacOS utilizzando Hopper disassembler, uno strumento che mi permette di estrarre risorse e decompilare un’app attraverso un agevole interfaccia. Ho dato un’occhiata anche al programma sviluppato per sistemi Windows e molte chiamate sono simili (vi sono delle differenze che tuttavia sarebbero da analizzare meglio).

Prima di addentrarci nei dettagli specifico che questa analisi è semplificata, riassuntiva e salta alcuni concetti tecnici. Mi scuso dapprima per ogni errore e/o svista tecnica.

Cominciamo: il primo elemento a cui dobbiamo volgere lo sguardo è zoomus.app che è in realtà una cartella al cui interno troviamo il nostro binario principale chiamato “Zoom” (che fantasia ndr). Iniziamo con decompilare questo binario, partendo da eventuali entrypoint dell’app. Ovvero, cosa succede quando clicchiamo sull’icona dell’app?

La modalità “pseudo-code” ci aiuta ad identificare l’inizio del programma: individuiamo subito l’entrypoint. Molto semplicemente, chiama una serie di funzioni che si occupano di:

  • registrare l’URL per i meeting – come sappiamo alcune organizzazioni (governative, multinazionali) hanno un dominio dedicato per tenere i meeting (specifico “dedicato”, perché questo deve essere diverso da *.zoom.us);
  • caricare il Zoomloader.framework;

È utile, inoltre, sapere che l’applicazione principale si occupa anche:

  • di controllare se esistono nuovi versioni del programma, utilizzando il componente zAutoUpdate.bundle; questo accade ogni qualvolta il meeting è finito. Ogni nuovo aggiornamento è scaricato localmente nella cartella ‘/Users/mioutente/Downloads’ per poi essere verificato tramite codesign con la firma dello sviluppatore.
  • di notificare ogni qualvolta l’app viene aperta o chiusa (si parla cioè di quando la finestra è in idle oppure è attiva); utilizzata per l’[Attention tracking] ora rimossa.

Zoomloader.framework

Zoomloader.framework è la chiave di tutto Zoom, si occupa di gestire il caricamento di tutti quelli che sono i “bundle” terziari.

Un bundle sono come dei pacchetti il cui contenuto può includere librerie, file multimediali: tutto ciò che serve ad un programma per funzionare correttamente. Sono stati ideati per ottimizzare la gestione di grosse applicazioni, sfruttando l’approccio “top-down”.

I suoi compiti solo quelli:

  • di gestire i file di traduzione per permettere di cambiare da una lingua all’altra in poco tempo, implementata dalla classe ZMLanguageMgr
  • di caricare le impostazioni di Zoom locali (possono trovarsi nel file Zoom.us.ini);
  • monitorare la connettività di rete (si ha un id per ogni tipo di connettività: 0 per il wifi, 1 per ethernet, 2 etc.);

ZoomUI.framework

ZoomUI.framework è un altro componente interessante da analizzare per capire il funzionamento della gestione di un’interfaccia utente. Il mantra è “tutto ciò che vedi è stato disegnato”: in maniera semplificata, si può immaginare che ogni linea, punto è stato disegnato.

ZoomUI.framework infatti si occupa di disegnare tutti i popup, le icone, i messaggi di errore, le immagini e molto altro.

Zmb

Registra le sessioni su zoom riportandole in file mp4.

-- note aggiuntive

Spesso nel codice si fa riferimento ad una certa Saasbee Inc., penso sia la filiale cinese di Zoom Communication Ltd.

--

About the author

SerHack is a security engineer and a writer. He is contributing to the Monero project, a cryptocurrency focused on preserving privacy for transactions data. In his publications, Mastering Monero has became one of the best rated resources to learn about Monero.

Next post: Sniffing packets with style: how to use NGREP and TCPDUMP