La battaglia dei programmatori: io contro quel ragazzo con VNC

In questo blog Sono state pubblicate molte storie di programmatori. Mi piace ricordare le mie vecchie sciocchezze. Bene, ecco un'altra storia del genere.

Mi sono interessato ai computer, e in particolare alla programmazione, quando avevo circa 11 anni. All'inizio della scuola media,unpassavo la maggior parte del mio tempo libero con il mio C64, scrivendo in Basic e poi tagliando con le forbici il codice sbagliato. Non sto scherzando, con le forbici..

Dopo la scuola (a circa 16 anni) i ragazzi britannici di solito vanno al college, dove scelgono tre o quattro materie da studiare prima di entrare all'università. Considerando il mio amore per la scatola beige e il registratore a casa, ho deciso che studiare 'informatica' al college fosse la scelta giusta.

Il corso mi è piaciuto più di quanto mi aspettassi; lì ho incontrato per la prima volta Pascal e Delphi.

Tra una lezione e l'altra, gli studenti potevano lavorare su qualsiasi computer disponibile nella sala informatica. Immaginate: una grande stanza, progettata per circa cento persone, con file di tavoli pieni di computer, simili a quelli dove il monitor è sopra il case. Il continuo ronzio delle ventole, le pallette dei mouse che scorrono sui tavoli senza sosta. Nell'aria c'è un odore strano, come se 50-100 adolescenti in fase ormonale si alternassero periodicamente per raffreddare centinaia di chip Pentium III.

Nonostante i rischi per la salute, mi piaceva stare al computer quando si presentava un minuto libero.

Nella stanza c'era un amministratore, un uomo di mezza età di bassa statura, scelto per questo ruolo a causa del suo incessante desiderio di diventare un dittatore temuto. Diciamo che 'sorvegliare' è un pallido eufemismo; il ragazzo amava davvero il suo lavoro. Era incaricato di mantenere l'ordine, affinché nessuno usasse il computer didattico per scopi inappropriati.

E ancora oggi l'intuizione mi suggerisce che il premio dell'amministratore dipendesse direttamente dal numero di studenti che riusciva a sorprendere e a cacciare dal laboratorio informatico. Sono quasi certo che quel ragazzo ha estinto il suo mutuo in anticipo.

Era seduto nell'angolo del laboratorio informatico a un tavolo ad angolo. Si poteva affermare con certezza che i suoi fertili monitor avessero trovato un modo per riprodursi con un periodo di gestazione sorprendentemente breve — ce n'erano così tanti. Rimaneva solo da chiedersi se riuscisse davvero a tenerne d'occhio tutti. Certo, sto scherzando… ho mai menzionato che si prendeva molto sul serio il lavoro?

All'epoca la rete informatica funzionava con Windows 2000. Presto scoprii che ad ogni accesso si avviava uno script, che avviava il server VNC con l'account amministrativo per l'accesso remoto al desktop. Ogni volta che quel ragazzo voleva tenere d'occhio qualcuno, si collegava direttamente al tuo computer e osservava. Era inquietante e, se ci penso ora, probabilmente anche illegale.

Affilato i miei denti su Basic e C64, ora scrivevo in C e persino un po' in C++. All'epoca mi ero molto appassionato al linguaggio D, che correggeva alcuni difetti di C++, come pensavo allora.

Di solito andavo nella sala computer per leggere qualcosa di nuovo su D o per giocare con il compilatore Digital Mars D. A volte, distraendomi dai pensieri sul grande futuro di D, scrivevo codice in C per hackerare altri programmi Win32 attraverso i descrittori delle loro finestre.

Nei bei tempi andati della programmazione su Win32, la ricerca del descrittore della finestra era il metodo più semplice per hackerare altri programmi. È ovvio che tutti i programmi con interfaccia grafica in Windows avessero una finestra, anche se non era visualizzata sullo schermo. Scrivendo un programma per estrarre il descrittore di un altro processo (essenzialmente, un riferimento ad esso), potevi inviargli messaggi. Questo permetteva di eseguire alcune operazioni di base, come nascondere/mostrare la finestra del programma, e anche cose davvero interessanti, come costringere il processo a caricare una DLL arbitraria nel suo spazio di memoria e iniziare l'esecuzione del codice. Dopo l'iniezione della DLL iniziava la parte più divertente.

