Batalha do Coder: Eu contra aquele cara do VNC

В este blog Vários contos de programadores foram publicados. Gosto de relembrar minhas velhas coisas estúpidas. Bem, aqui está outra história desse tipo.

Comecei a me interessar por computadores, especialmente programação, quando tinha cerca de 11 anos. No início do ensino médio bоPassei a maior parte do meu tempo livre mexendo no meu C64 e escrevendo BASIC, depois cortando o código incorreto com uma tesoura. Não estou brincando, tesoura.

Depois da escola (por volta dos 16 anos), as crianças britânicas costumam ir para a faculdade, onde optam por estudar três ou quatro disciplinas antes de irem para a universidade. Dado o meu amor pela caixa bege e pelo gravador em casa, decidi que estudar “ciências da computação” na faculdade era a escolha certa.

Gostei mais do curso do que esperava; lá conheci Pascal e Delphi.

Durante os intervalos entre as aulas, os alunos poderiam trabalhar em qualquer máquina livre da sala de informática. Imagine: uma sala enorme, projetada para cerca de cem pessoas, com fileiras de mesas cheias de máquinas, como aquelas onde fica o monitor da unidade do sistema. Os fãs estão constantemente zumbindo, as bolas de rato estão zumbindo nas mesas, sem parar por um segundo. Há um cheiro estranho no ar, como se 50 a 100 adolescentes hormonais trocassem periodicamente para resfriar centenas de chips Pentium III.

Apesar dos riscos para a saúde, gostava de ficar sentado em frente ao computador quando tinha um minuto livre.

O administrador de plantão na sala era um homem baixo e de meia-idade que foi escolhido para essa função por causa de seu desejo insaciável de se tornar um ditador malvado. Eu suponho que sim. De plantão é um eufemismo; o cara realmente amava seu trabalho. Ele foi encarregado de manter a ordem para que ninguém usasse o computador da escola para algo inapropriado.

Até hoje, minha intuição me diz que o bônus do administrador dependia diretamente do número de alunos que ele pegava pela mão e escoltava para fora da sala de informática. Tenho quase certeza de que esse cara pagou a hipoteca mais cedo.

Ele estava sentado no canto mais distante da sala de informática, em uma mesa de canto. E era seguro presumir que seus monitores de fertilidade haviam encontrado uma maneira de se reproduzir com um período de gestação impressionantemente curto, de tantos que eram. Só se poderia perguntar se ele realmente tinha tempo para acompanhar todos eles. Claro, estou brincando... já mencionei que ele levava seu trabalho muito a sério?

Naquela época, a rede de computadores rodava Windows 2000. Logo descobri que toda vez que eu fazia login no sistema, era iniciado um script que especificava o início do servidor VNC a partir da conta de administrador para acesso remoto à área de trabalho. Sempre que esse cara queria espionar você, ele se conectava diretamente à sua máquina e observava. Foi assustador e, agora que penso nisso, provavelmente ilegal.

Depois de aprender BASIC e C64, agora escrevi em C e até um pouco de C++. Naquela época, eu ainda estava muito interessado na linguagem D, que corrigia algumas deficiências do C++, como eu via então.

Eu costumava ir para a sala de informática para ler algo novo em D ou brincar com o compilador Digital Mars D. Às vezes, enquanto estava distraído de pensar no grande futuro de D, escrevia código C para hackear outros programas Win32 através de sua janela alças.

Nos bons e velhos tempos da programação Win32, encontrar um identificador de janela era o método mais fácil de hackear outros programas. Obviamente, todos os programas GUI do Windows tinham uma janela, mesmo que ela não aparecesse na tela. Ao escrever um programa para recuperar um identificador para outro processo (essencialmente um link para ele), você poderia enviar mensagens para ele. Isso permitiu algumas operações básicas, como ocultar/mostrar uma janela de programa, bem como coisas muito legais, como forçar um processo a carregar uma DLL arbitrária em seu espaço de memória e começar a executar o código. Após a injeção da DLL, a diversão começou.

No primeiro mês e meio, esse detetive não me incomodou muito, ele se conectou ao servidor VNC da minha máquina apenas uma ou duas vezes. Mas uma sessão em particular pode ter despertado o seu interesse. Eu estava escrevendo um código C para ocultar as janelas do Campo Minado (sem fechá-las) para facilitar o jogo nas aulas, quando percebi que o ícone branco do VNC na bandeja do sistema havia ficado preto. Isso significava que ele agora estava me observando.

Continuei codificando normalmente, tentando ignorá-lo. Enquanto isso, a máquina começou a desacelerar, tentando transmitir a taxa máxima de quadros para um dos inúmeros monitores no canto da sala. O Windows quase parou de responder, quando minha paciência acabou, desconectei e terminei o dia.

Nas visitas subsequentes à sala de informática, Colombo demonstrou grande interesse pelo que eu estava fazendo quase todas as vezes. Depois da quarta vez, decidi: preciso fazer algo a respeito.

Admito que uma pessoa razoável e racional poderia simplesmente ter levantado esta questão diretamente com ele ou com o seu chefe. No entanto, sempre cedi à tentação e rapidamente me convenci a adotar uma estratégia completamente diferente.

- Você não pode fazer nada sem este servidor VNC! — Eu disse a mim mesmo com calma e decisão várias vezes.

Foi necessário matar o VNC.

