En Se han publicado muchas anécdotas de programadores. Me gusta recordar mis antiguas tonterías. Bueno, aquí hay otra historia así.
Me interesé por primera vez en las computadoras, especialmente en la programación, cuando tenía alrededor de 11 años. Al principio de la escuela secundaria,mayor audiencia.pasaba la mayor parte de mi tiempo libre con mi C64, escribiendo en Basic y luego cortando con tijeras el código malo. .
Después de la escuela (a los 16 años aproximadamente), los niños británicos suelen ir al colegio, donde eligen tres o cuatro asignaturas antes de ir a la universidad. Dado mi amor por la caja beige y la grabadora en casa, pensé que estudiar 'informática' en el colegio sería la elección correcta.
El curso me gustó más de lo que esperaba; allí fue donde conocí por primera vez Pascal y Delphi.
Durante los descansos, los estudiantes podían trabajar en cualquier máquina disponible en el laboratorio de computación. Imagina: una gran sala para unas cien personas, con filas de mesas llenas de computadoras, como esas donde el monitor está encima de la unidad central. El constante zumbido de los ventiladores, las bolas de los ratones retumbando en las mesas sin parar. En el aire, un extraño olor, como si de 50-100 adolescentes emitiendo hormonas se alternaran periódicamente para enfriar cientos de chips Pentium III.
A pesar de los riesgos para la salud, me gustaba estar sentado frente a la computadora cuando tenía un minuto libre.
En la sala había un administrador, un hombre de mediana estatura al que eligieron para este papel por su incesante deseo de convertirse en un dictador malvado. Supongo. Estar de guardia es poco decir, al tipo realmente le encantaba su trabajo. Se le encargó mantener el orden, para que nadie usara la computadora de estudio para algo inapropiado.
Y hasta el día de hoy, mi intuición me dice que el bono del administrador dependía directamente del número de estudiantes que atrapara y expulsara del laboratorio de computación. Estoy prácticamente seguro de que este tipo pagó su hipoteca anticipadamente.
Él estaba sentado en la esquina trasera de la sala de computadoras, detrás de una mesa en forma de L. Y se podía suponer con certeza que sus fértiles monitores habían encontrado la manera de reproducirse con un sorprendentemente corto periodo de gestación— ¡había tantos! Solo quedaba especular si realmente lograba mantener un ojo en todos ellos. Claro, es una broma… ¿mencioné que él se tomaba su trabajo muy en serio?
En ese momento, la red de computadoras funcionaba bajo Windows 2000. Pronto descubrí que cada vez que iniciaba sesión, se ejecutaba un script que iniciaba el servidor VNC desde la cuenta de administrador para acceso remoto al escritorio. Cada vez que este tipo quería espiar, se conectaba directamente a tu máquina y observaba. Era escalofriante y, pensándolo bien ahora, probablemente ilegal.
Habiendo afilado mis habilidades en BASIC y C64, ahora escribía en C e incluso un poco en C++. En ese entonces, también me había entusiasmado mucho con el lenguaje D, el cual corregía ciertos defectos de C++, según lo que pensaba en ese momento.
Solía entrar en la sala de computadoras para leer algo nuevo sobre D o jugar con el compilador Digital Mars D. A veces, distraído de mis pensamientos sobre el gran futuro de D, escribía código en C para hackear otros programas Win32 a través de los identificadores de sus ventanas.
En los viejos tiempos de la programación en Win32, buscar el identificador de una ventana era el método más simple para hackear otros programas. Obviamente, todos los programas con interfaz gráfica en Windows tenían una ventana, incluso si no se mostraba en pantalla. Al escribir un programa para extraer el identificador de otro proceso (en esencia, un enlace a él), podías enviarle mensajes. Esto te permitía realizar algunas operaciones básicas, como ocultar/mostrar la ventana de un programa, así como cosas realmente interesantes, como hacer que un proceso cargara una DLL arbitraria en su espacio de memoria y comenzara a ejecutar código. Después de la inyección de la DLL, comenzaba la parte más emocionante.
Durante los primeros mes y medio, este detective no me molestó en particular, se conectó al servidor VNC en mi máquina solo una o dos veces. Pero una sesión en particular probablemente despertó su interés. Estaba escribiendo algún código en C para ocultar las ventanas de Minesweeper (sin cerrarlas), para facilitar el juego en clase, y en ese momento noté que el ícono blanco de VNC en la bandeja del sistema se volvió negro. Eso significaba que ahora me estaba observando.
Continué programando como de costumbre, tratando de no prestarle atención. Mientras tanto, la máquina comenzó a funcionar lentamente, intentando transmitir la máxima tasa de frames a uno de los innumerables monitores en la esquina de la habitación. Windows casi dejó de responder, y cuando mi paciencia se agotó, cerré sesión y terminé por hoy.
Durante las próximas visitas al laboratorio de computadoras, Columbo mostraba casi cada vez un interés vivo por lo que estaba haciendo. Aproximadamente después de la cuarta vez, decidí que había que hacer algo al respecto.
Reconozco que una persona razonable y lógica podría simplemente haber planteado esta cuestión directamente con él o su jefe. Sin embargo, siempre sucumbía a la tentación y rápidamente me convencía de elegir una estrategia completamente diferente.
— ¡No podrás hacer nada sin este servidor VNC! — me dije a mí mismo con tranquilidad y determinación varias veces.
Era necesario acabar con VNC.
Empecé a entrar en el laboratorio de computadoras con grandes grupos de estudiantes y a sentarme lo más lejos posible de la esquina con los monitores. Por un tiempo, esto funcionó y me dio algo de tiempo para revisar ideas.
Mi primer intento, creo que estarás de acuerdo, fue bastante débil. Al hacer clic derecho en el ícono de VNC en la bandeja del sistema, vi un menú con las mágicas letras E-X-I-T. Desafortunadamente, las letras estaban escritas en un texto de contorno gris. El administrador había desactivado la opción de menú 'Salir' a través del editor de directivas de grupo. Intenté acabar con el proceso desde el Administrador de tareas, pero, por supuesto, era invisible para mí, ya que se ejecutaba bajo otra cuenta más privilegiada. No funcionó.
Recordé que el servidor VNC se ejecuta en el puerto TCP 5900. Mi siguiente plan consistía en enviar paquetes dañados a este puerto para colapsarlo.
Durante al menos unos días estuve analizando el protocolo, enviando a través del puerto 5900 diversas formas de basura correctamente estructurada y esperando que se rompiera. Al final, tampoco funcionó.
Ya estaba empezando a pensar que no podría deshacerme de esta cosa, cuando de repente se me iluminó la mente: ¡debe haber una ventana! Necesito mostrarla. ¡Quizás tenga un buen y jugoso botón de 'Apagar' que puedo usar para algo interesante!
Ejecuté mi casi perfecto código en C para encontrar el identificador de la ventana principal de otro proceso y, de hecho, encontré VNC. Me sentí elevado cuando mis dedos escribieron WM_SHOWWINDOW. ¿Puedes adivinar lo que vi frente a mí?
¡Nada!
Ahora me dio curiosidad... tenía una ventana, pero ignoraba mis mensajes. Verifiqué mi código dos veces para asegurarme de que funcionara. Lo probé en varios otros procesos y funcionó genial. Intenté enviar otros mensajes a la ventana de VNC y, aún así, nada.
Y entonces, ¡se me ocurrió de nuevo!
Gracias a la muy densa Charles Petzold, estudié en profundidad cómo funcionan los procesos Win32 dentro del sistema. Cada aplicación Win32 tiene una ventana, así como una 'cola de mensajes'. Los mensajes, generados por la interacción del usuario, así como los enviados por Windows mismo, llegan a la cola, y la propia aplicación decide cómo manejarlos.
No es muy interesante en sí mismo. Pero cuando comprendí que una cola de mensajes suficientemente grande sin procesar actúa como una heurística para interferir en un proceso congelado desde el Administrador de Procesos de Ventanas, me llené de pura serotonina.
Sin perder un segundo, volví a mi código en C, preparándome para enviar otro mensaje a la ventana principal de VNC WM_SHOWWINDOW. En un bucle. Eterno. Así que, varios mensajes WM_SHOWWINDOW, que ahora sabía que VNC intentaría ignorar completamente... por su propio riesgo.
Compilé y ejecuté 4 KB del código más libertario de mi vida. Aproximadamente tres segundos después, Windows informó que el proceso vncserver.exe no responde, y me hizo una oferta que simplemente no podía rechazar:
¿Desea terminar este proceso?
¡Maldita sea, SÍ!
Permítanme confesar que el resto del día estuve inmensamente complacido conmigo mismo.
Después de varias horas asimilando mi nuevo superpoder, decidí cómo lo iba a utilizar. Simplemente matar la sesión frente a él sería demasiado fácil. Tenía una idea mejor: desaparecer por completo.
Después Me di cuenta de que podía escribir un código que hiciera dos cosas. Primero, ocuparía el puerto TCP 5900 que había sido liberado recientemente, el cual había estado ocupado por un proceso ignorante del servidor VNC. Luego, establecería una nueva conexión TCP con el servidor VNC de la máquina especificada. El código simplemente pasaría todos los datos entre los dos sockets, y Columbo pensaría que se estaba conectando a mí, cuando en realidad se estaba conectando a un servidor VNC completamente diferente.
Mi código actuaría como un puente secreto entre yo y alguna otra alma desafortunada de mi elección. Era maravilloso.
Inmediatamente comencé a escribir mi falso puente VNC. Columbo se había conectado a mí varias veces, pero yo seguía programando frente a él. Llegué a la conclusión de que no tenía idea de mis acciones, aunque estaba escribiendo cosas obvias, como números de puertos y comentarios como // Прощай, жуткий шпион VNC.
Después de un par de días, no podía hacer que el código funcionara correctamente. Peor aún, trabajaba casi continuamente con el ícono negro de VNC en la bandeja del sistema. Mientras estuviera conectado, no podía liberar el puerto para probar mi código.
Si hubiera sabido entonces sobre netcat!
Al final, los nervios no aguantaron; después de todo, era un chico impaciente de 17 años. Al ver cómo el ícono blanco del servidor VNC se volvía negro, me desesperé, abrí el código original que llenaba la cola de mensajes y lo ejecuté frente a él. Incluso esperar unos segundos antes de presionar End Process, solo para asegurarme de que él lo viera.
Si pulsar este botón no me convenció completamente de que valía la pena, su salto desde su seguro puesto frente a los monitores para acercarse rápidamente a mí y ejectarme de la sala definitivamente lo valió.
Al final, se me prohibió el acceso a la red durante dos semanas. Pensé que era un castigo justo. Aproximadamente tres semanas después, el servidor VNC desapareció de los scripts de inicio y no volvió a aparecer en ninguna parte. Nunca supe si mi incidente tuvo algún papel en esto o no, pero arruinó por completo mi plan de enriquecimiento a través de la venta de mi herramienta VNC a estudiantes oprimidos en los laboratorios de computación de todo el país.
Fuente: habr.com