Nei primi mesi e mezzo, questo detective non mi ha particolarmente infastidito, si è collegato al server VNC sulla mia macchina solo una o due volte. Ma una particolare sessione ha probabilmente risvegliato il suo interesse. Stavo scrivendo un codice in C per nascondere le finestre di Minesweeper (senza chiuderle), per facilitare il gioco in classe, e ho notato che l'icona bianca di VNC nella barra di sistema era diventata nera. Ciò significava che ora mi stava osservando.

Ho continuato a programmare come al solito, cercando di ignorarlo. Nel frattempo, il computer ha cominciato a rallentare notevolmente, cercando di trasmettere il massimo numero di fotogrammi a uno dei numerosi monitor nell'angolo della stanza. Windows ha quasi smesso di rispondere, e quando la mia pazienza è finita, ho disconnesso e ho chiuso per oggi.

Durante le visite successive al laboratorio di computer, Colombo ha mostrato quasi sempre un vivo interesse per quello che stavo facendo. Dopo circa la quarta volta, ho deciso che bisognava fare qualcosa.

Ammetto che una persona ragionevole e razionale avrebbe potuto sollevare direttamente questo problema con lui o il suo supervisore. Tuttavia, sono sempre stato tentato e mi sono rapidamente convinto a scegliere una strategia completamente diversa.

— Non puoi fare nulla senza questo server VNC! — mi sono detto tranquillamente e con determinazione più di una volta.

Era necessario eliminare VNC.

Iniziai a entrare nel laboratorio di computer con grandi gruppi di studenti e a sedermi il più lontano possibile dall'angolo con i monitor. Questo funzionò per un po' e mi diede qualche attimo per verificare le idee.

La mia prima prova, credo che sarete d'accordo, era piuttosto debole. Facendo clic destro sull'icona VNC nella barra delle applicazioni, vidi un menu con le magiche lettere E-X-I-T. Sfortunatamente, le lettere erano scritte in testo contornato grigio. L'amministratore aveva disattivato la voce di menu “Uscita” tramite l'editor dei criteri di gruppo. Ho cercato di terminare il processo dal Task Manager, ma, ovviamente, era invisibile per me poiché funzionava con un'altra, più privilegiata, acccount. Non ottenni nulla.

Il server VNC gira sulla porta TCP 5900, ho ricordato. Il mio piano successivo era inviare pacchetti danneggiati su quella porta per cercare di bloccarlo.

Per diversi giorni ho esaminato il protocollo, inviando sulla porta 5900 varie forme di 'spazzatura' strutturata correttamente, sperando che si rompesse. Alla fine, anche questo non ha funzionato.

Avevo già cominciato a pensare che non sarei riuscito a liberarmi di quella cosa, quando improvvisamente mi è venuta un'idea: deve esserci una finestra! Devo mostrarla. Magari c'è un bel pulsante 'Spegni' che potrei utilizzare!

Ho avviato il mio codice C quasi perfetto per cercare il descrittore della finestra principale di un altro processo e ho effettivamente trovato VNC. Mi sentivo esaltato quando le mie dita hanno digitato WM_SHOWWINDOW. Provate a indovinare cosa ho visto davanti a me?

Nulla!

Ora ero curioso... aveva una finestra, ma ignorava i miei messaggi. Ho controllato due volte il mio codice per assicurarmi che funzionasse. L'ho testato su altri processi e ha funzionato alla perfezione. Ho provato a inviare altri messaggi alla finestra VNC e comunque non è successo nulla.

E qui mi è venuta in mente un'altra idea!