Comecei a entrar na sala de informática com grandes grupos de alunos e a sentar-me o mais longe possível do canto dos monitores. Isso funcionou por um tempo e me deu algum tempo para testar ideias.

Minha primeira tentativa, acho que você concordará, foi bem fraca. Ao clicar com o botão direito no ícone do VNC na bandeja do sistema, vi um menu com as letras mágicas EXIT. Infelizmente, as cartas foram escritas em texto com contorno cinza. O administrador desabilitou o item de menu “Sair” por meio do Editor de Política de Grupo. Tentei encerrar o processo no Gerenciador de Tarefas, mas é claro que ele estava invisível para mim porque estava sendo executado em uma conta diferente e mais privilegiada. Não deu certo.

O servidor VNC roda na porta TCP 5900, lembrei-me. Meu próximo plano era enviar pacotes corrompidos para esta porta para travá-la.

Passei pelo menos alguns dias mexendo no protocolo, enviando várias formas de lixo bem estruturado para a porta 5900 e esperando 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 dei conta: deve haver uma janela ali! Precisamos exibi-lo. Talvez tenha um botão “Mudo” bonito e suculento que eu possa usar muito bem!

Executei meu código C agora quase perfeito para encontrar o identificador da janela principal de outro processo - e com certeza, o VNC foi encontrado. Eu me senti inspirado quando meus dedos digitaram WM_SHOWWINDOW. Tente adivinhar o que vi na minha frente?

Nada

Agora fiquei curioso... tinha uma janela, mas ignorava minhas mensagens. Verifiquei novamente meu código para ter certeza de que funciona. Testei em vários outros processos e funcionou muito bem. Tentei enviar outras mensagens para a janela do VNC e ainda nada.

E então me ocorreu novamente!

Graças ao muito grosso um livro Charles Petzold Estudei cuidadosamente como os processos Win32 funcionam dentro do sistema. Cada aplicativo Win32 possui uma janela e também uma "fila de mensagens". As mensagens acionadas pela interação do usuário, assim como as mensagens enviadas pelo próprio Windows, chegam em uma fila e o próprio aplicativo decide como processá-las.

Não é muito interessante por si só. Mas quando percebi que uma fila de mensagens não processadas grande o suficiente agia como uma heurística para o Window Process Manager intervir em um processo travado, comecei a suar pura serotonina.

Sem perder um segundo, voltei ao meu código C, me preparando para enviar outra mensagem para a janela principal do VNC WM_SHOWWINDOW. Em um ciclo. Eterno. Então, muitas mensagens. WM_SHOWWINDOW, que eu agora sabia que o VNC tentaria ignorar completamente... por sua conta e risco.

Compilei e executei 4 KB do código que mais ama a liberdade da minha vida. Após cerca de três segundos, o Windows relatou que o processo vncserver.ехе não responde e fez uma oferta que simplesmente não pude recusar:

Deseja concluir este processo?

CLARO QUE SIM!

Deixe-me admitir que durante o resto do dia fiquei insuportavelmente satisfeito comigo mesmo.

Depois de algumas horas digerindo meu novo superpoder, decidi como iria usá-lo. Foi muito fácil simplesmente encerrar a sessão bem na frente dele. Tive uma ideia melhor: desaparecer completamente.

Depois batismo de fogo com programação de soquete Percebi que poderia escrever um código que faria duas coisas. Ele ocupará primeiro a porta TCP 5900 recém-liberada, anteriormente ocupada pelo processo do servidor VNC sem noção. Em seguida, criará uma nova conexão TCP com o servidor VNC da máquina especificada. O código simplesmente fará proxy de todos os dados entre os dois soquetes, e Columbo pensará que está se conectando a mim, quando na verdade ele estará se conectando a um servidor VNC completamente diferente.

Meu código funcionará como uma ponte secreta entre mim e alguma outra pobre alma de minha escolha. Foi maravilhoso.

Imediatamente comecei a escrever minha ponte VNC falsa. Columbo conectou-se comigo diversas vezes, mas continuei programando na frente dele. Cheguei à conclusão de que ele não tinha ideia do que eu estava fazendo, embora eu tenha escrito coisas óbvias como números de porta e comentários como // Прощай, жуткий шпион VNC.

Depois de alguns dias, não consegui fazer o código funcionar corretamente. Para piorar a situação, eu estava trabalhando quase continuamente com o ícone preto do VNC na bandeja do sistema. Enquanto estava conectado, não consegui liberar a porta para testar meu código.

Se eu soubesse então netcat!

No final, meus nervos cederam; afinal, eu era um garoto impaciente de 17 anos. Observando o ícone branco do servidor VNC ficar preto novamente, eu surtei, abri o código original que preenchia a fila de mensagens e o executei na frente de seus olhos. Eu até esperei alguns segundos antes de clicar End Process, só para ter certeza de que ele viu.

Se apertar aquele botão não me convenceu totalmente de que valia a pena, então ele saltando de trás de sua fortaleza de monitores para se aproximar rapidamente de mim e me tirar da sala certamente o fez.

Como resultado, fui banido da rede por duas semanas. Uma punição justa, pensei. Após cerca de três semanas, o servidor VNC desapareceu dos scripts de inicialização e nunca mais apareceu em nenhum outro lugar. Nunca soube se meu incidente teve algum papel nisso ou não, mas arruinou completamente meu plano de ficar fabulosamente rico vendendo minha arma VNC para estudantes deprimidos em salas de informática de faculdades em todo o país.

Fonte: habr.com

Adicionar um comentário