Battaglia tra programmatori: io contro quel ragazzo VNC

В questo blog Sono stati pubblicati parecchi racconti di programmatori. Mi piace ricordare le mie vecchie cose stupide. Bene, ecco un'altra storia del genere.

Ho iniziato a interessarmi ai computer, in particolare alla programmazione, quando avevo circa 11 anni. All'inizio della scuola superiore bоHo trascorso la maggior parte del mio tempo libero armeggiando con il mio C64 e scrivendo BASIC, quindi ritagliando il codice difettoso con le forbici. Non sto scherzando, forbici.

Dopo la scuola (intorno ai 16 anni), i ragazzi britannici di solito vanno al college, dove scelgono di studiare tre o quattro materie prima di andare all'università. Dato il mio amore per la scatola beige e il registratore di casa, ho deciso che studiare “informatica” al college era la scelta giusta.

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

Durante le pause tra le lezioni, gli studenti potevano lavorare su qualsiasi macchina libera nell'aula computer. Immagina: una stanza enorme, progettata per un centinaio di persone, con file di tavoli pieni di macchine, come quelle su cui poggia il monitor sull'unità di sistema. I tifosi canticchiano costantemente, le palline del mouse ronzano sui tavoli, senza fermarsi per un secondo. C'è uno strano odore nell'aria, come se 50-100 adolescenti ormonali si cambiassero periodicamente per raffreddare centinaia di chip Pentium III.

Nonostante i rischi per la salute, mi piaceva sedermi al computer quando avevo un minuto libero.

L'amministratore di turno nella stanza era un uomo basso e di mezza età scelto per questo ruolo a causa del suo insaziabile desiderio di diventare un dittatore malvagio. Suppongo di sì. In servizio è dir poco: il ragazzo amava davvero il suo lavoro. Aveva il compito di mantenere l'ordine in modo che nessuno utilizzasse il computer della scuola per qualcosa di inappropriato.

Fino ad oggi, la mia intuizione mi dice che il bonus dell'amministratore dipendeva direttamente dal numero di studenti che prendeva per mano e scortava fuori dall'aula informatica. Sono abbastanza sicuro che questo tizio abbia saldato il mutuo in anticipo.

Si sedette nell'angolo più lontano della sala computer, a un tavolo d'angolo. Ed era lecito supporre che i suoi monitor della fertilità avessero trovato il modo di riprodursi con un periodo di gestazione straordinariamente breve, ce n'erano così tanti. C'era solo da chiedersi se avesse davvero il tempo di tenerli sotto controllo tutti. Ovviamente sto scherzando... ho già detto che prendeva molto sul serio il suo lavoro?

A quel tempo, la rete di computer utilizzava Windows 2000. Presto scoprii che ogni volta che accedevo al sistema veniva lanciato uno script che specificava l'avvio del server VNC dall'account amministratore per l'accesso remoto al desktop. Ogni volta che questo ragazzo voleva spiarti, si collegava direttamente alla tua macchina e guardava. Era inquietante e, ora che ci penso, probabilmente illegale.

Dopo essermi fatto le ossa sul BASIC e sul C64, ora scrivo in C e anche un po' di C++. A quel tempo ero ancora molto interessato al linguaggio D, che correggeva alcuni dei difetti del C++, per come lo vedevo allora.

Andavo nell'aula computer per leggere qualcosa di nuovo su D o giocare con il compilatore Digital Mars D. A volte, mentre ero distratto dal pensare al grande futuro di D, scrivevo codice C per hackerare altri programmi Win32 attraverso la loro finestra maniglie.

Ai vecchi tempi della programmazione Win32, trovare un handle di finestra era il metodo più semplice per hackerare altri programmi. Ovviamente, tutti i programmi GUI su Windows avevano una finestra, anche se non appariva sullo schermo. Scrivendo un programma per recuperare un handle per un altro processo (essenzialmente un collegamento ad esso), è possibile inviargli messaggi. Ciò ha consentito alcune operazioni di base come nascondere/mostrare una finestra di programma, nonché cose davvero interessanti come forzare un processo a caricare una DLL arbitraria nel suo spazio di memoria e iniziare a eseguire il codice. Dopo l'iniezione della DLL, è iniziato il divertimento.

