ADSENSE

 

La persistenza del codice DOS nei file eseguibili Windows

Il mistero della firma MZ nei moderni .exe

Ogni file eseguibile Windows, anche quelli più recenti e compatibili con Windows 11, nasconde al suo interno un piccolo frammento di codice che risale all’era di MS-DOS.

Questo dettaglio, rivelato dall’analisi con un editor esadecimale, mostra che ogni .exe inizia con la firma “MZ”, seguita da un breve programma DOS che avvisa: “This program cannot be run in DOS mode”.

Questa non è una casualità, ma una scelta progettuale mirata a garantire compatibilità, semplificare il parsing e mantenere la coerenza all’interno del formato Portable Executable (PE) di Windows.

Comprendere questa eredità richiede un viaggio a ritroso fino agli albori dell’informatica personale.

Origini e necessità del DOS stub

Quando MS-DOS dominava il panorama dei PC, gli eseguibili utilizzavano un formato semplice, identificato dalla firma MZ, che prende il nome dall’ingegnere Microsoft Mark Zbikowski.

Con l’avvento di Windows, prima come interfaccia grafica su DOS e poi come sistema operativo indipendente, divenne fondamentale assicurare la compatibilità con gli strumenti esistenti.

La soluzione fu l’inserimento di un “DOS stub”, un programma DOS valido, all’inizio di ogni eseguibile Windows.

Questo permetteva di gestire i tentativi di esecuzione di programmi Windows in un ambiente DOS puro, prevenendo comportamenti imprevedibili.

La struttura dei file PE e il ruolo dell’header DOS

L’importanza dell’header e del formato PE

La parte iniziale di un file eseguibile è l’header, un blocco di metadati che descrive il tipo di file, la sua organizzazione interna e le istruzioni per interpretarlo.

Senza l’header, un eseguibile sarebbe una sequenza incomprensibile di byte.

L’header funge da interfaccia tra il file e il loader del sistema operativo, permettendo a Windows di caricare il programma in memoria e gestirne le dipendenze.

I moderni file .exe seguono il formato Portable Executable (PE), ma la parte PE non si trova all’inizio.

Il loader di Windows individua l’header PE attraverso un offset specificato nella struttura DOS iniziale, chiamata IMAGEDOSHEADER, in particolare nel campo e_lfanew.

Il DOS stub in Windows moderni: un retaggio funzionale

È importante sottolineare che il DOS stub non viene eseguito da Windows.

Le versioni di Windows della famiglia NT (come Windows 10 e Windows 11) non includono un kernel DOS.

Sebbene in passato esistesse NTVDM (NT Virtual DOS Machine) per l’esecuzione di applicazioni DOS a 16 bit, questo è stato rimosso con l’avvento dei sistemi a 64 bit.

Il prompt dei comandi (cmd.exe) non è DOS, ma un’applicazione Win32 che emula alcune convenzioni storiche.

La persistenza del DOS stub è legata alla specifica del formato PE: agisce come un “contenitore” iniziale che rispetta le specifiche di formato, ma il suo codice è ignorato dal sistema operativo moderno.

Compatibilità e innovazione nel mondo degli eseguibili

Perché il DOS stub persiste

I linker moderni, inclusi quelli di Visual Studio, continuano a inserire automaticamente il DOS stub negli eseguibili compilati.

Esiste anche un’opzione per personalizzare questo codice.

Questa caratteristica è stata sfruttata per creare eseguibili ibridi, capaci di funzionare sia come programmi DOS che Windows.

Un esempio recente è la ricerca di Kamila Szewczyk, che ha realizzato un singolo file da 13 KB compatibile con Windows, Linux e browser web.

L’equilibrio tra passato e futuro

Mantenere l’header MZ contribuisce a uniformare la lettura dei file eseguibili.

Sebbene tecnicamente si potrebbe eliminare questo blocco, ciò richiederebbe l’aggiornamento di specifiche, loader e strumenti esistenti, con un rischio non trascurabile di incompatibilità.

Microsoft ha sempre dato priorità a una vasta compatibilità.

Il DOS stub, pur non servendo più al suo scopo originale, assicura stabilità agli strumenti che utilizziamo quotidianamente, evitando l’introduzione di complessità inutili nel sistema.