In sono state pubblicate molte storie divertenti sui programmatori. Mi piace ricordare le mie vecchie sciocchezze. Beh, ecco un'altra di queste storie.
Mi sono interessato ai computer, in particolare alla programmazione, per la prima volta quando avevo circa 11 anni. All'inizio della scuola media,unpassavo la maggior parte del mio tempo libero a giocare con il mio C64 e scrivevo in Basic, e poi ritagliavo il codice sbagliato con le forbici. .
Dopo la scuola (all'età di circa 16 anni), i ragazzi britannici di solito vanno al college, dove scelgono tre o quattro materie da studiare prima di iscriversi all'università. Data la mia passione per il box 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.
Durante le pause tra le lezioni, gli studenti potevano lavorare su qualsiasi computer libero in aula informatica. Immagina: una grande stanza, progettata per circa cento persone, con file di tavoli pieni di computer, simili a quelli con il monitor sopra l'unità centrale. Un costante ronzio dei ventilatori, i pallini dei mouse ronzano sui tavoli senza fermarsi un attimo. Nell'aria c'era un odore strano, come se 50-100 adolescenti che emanavano ormoni si alternassero per raffreddare centinaia di chip Pentium III.
Nonostante i rischi per la salute, mi piaceva sedermi al computer quando avevo un attimo di libertà.
In aula c'era un amministratore, un uomo di mezza età di bassa statura, scelto per questo ruolo a causa della sua incessante voglia di diventare un dittatore cattivo. Credo. Dire che era di turno sarebbe riduttivo, il ragazzo amava davvero il suo lavoro. Era stato incaricato di mantenere l'ordine, affinché nessuno usasse il computer didattico per scopi inappropriati.
E ancora oggi la mia intuizione mi dice che il compenso dell'amministratore dipendeva direttamente dal numero di studenti che riusciva a beccare e a sbattere fuori dall'aula informatica. Sono praticamente certo che quel ragazzo ha saldato il suo mutuo in anticipo.
Era seduto in un angolo remoto della sala computer dietro a un tavolo d'angolo. E si poteva supporre con certezza che i suoi monitor fecondi avessero trovato un modo per riprodursi con un periodo di gestazione sorprendentemente breve: ce n'erano così tanti. Restava solo da indovinare se fosse davvero in grado di seguirli tutti. Certo, sto scherzando... ho già menzionato che prendeva il lavoro molto seriamente?
A quell'epoca, la rete informatica operava sotto Windows 2000. Ben presto scoprii che ad ogni accesso veniva eseguito uno script che avviava il server VNC con un account admin per l'accesso remoto al desktop. Ogni volta che quel ragazzo voleva tenere d'occhio qualcuno, si connetteva direttamente al tuo computer e osservava. Era inquietante e, a pensarci ora, probabilmente illegale.
Dopo aver affinato le mie abilità su Basic e C64, ora scrivevo in C e anche un po' in C++. A quel tempo ero anche molto affascinato dal linguaggio D, che correggeva alcuni difetti del C++, come mi sembrava allora.
Di solito entravo nella sala computer per leggere qualcosa di nuovo su D o per giocare con il compilatore Digital Mars D. A volte, distogliendomi dai miei pensieri sul grande futuro di D, scrivevo codice in C per violare altri programmi Win32 tramite i descrittori delle loro finestre.
Ai tempi d'oro della programmazione su Win32, trovare il descrittore di una finestra era il metodo più semplice per hackerare altri programmi. È ovvio che tutti i programmi con interfaccia grafica in Windows avevano una finestra, anche se non veniva 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 effettuare alcune operazioni di base, come nascondere/mostrare la finestra di un programma, e persino cose davvero interessanti, come costringere un processo a caricare una DLL arbitraria nel suo spazio di memoria e avviare l'esecuzione di codice. Dopo l'iniezione della DLL iniziava la parte più interessante.
Nei primi mese e mezzo, questo detective non mi ha affatto disturbato, si è connesso al server VNC sul mio computer solo una o due volte. Ma una sessione in particolare probabilmente ha risvegliato il suo interesse. Stavo scrivendo un codice in C per nascondere le finestre di Minesweeper (senza chiuderle), per rendere più facile giocare in classe, e ho notato che l'icona bianca di VNC nella system tray era diventata nera. Questo significava che ora mi stava osservando.
Continuavo a scrivere codice come al solito, cercando di non prestare attenzione a lui. Nel frattempo, il computer ha cominciato a rallentare significativamente, cercando di trasmettere la massima frequenza dei fotogrammi a uno dei numerosi monitor nell'angolo della stanza. Windows ha quasi smesso di rispondere, e quando la mia pazienza è esaurita, sono uscito dal sistema e ho chiuso per oggi.
Durante le visite successive alla sala computer, Colombo mostrava quasi sempre un vivo interesse per quello che stavo facendo. Circa dopo il quarto incontro, ho deciso che bisognava fare qualcosa.
Ammetto che una persona razionale e sensata avrebbe potuto sollevare direttamente la questione con lui o con il suo superiore. Tuttavia, sono sempre caduto in tentazione e mi sono rapidamente convinto di adottare una strategia completamente diversa.
— Non potrai fare nulla senza questo server VNC! — mi sono detto tranquillamente e con fermezza più di una volta.
Era necessario eliminare VNC.
Ho cominciato a entrare nella sala computer con grandi gruppi di studenti e a sedermi il più lontano possibile dall'angolo dei monitor. Questo ha funzionato per un po' e mi ha dato tempo per verificare alcune idee.
Il mio primo tentativo, credo che sarete d'accordo, è stato piuttosto debole. Facendo clic destro sull'icona VNC nella system tray, ho visto un menu con le magiche lettere E-X-I-T. Sfortunatamente, le lettere erano scritte in un testo contornato grigio. L'amministratore aveva disabilitato l'opzione 'Esci' tramite l'editor dei criteri di gruppo. Ho cercato di terminare il processo dal Task Manager, ma ovviamente era invisibile per me, poiché funzionava sotto un altro account con più privilegi. Non ho ottenuto risultati.
Il server VNC gira sulla porta TCP 5900, mi sono ricordato. Il mio piano successivo era di inviare pacchetti danneggiati su quella porta per bloccarlo.
Almeno per alcuni giorni ho esaminato il protocollo, inviando sulla porta 5900 diverse forme di spazzatura ben strutturata e sperando che si bloccasse. Alla fine, anche questo non ha funzionato.
Avevo già iniziato a pensare che non sarei riuscito a liberarmi di questa cosa, quando all'improvviso mi è venuta in mente un'idea: doveva esserci una finestra! Devo visualizzarla. Forse ci sarà un bel pulsante succoso "Spegnere", che troverò un ottimo modo di utilizzare!
Ho avviato il mio codice C ormai quasi perfetto per trovare il descrittore della finestra principale di un altro processo e ho davvero trovato VNC. Mi sentivo esaltato quando le dita hanno digitato WM_SHOWWINDOW. Prova a indovinare cosa ho visto davanti a me?
Niente!
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 grande. Ho provato a inviare ad un'altra finestra VNC vari messaggi, e comunque niente.
E quindi mi è venuta di nuovo l'ispirazione!
Grazie a molto approfondito di Charles Petzold ho studiato attentamente come i processi Win32 funzionano all'interno del sistema. Ogni applicazione Win32 ha una finestra e una "coda di messaggi". I messaggi, provocati dall'interazione dell'utente, così come i messaggi inviati da Windows stessa, arrivano nella coda, e l'applicazione stessa decide come gestirli.
Non è molto interessante di per sé. Ma quando ho capito che una coda di messaggi non elaborati abbastanza grande funge da euristica per intervenire in un processo bloccato da parte del Window Process Manager, ho sudato serotonina pura.
Senza perdere un attimo, sono tornato al mio codice C, pronto a inviare un altro messaggio alla finestra principale di VNC WM_SHOWWINDOW. In un ciclo. Eterno. Quindi, molti messaggi WM_SHOWWINDOW, che, come ora sapevo, VNC avrebbe tentato di ignorare completamente… a suo rischio e pericolo.
Ho compilato e avviato 4 KB del codice più libero che abbia mai scritto. Circa tre secondi dopo Windows ha riportato che il processo vncserver.exe non risponde, e ha fatto un'offerta che semplicemente non potevo rifiutare:
Vuoi terminare questo processo?
Cavolo, SÌ!
Lasciami ammettere che il resto della giornata sono stato insopportabilmente soddisfatto di me stesso.
Dopo diverse ore trascorse a riflettere sul mio nuovo superpotere, decisi come avrei dovuto utilizzarlo. Semplicemente uccidere la sessione direttamente sotto i suoi occhi sarebbe stato troppo facile. Avevo un'idea migliore: scomparire del tutto.
Dopo Capì che avrei potuto scrivere un codice che avrebbe fatto due cose. In primo luogo, avrebbe occupato una porta TCP 5900 di recente liberata, precedentemente utilizzata da un ignorante processo del server VNC. Poi avrebbe stabilito una nuova connessione TCP con il server VNC della macchina designata. Il codice avrebbe semplicemente fatto da proxy per tutti i dati tra i due socket, e Colombo avrebbe pensato di connettersi a me, mentre in realtà si sarebbe connesso a un server VNC completamente diverso.
Il mio codice fungerà da ponte segreto tra me e qualche altra povera anima a mia scelta. Era magnifico.
Iniziò immediatamente a scrivere il mio falso bridge VNC. Colombo si connetteva a me diverse volte, ma io continuavo a programmare sotto i suoi occhi. Giunsi alla conclusione che non avesse la minima idea delle mie azioni, sebbene scrivessi cose ovvie, come i numeri delle porte e commenti come // Прощай, жуткий шпион VNC.
Dopo un paio di giorni, non riuscivo a far funzionare il codice correttamente. Peggio ancora, stavo praticamente lavorando incessantemente con l'icona nera VNC nella barra delle applicazioni. Finché era connesso, non potevo liberare la porta per controllare il mio codice.
Se solo avessi saputo allora di netcat!
Alla fine, i nervi cedettero, dopotutto ero un ragazzo di 17 anni impaziente. Mentre osservavo di nuovo l'icona bianca del server VNC trasformarsi in nero, mi irritai, aprii il codice originale che riempiva la coda dei messaggi e lo eseguii davanti a lui. Aspettai persino un paio di secondi prima di premere End Process, giusto per assicurarmi che lo avesse visto.
Se premere quel pulsante non mi aveva ancora convinto completamente che ne valesse la pena, il suo salto dalla sua postazione di monitor per avvicinarsi rapidamente a me e scacciarmi dalla stanza, sicuramente ne era valsa la pena.
Alla fine mi hanno vietato l'accesso alla rete per due settimane. Una giusta punizione, pensai. Circa tre settimane dopo, il server VNC scomparve dagli script di avvio e non comparve più da nessuna parte. Non scoprii mai se il mio incidente avesse avuto un ruolo in questo o meno, ma distrusse completamente il mio piano di arricchimento favoloso vendendo la mia pistola VNC agli studenti oppressi nelle sale computer dei college in tutto il paese.
Fonte: habr.com
