Sfondo
Tale messaggio proviene dall'intestazione di base che ha ogni eseguibile di Windows (formato PE). Il messaggio (e il codice che lo visualizza) è tecnicamente modificabile, ma tutti i compilatori sembrano emettere solo codice che visualizza la stessa stringa e quindi esce. È un codice eseguibile a 16 bit (come un file DOS .COM
), destinato a essere visualizzato quando si tenta di eseguire il programma su MS-DOS o sistemi pre-Windows simili. Il programma di caricamento di Windows di solito lo ignora.
Spiegazione
Tuttavia, c'è un caso in cui Windows potrebbe visualizzare quel messaggio: quando si tenta di eseguire un PE compilato per una versione di Windows più avanzata rispetto a quella che si sta utilizzando, specialmente se il codice del programma principale è per un può supportare una diversa architettura della CPU rispetto a quella del sistema operativo. (Questo è simile, ad esempio, al tentativo di eseguire il codice Win32 su DOS a 16 bit.) Da una GUI, si otterrebbe un errore pop-up, ma nella riga di comando, si potrebbe semplicemente ottenere quel messaggio.
Il candidato ovvio qui è che stai cercando di eseguire codice sul (orribilmente obsoleto) Windows XP, e dici che stai usando "i686- w64 -mingw32-gcc". Se stai compilando i binari a 64 bit per Windows XP, è estremamente probabile che non funzionino; mentre una build di 64 bit di XP esiste tecnicamente (in realtà è una versione diversa del kernel, 5.2 vs 5.1, ma è marchiata come XP), non è mai stata ampiamente utilizzata; la stragrande maggioranza delle scatole XP sono solo a 32 bit. Se si desidera un controllo rapido per 32 bit rispetto a 64 bit dalla riga di comando, verificare la presenza di una directory \Windows\SysWOW64
(che contiene binari di sistema a 32 bit su macchine a 64 bit); se non esiste, stai utilizzando un sistema operativo a 32 bit.
Raccomandazione
- A meno che tu A abbia bisogno di 64-bit per qualcosa, e B) sappia che il tuo obiettivo è 64-bit, usa solo payload a 32-bit.
- Assicurati che il tuo codice e il compilatore abbiano come target XP (Vista e in seguito hanno aggiunto un sacco di nuove API che impediranno a un programma che li utilizza di girare su XP).
- Considerare la rotazione di una VM XP per verificare se i payload vengono eseguiti localmente prima di provarli sul computer di destinazione.