Nel primo mese e mezzo questo detective non mi ha dato molto fastidio, si è connesso al server VNC della mia macchina solo una o due volte. Ma una sessione in particolare potrebbe aver suscitato il suo interesse. Stavo scrivendo del codice C per nascondere le finestre di Campo Minato (senza chiuderle) per rendere più semplice il gioco in classe, quando ho notato che l'icona VNC bianca nella barra delle applicazioni era diventata nera. Ciò significava che ora mi stava guardando.

Ho continuato a programmare come al solito, cercando di ignorarlo. Nel frattempo la macchina cominciò a rallentare, cercando di trasmettere il massimo frame rate a uno degli innumerevoli monitor nell'angolo della stanza. Windows ha quasi smesso di rispondere, quando la mia pazienza è finita, mi sono disconnesso e ho finito la giornata.

Nelle successive visite alla sala computer, Colombo mostrava un vivo interesse per quello che stavo facendo quasi ogni volta. Dopo circa la quarta volta, ho deciso: devo fare qualcosa al riguardo.

Ammetto che una persona ragionevole e razionale avrebbe potuto semplicemente sollevare la questione direttamente con lui o il suo capo. Tuttavia, ho sempre ceduto alla tentazione e mi sono subito convinto ad adottare una strategia completamente diversa.

- Non puoi fare nulla senza questo server VNC! — Mi sono detto più volte con calma e decisione.

Era necessario uccidere VNC.

Ho iniziato ad andare nell'aula computer con grandi gruppi di studenti e sedermi il più lontano possibile dall'angolo con i monitor. Questo ha funzionato per un po' e mi ha dato un po' di tempo per testare le idee.

Il mio primo tentativo, penso che sarai d'accordo, è stato piuttosto debole. Facendo clic con il tasto destro sull'icona VNC nella barra delle applicazioni, ho visto un menu con le lettere magiche EXIT. Sfortunatamente, le lettere erano scritte con testo a contorno grigio. L'amministratore ha disabilitato la voce di menu "Esci" tramite l'Editor criteri di gruppo. Ho provato a terminare il processo dal Task Manager, ma ovviamente era invisibile per me perché veniva eseguito con un account diverso e più privilegiato. Non ha funzionato.

Il server VNC funziona sulla porta TCP 5900, mi sono ricordato. Il mio piano successivo era inviare pacchetti corrotti a questa porta per mandarla in crash.

Ho passato almeno qualche giorno ad armeggiare con il protocollo, inviando varie forme di schifezze ben strutturate alla porta 5900 e sperando che si rompesse. Alla fine anche quello non ha funzionato.

Stavo già iniziando a pensare che non sarei riuscito a liberarmi di questa cosa, quando all'improvviso mi sono reso conto: deve esserci una finestra lì! Dobbiamo visualizzarlo. Forse avrà un bel pulsante “Mute” che potrò sfruttare al meglio!

Ho eseguito il mio codice C ormai quasi perfetto per trovare l'handle della finestra principale di un altro processo e, come previsto, è stato trovato VNC. Mi sono sentito ispirato quando le mie dita hanno digitato WM_SHOWWINDOW. Prova ad indovinare cosa ho visto davanti a me?

Ничего!

Ora ero curioso... aveva una finestra, ma ignorava i miei messaggi. Ho ricontrollato il mio codice per assicurarmi che funzioni. L'ho testato su diversi altri processi e ha funzionato benissimo. Ho provato a inviare altri messaggi alla finestra VNC e ancora niente.

E poi mi è venuto in mente di nuovo!

Grazie allo spessore molto il libro Charles Petzold Ho studiato attentamente come funzionano i processi Win32 all'interno del sistema. Ogni applicazione Win32 ha una finestra e una "coda di messaggi". I messaggi attivati ​​dall'interazione dell'utente, così come i messaggi inviati da Windows stesso, arrivano in coda e l'applicazione stessa decide come elaborarli.

Di per sé non molto interessante. Ma quando mi sono reso conto che una coda di messaggi non elaborati abbastanza grande fungeva da euristica per l'intervento di Window Process Manager in un processo sospeso, ho iniziato a sudare pura serotonina.

Senza perdere un secondo, sono tornato al mio codice C, preparandomi a inviare un altro messaggio alla finestra principale di VNC WM_SHOWWINDOW. In un ciclo. Eterno. Tanti messaggi, quindi. WM_SHOWWINDOW, che ora sapevo che VNC avrebbe cercato di ignorare completamente... a suo rischio e pericolo.

Ho compilato ed eseguito 4KB del codice più amante della libertà della mia vita. Dopo circa tre secondi, Windows ha segnalato che il processo vncserver.ехе non risponde, e mi ha fatto un'offerta che semplicemente non potevo rifiutare:

Vuoi completare questo processo?

DIAVOLO SÌ!

Lasciatemi ammettere che per il resto della giornata ero insopportabilmente soddisfatto di me stesso.

Dopo alcune ore trascorse a digerire il mio nuovo superpotere, ho deciso come usarlo. Era troppo facile interrompere la sessione proprio di fronte a lui. Ho avuto un'idea migliore: scomparire completamente.

dopo battesimo del fuoco con programmazione delle prese Mi sono reso conto che avrei potuto scrivere codice che avrebbe fatto due cose. Per prima cosa occuperà la porta TCP 5900 appena liberata, precedentemente occupata dall'incompetente processo del server VNC. Quindi creerà una nuova connessione TCP al server VNC della macchina specificata. Il codice eseguirà semplicemente il proxy di tutti i dati tra i due socket e Colombo penserà di connettersi a me, quando in realtà si connetterà a un server VNC completamente diverso.

Il mio codice fungerà da ponte segreto tra me e qualche altra povera anima di mia scelta. È stato meraviglioso.

Ho subito iniziato a scrivere il mio finto bridge VNC. Colombo si è collegato con me più volte, ma io ho continuato a programmare davanti a lui. Sono giunto alla conclusione che non aveva idea di cosa stessi facendo, anche se ho scritto cose ovvie come numeri di porta e commenti come // Прощай, жуткий шпион VNC.

Dopo un paio di giorni non sono riuscito a far funzionare correttamente il codice. A peggiorare le cose, lavoravo quasi continuamente con l'icona VNC nera nella barra delle applicazioni. Mentre era connesso, non ho potuto rilasciare la porta per testare il mio codice.

Se lo avessi saputo allora netcat!

Alla fine i miei nervi hanno ceduto, dopo tutto ero un diciassettenne impaziente. Guardando l'icona bianca del server VNC diventare di nuovo nera, sono andato fuori di testa, ho aperto il codice originale che popolava la coda dei messaggi e l'ho eseguito davanti ai suoi occhi. Ho anche aspettato un paio di secondi prima di fare clic End Process, solo per essere sicuro che lo vedesse.

Se premere quel pulsante non mi convinceva del tutto che ne valesse la pena, allora lui che saltava da dietro la sua fortezza di monitor per avvicinarsi rapidamente a me e farmi uscire dalla stanza sicuramente lo faceva.

Di conseguenza, sono stato bandito dalla rete per due settimane. Una giusta punizione, ho pensato. Dopo circa tre settimane, il server VNC è scomparso dagli script di avvio e non è più apparso da nessun'altra parte. Non ho mai saputo se il mio incidente abbia avuto un ruolo in tutto questo o meno, ma ha completamente rovinato il mio piano di diventare favolosamente ricco vendendo la mia pistola VNC a studenti depressi nelle aule informatiche dei college di tutto il paese.

Fonte: habr.com

Aggiungi un commento