Grazie a un testo molto spesso libro di Charles Petzold, ho studiato attentamente come funzionano i processi Win32 all'interno del sistema. Ogni applicazione Win32 ha una finestra e una 'coda dei messaggi'. I messaggi, generati dall'interazione dell'utente e quelli inviati dallo stesso Windows, arrivano nella coda e l'applicazione decide come gestirli.

Non è particolarmente interessante di per sé. Ma quando ho capito che una coda dei messaggi sufficientemente grande fungeva da euristica per l'intervento in un processo bloccato da parte del Gestore dei Processi Windows, ho provato una scarica di pura serotonina.

Senza perdere tempo, sono tornato al mio codice C, pronto a inviare un altro messaggio alla finestra principale del VNC WM_SHOWWINDOW. In un ciclo. Eterno. Quindi, molti messaggi WM_SHOWWINDOW, che, come sapevo ora, il VNC avrebbe cercato di ignorare completamente… a proprio rischio.

Ho compilato e avviato 4 KB del codice più libertario della mia vita. Dopo circa tre secondi, Windows ha segnalato che il processo vncserver.exe non rispondeva e ha fatto un'offerta a cui semplicemente non potevo rinunciare:

Vuoi terminare questo processo?

Cavolo, SÌ!

Devo ammettere che per il resto della giornata mi sono sentito insopportabilmente soddisfatto di me stesso.

Dopo diverse ore spese a metabolizzare il mio nuovo superpotere, ho deciso come avrei voluto usarlo. Semplicemente uccidere la sessione proprio davanti a lui sarebbe stato troppo semplice. Avevo un'idea migliore: scomparire del tutto.

Dopo battesimo di combattimento con la programmazione dei socket Ho capito che potevo scrivere un codice che avrebbe fatto due cose. Prima di tutto, avrebbe occupato una porta TCP 5900 di recente liberata, precedentemente occupata da un ignorante processo del server VNC. Poi avrebbe creato una nuova connessione TCP con il server VNC della macchina specificata. Il codice sarebbe semplicemente servito da proxy per tutti i dati tra i due socket, e Colombo penserebbe di connettersi a me, mentre in realtà si connetterebbe a un server VNC completamente diverso.

Il mio codice fungerà da ponte segreto tra me e qualche altra povera anima a mia scelta. Era fantastico.

Ho iniziato subito a scrivere il mio falso bridge VNC. Colombo si è connesso a me diverse volte, ma io continuavo a programmare sotto i suoi occhi. Sono giunto alla conclusione che non ha la minima idea di ciò che stavo facendo, anche se scrivevo cose evidenti, come i numeri delle porte e commenti del tipo // Прощай, жуткий шпион VNC.

Dopo un paio di giorni, non riuscivo a far funzionare correttamente il codice. Peggio ancora, lavoravo praticamente senza sosta con l'icona nera di VNC nella barra delle applicazioni. Finché era connesso, non potevo liberare la porta per testare il mio codice.

Se solo allora avessi saputo di netcat!

Alla fine, i nervi non hanno retto, del resto ero un ragazzo di 17 anni impaziente. Osservando nuovamente l'icona bianca del server VNC diventare nera, ho perso la pazienza, ho aperto il codice originale che riempiva la coda dei messaggi e l'ho eseguito sotto i suoi occhi. Ho persino aspettato un paio di secondi prima di premere End Process, solo per essere sicuro che lo vedesse.

Se premere quel pulsante non mi avesse già convinto che ne valeva la pena, il suo salto dalla robustezza dei monitor per avvicinarsi rapidamente a me ed espelleremi dalla stanza è sicuramente valso la pena.

Alla fine mi è stato vietato l'accesso alla rete per due settimane. Una punizione giusta, ho pensato. Circa tre settimane dopo, il server VNC è scomparso dagli script di avvio e non è più riapparso. Non ho mai saputo se il mio incidente ha avuto un ruolo in questo, ma ha completamente distrutto il mio piano di arricchirmi vendendo la mia arma VNC agli studenti oppressi nelle sale informatiche dei college in tutto il paese.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster