Em foram publicadas várias histórias de programadores. Eu gosto de lembrar das minhas antigas bobagens. Bem, aqui vai mais uma dessas histórias.
Eu me interessei pela computação, especialmente programação, quando tinha cerca de 11 anos. No início do ensino fundamental,maiorpassava a maior parte do meu tempo livre brincando com meu C64 e programando em Basic, e depois cortava o código ruim com tesouras. .
Após a escola (por volta dos 16 anos), crianças britânicas geralmente vão para o colégio, onde escolhem três ou quatro disciplinas para estudar antes de ingressar na universidade. Considerando meu amor pela caixa bege e o gravador em casa, decidi que estudar 'ciência da computação' no colégio seria a escolha certa.
O curso me agradou mais do que eu esperava; foi lá que conheci Pascal e Delphi pela primeira vez.
Durante os intervalos, os alunos podiam usar qualquer computador disponível na sala de informática. Imagine: uma sala enorme, projetada para cerca de cem pessoas, com filas de mesas cheias de máquinas — como aquelas onde o monitor fica em cima da unidade central. O barulho constante das ventoinhas, as bolinhas dos mouses rolando nas mesas sem parar. O ar tinha um cheiro estranho, como se 50-100 adolescentes, que exalam hormônios, fossem periodicamente substituídos para esfriar uma centena de chips Pentium III.
Apesar dos riscos à saúde, eu gostava de sentar na frente do computador sempre que tinha um minuto livre.
Na sala, havia um administrador, um homem de estatura média, escolhido para esse papel devido à sua incessante vontade de se tornar um ditador malvado. Eu suponho. Estava de plantão — isso é um eufemismo, o cara realmente adorava seu trabalho. Ele tinha a tarefa de manter a ordem, para que ninguém usasse o computador acadêmico para algo inapropriado.
E até hoje, minha intuição me diz que o prêmio do administrador dependia diretamente do número de alunos que ele pegava em flagrante e expulsava da sala de informática. Estou praticamente certo de que esse cara pagou sua hipoteca antecipadamente.
Ele estava sentado em um canto distante do salão de computadores, atrás de uma mesa no formato de L. E podia-se supor com confiança que seus férteis monitores encontraram uma maneira de se multiplicar em um período de gestação impressionantemente curto — eram muitos. Restava apenas perguntar se ele realmente conseguia monitorá-los todos. Claro, estou brincando… mencionei que ele levava o trabalho muito a sério?
Na época, a rede de computadores funcionava sob o Windows 2000. Logo percebi que, a cada login, um script era executado, que iniciava o servidor VNC a partir da conta de administrador para acesso remoto à área de trabalho. Sempre que aquele cara queria vigiá-lo, ele se conectava diretamente à sua máquina e observava. Isso era assustador e, se pensar bem agora, provavelmente ilegal.
Afiando os dentes em BASIC e C64, agora eu escrevia em C e até um pouco em C++. Naquela época, fiquei realmente intrigado com a linguagem D, que corrigia algumas falhas do C++, na minha visão na época.
Eu costumava entrar no salão de computadores para ler algo novo sobre D ou brincar com o compilador Digital Mars D. Às vezes, me distraindo de pensamentos sobre o grande futuro do D, eu escrevia código em C para invadir outros programas Win32 através dos descritores de suas janelas.
Nos velhos tempos de programação em Win32, encontrar o descritor da janela era o método mais simples para invadir outros programas. É evidente que todos os programas com interface gráfica no Windows tinham uma janela, mesmo que não estivesse visível na tela. Ao escrever um programa para extrair o descritor de outro processo (basicamente, um link para ele), você podia enviar mensagens para ele. Isso permitia realizar algumas operações básicas, como ocultar/exibir a janela do programa, além de coisas realmente legais, como forçar o processo a carregar uma DLL arbitrária em seu espaço de memória e começar a executar código. Depois da injeção da DLL, a parte mais interessante começava.
Nos primeiros mês e meio, esse detetive não me incomodou muito, ele se conectou ao servidor VNC na minha máquina apenas uma ou duas vezes. Mas uma sessão em particular provavelmente despertou seu interesse. Eu estava escrevendo algum código em C para ocultar as janelas do Minesweeper (sem fechá-las), para facilitar o jogo na aula, e então notei que o ícone branco do VNC na bandeja do sistema havia se tornado preto. Isso significava que ele estava me observando.
Continuei codificando como de costume, tentando não prestar atenção nele. Enquanto isso, a máquina começou a desacelerar bastante, tentando transmitir a taxa máxima de quadros para um dos inúmeros monitores no canto da sala. O Windows quase parou de responder, e quando minha paciência se esgotou, saí do sistema e terminei por hoje.
Durante as visitas seguintes ao laboratório de computadores, Colombo quase sempre demonstrava um interesse vivo pelo que eu estava fazendo. Aproximadamente após a quarta vez, decidi que era preciso fazer algo a respeito.
Reconheço que uma pessoa razoável e racional poderia ter levantado essa questão diretamente com ele ou seu chefe. No entanto, sempre sucumbi à tentação e rapidamente me convenci a adotar uma estratégia completamente diferente.
— Você não conseguirá fazer nada sem este servidor VNC! — disse-me calmamente, com determinação, algumas vezes.
Era preciso eliminar o VNC.
Comecei a entrar no laboratório de computadores com grandes grupos de alunos e a me sentar o mais distante possível do canto com os monitores. Durante um tempo isso funcionou e me deu um pouco de tempo para testar ideias.
Minha primeira tentativa, eu acho que você concordará, foi bastante fraca. Ao clicar com o botão direito no ícone do VNC na bandeja do sistema, vi um menu com as mágicas letras E-X-I-T. Infelizmente, as letras estavam escritas em texto contornado cinza. O administrador desativou a opção "Sair" através do editor de política de grupos. Tentei encerrar o processo pelo Gerenciador de Tarefas, mas, claro, ele estava invisível para mim, pois estava rodando sob outra conta com mais privilégios. Nada funcionou.
Lembrei-me de que o servidor VNC roda na porta TCP 5900. Meu próximo plano consistia em enviar pacotes corrompidos para essa porta, a fim de travá-lo.
Pelo menos por alguns dias, examinei o protocolo, enviando ao porto 5900 várias formas de lixo estruturado corretamente e torcendo para que ele quebrasse. No final, isso também não funcionou.
Eu já estava começando a pensar que não conseguiria me livrar dessa coisa, quando de repente me ocorreu: deve haver uma janela! Eu preciso exibi-la. Talvez haja um botão grande e suculento de ‘Desligar’ nele, que eu possa usar de forma excelente!
Eu executei meu código C quase perfeito para encontrar o descritor da janela principal de outro processo — e realmente encontrei o VNC. Eu me senti elevado quando meus dedos digitaram WM_SHOWWINDOW. Tente adivinhar o que eu vi diante de mim?
Nada!
Agora, fiquei curioso... havia uma janela, mas ela ignorava minhas mensagens. Eu verifiquei meu código duas vezes para garantir que estava funcionando. Testei em vários outros processos e funcionou perfeitamente. Tentei enviar outras mensagens para a janela VNC e ainda assim nada.
E então me ocorreu novamente!
Graças a um livro muito grosso Não é muito interessante por si só. Mas quando percebi que uma fila de mensagens não processadas grande o suficiente funcionava como uma heurística para interferir em um processo travado pela gerência do Window Process Manager, eu fiquei tomado por puro serotonina.
Sem perder tempo, voltei ao meu código C, me preparando para enviar mais uma mensagem para a janela principal do VNC
. Em um loop. Eterno. Então, uma infinidade de mensagens WM_SHOWWINDOW, que agora eu sabia que o VNC tentaria ignorar completamente... por sua própria conta e risco. WM_SHOWWINDOWCompilei e executei 4 KB do código mais livre que já escrevi na minha vida. Cerca de três segundos depois, o Windows informou que o processo
vncserver.exe não respondeu, e fez uma oferta que eu simplesmente não pude recusar: Você deseja encerrar este processo?
Droga, SIM!
Deixe-me admitir que o restante do dia eu estava insuportavelmente satisfeito comigo mesmo.
Позвольте признаться, что остаток дня я был невыносимо доволен собой.
Depois de algumas horas refletindo sobre meu novo superpoder, decidi como iria usá-lo. Apenas terminar a sessão bem diante dele era simples demais. Eu tinha uma ideia melhor – desaparecer completamente.
Depois , percebi que poderia escrever um código que faria duas coisas. Primeiro, ele ocuparia a porta TCP 5900, recentemente liberada por um processo ignorante do servidor VNC. Depois, criaria uma nova conexão TCP com o servidor VNC da máquina especificada. O código apenas fará um proxy de todos os dados entre os dois sockets, e Columbo achará que está se conectando a mim, enquanto na verdade estará se conectando a um servidor VNC completamente diferente.
Meu código funcionará como uma ponte secreta entre mim e alguma outra alma infeliz de minha escolha. Isso era maravilhoso.
Imediatamente comecei a escrever minha ponte falsa VNC. Columbo se conectou a mim algumas vezes, mas eu continuei programando bem diante dele. Cheguei à conclusão de que ele não tinha ideia do que eu estava fazendo, mesmo escrevendo coisas óbvias, como números de porta e comentários como // Прощай, жуткий шпион VNC.
Depois de alguns dias, eu não conseguia fazer o código funcionar corretamente. O que era pior, eu trabalhava praticamente sem parar com o ícone preto do VNC na bandeja do sistema. Enquanto estivesse conectado, não poderia liberar a porta para testar meu código.
Se eu soubesse sobre netcat!
Na verdade, meus nervos não aguentaram, afinal eu era um garoto de 17 anos impaciente. Observando novamente o ícone branco do servidor VNC ficar preto, eu perdi a calma, abri o código original que preenchia a fila de mensagens e executei na frente dele. Eu até esperei alguns segundos antes de pressionar End Process, apenas para garantir que ele visse.
Se pressionar esse botão ainda não me convenceu completamente de que valeu a pena, então seu salto de trás do forte de monitores para se aproximar rapidamente de mim e me expulsar da sala definitivamente valeu a pena.
No final, fui banido do acesso à rede por duas semanas. Uma punição justa, pensei. Cerca de três semanas depois, o servidor VNC desapareceu dos scripts de inicialização e não apareceu mais em lugar algum. Nunca soube se o meu incidente teve algum papel nisso ou não, mas isso destruiu completamente meu plano de enriquecimento fantasioso vendendo minha arma VNC para estudantes oprimidos nas salas de informática das faculdades por todo o país.
Fonte: habr.com
