Batalla de codificadores: yo contra ese tipo de VNC

В este blog Se han publicado bastantes cuentos de programadores. Me gusta recordar mis viejas estupideces. Bueno, aquí hay otra historia similar.

Me interesé por primera vez en las computadoras, especialmente en la programación, cuando tenía unos 11 años. Al comienzo de la escuela secundaria bоPasé la mayor parte de mi tiempo libre jugueteando con mi C64 y escribiendo BASIC, luego recortando el código incorrecto con unas tijeras. No estoy bromeando, tijeras..

Después de la escuela (alrededor de los 16 años), los niños británicos suelen ir a la universidad, donde eligen estudiar tres o cuatro materias antes de ir a la universidad. Dado mi amor por la caja beige y la grabadora que tenía en casa, decidí que estudiar “informática” en la universidad era la elección correcta.

Disfruté el curso más de lo que esperaba; Allí conocí a Pascal y Delphi.

Durante los descansos entre clases, los estudiantes podían trabajar en cualquier máquina libre en la sala de ordenadores. Imagínese: una sala enorme, diseñada para unas cien personas, con filas de mesas llenas de máquinas, como aquellas donde se encuentra el monitor en la unidad del sistema. Los aficionados tararean constantemente, las bolas de ratón zumban sobre las mesas, sin parar ni un segundo. Hay un olor extraño en el aire, como si entre 50 y 100 adolescentes hormonales cambiaran periódicamente para enfriar cientos de chips Pentium III.

A pesar de los riesgos para la salud, me gustaba sentarme frente a la computadora cuando tenía un minuto libre.

El administrador de turno en la sala era un hombre bajo, de mediana edad, que fue elegido para este papel debido a su insaciable deseo de convertirse en un malvado dictador. Supongo que sí. Estar de servicio es quedarse corto; al chico realmente le encantaba su trabajo. Tenía la tarea de mantener el orden para que nadie usara la computadora de la escuela para nada inapropiado.

Hasta el día de hoy, mi intuición me dice que la bonificación del administrador dependía directamente de la cantidad de estudiantes que tomó de la mano y escoltó fuera de la sala de computadoras. Estoy bastante seguro de que este tipo pagó su hipoteca antes de tiempo.

Se sentó en el rincón más alejado de la sala de ordenadores, en una mesa del rincón. Y era seguro asumir que sus monitores de fertilidad habían encontrado una manera de reproducirse con un período de gestación impresionantemente corto, había tantos. Uno sólo podría preguntarse si realmente tuvo tiempo para seguirles la pista a todos. Por supuesto, estoy bromeando... ¿mencioné que se tomaba su trabajo muy en serio?

En ese momento, la red informática ejecutaba Windows 2000. Pronto descubrí que cada vez que iniciaba sesión en el sistema, se iniciaba un script que especificaba iniciar el servidor VNC desde la cuenta de administrador para acceso remoto al escritorio. Cada vez que este tipo quería espiarte, se conectaba directamente a tu máquina y observaba. Fue espeluznante y ahora que lo pienso, probablemente ilegal.

Después de haberme iniciado en BASIC y C64, ahora escribí en C e incluso un poco de C++. En ese momento, todavía estaba muy interesado en el lenguaje D, que corrigía algunas de las deficiencias de C++, tal como lo veía entonces.

Solía ​​​​entrar en la sala de computadoras para leer algo nuevo sobre D o jugar con el compilador Digital Mars D. A veces, mientras me distraía pensando en el gran futuro de D, escribía código C para piratear otros programas Win32 a través de su ventana. manejas.

En los viejos tiempos de la programación Win32, encontrar un identificador de ventana era el método más fácil para piratear otros programas. Obviamente, todos los programas GUI en Windows tenían una ventana, incluso si no aparecía en la pantalla. Al escribir un programa para recuperar un identificador de otro proceso (esencialmente un enlace a él), podría enviarle mensajes. Esto permitió algunas operaciones básicas como ocultar/mostrar una ventana de programa, así como cosas realmente interesantes como forzar a un proceso a cargar una DLL arbitraria en su espacio de memoria y comenzar a ejecutar código. Después de la inyección de DLL, comenzó la diversión.

Durante el primer mes y medio, este detective no me molestó mucho; se conectó al servidor VNC de mi máquina sólo una o dos veces. Pero una sesión en particular pudo haber despertado su interés. Estaba escribiendo código C para ocultar las ventanas del Buscaminas (sin cerrarlas) para que fuera más fácil jugar en clase, cuando noté que el icono blanco de VNC en la bandeja del sistema se había vuelto negro. Esto significaba que ahora me estaba mirando.

Continué codificando como de costumbre, tratando de ignorarlo. Mientras tanto, la máquina comenzó a disminuir la velocidad, tratando de transmitir la máxima velocidad de fotogramas a uno de los innumerables monitores en la esquina de la habitación. Windows casi dejó de responder, cuando se me acabó la paciencia, cerré la sesión y terminé el día.

En visitas posteriores a la sala de ordenadores, Colombo mostró gran interés en lo que yo hacía casi siempre. Después de aproximadamente la cuarta vez, decidí: necesito hacer algo al respecto.

Admito que una persona razonable y racional podría simplemente haber planteado esta cuestión directamente a él o a su jefe. Sin embargo, siempre cedí a la tentación y rápidamente me convencí de adoptar una estrategia completamente diferente.

- ¡No puedes hacer nada sin este servidor VNC! — Me dije varias veces con calma y decisión.

Era necesario matar a VNC.

Empecé a entrar en la sala de ordenadores con grandes grupos de estudiantes y a sentarme lo más lejos posible de la esquina con los monitores. Esto funcionó durante un tiempo y me dio algo de tiempo para probar 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 letras mágicas SALIR. Desafortunadamente, las cartas estaban escritas en un texto con un contorno gris. El administrador ha desactivado el elemento del menú "Salir" a través del Editor de políticas de grupo. Intenté finalizar el proceso desde el Administrador de tareas, pero, por supuesto, era invisible para mí porque se ejecutaba con una cuenta diferente y con más privilegios. No funcionó.

Recordé que el servidor VNC se ejecuta en el puerto TCP 5900. Mi siguiente plan era enviar paquetes corruptos a este puerto para bloquearlo.

Pasé al menos unos días jugueteando con el protocolo, enviando varias formas de basura bien estructurada al puerto 5900 con la esperanza de que se estropeara. Al final eso tampoco funcionó.

Ya estaba empezando a pensar que no podría deshacerme de esta cosa, cuando de repente me di cuenta: ¡debe haber una ventana allí! Necesitamos mostrarlo. ¡Quizás tenga un bonito y jugoso botón de “Silenciar” que pueda darle un buen uso!

Ejecuté mi código C ahora casi perfecto para encontrar el identificador de la ventana principal de otro proceso y, efectivamente, se encontró VNC. Me sentí inspirado cuando mis dedos escribieron WM_SHOWWINDOW. ¿Intentas adivinar lo que vi frente a mí?

Nada

Ahora tenía curiosidad... tenía una ventana, pero ignoraba mis mensajes. Verifiqué dos veces mi código para asegurarme de que funciona. Lo probé en varios otros procesos y funcionó muy bien. Intenté enviar otros mensajes a la ventana de VNC y todavía nada.

¡Y entonces me di cuenta de nuevo!

Gracias al muy grueso un libro Charles Petzold Estudié cuidadosamente cómo funcionan los procesos Win32 dentro del sistema. Cada aplicación Win32 tiene una ventana y una "cola de mensajes". Los mensajes desencadenados por la interacción del usuario, así como los mensajes enviados por el propio Windows, llegan a una cola y la propia aplicación decide cómo procesarlos.

No muy interesante en sí mismo. Pero cuando me di cuenta de que una cola de mensajes sin procesar lo suficientemente grande actuaba como una heurística para que Window Process Manager interviniera en un proceso bloqueado, comencé a sudar serotonina pura.

Sin perder un segundo, volví a mi código C, preparándome para enviar otro mensaje a la ventana principal de VNC. WM_SHOWWINDOW. En un ciclo. Eterno. Entonces, muchos mensajes. WM_SHOWWINDOW, que ahora sabía que VNC intentaría ignorar por completo... bajo su propio riesgo.

Compilé y ejecuté 4 KB del código más amante de la libertad de mi vida. Después de unos tres segundos, Windows informó que el proceso vncserver.ехе no responde e hizo una oferta que simplemente no pude rechazar:

¿Quieres completar este proceso?

¡OH SÍ!

Permítanme admitir que durante el resto del día estuve insoportablemente satisfecho conmigo mismo.

Después de pasar algunas horas digiriendo mi nuevo superpoder, decidí cómo lo usaría. Era demasiado fácil simplemente cerrar la sesión justo delante de él. Tuve una idea mejor: desaparecer por completo.

Después bautismo de fuego con programación de socket Me di cuenta de que podía escribir código que haría dos cosas. Primero ocupará el puerto TCP 5900 recién liberado, anteriormente ocupado por el despistado proceso del servidor VNC. Luego creará una nueva conexión TCP al servidor VNC de la máquina especificada. El código simplemente enviará todos los datos entre los dos sockets y Columbo pensará que se está conectando conmigo, cuando en realidad se conectará a un servidor VNC completamente diferente.

Mi código actuará como un puente secreto entre yo y alguna otra pobre alma de mi elección. Fue maravilloso.

Inmediatamente comencé a escribir mi puente VNC falso. Columbo se conectó conmigo varias veces, pero seguí programando frente a él. Llegué a la conclusión de que no tenía idea de lo que estaba haciendo, aunque escribí cosas obvias como números de puerto y comentarios como // Прощай, жуткий шпион VNC.

Después de un par de días no pude hacer que el código funcionara correctamente. Para empeorar las cosas, estaba trabajando casi continuamente con el icono negro de VNC en la bandeja del sistema. Mientras estuvo conectado, no pude liberar el puerto para probar mi código.

Si lo hubiera sabido entonces netcat!

Al final, mis nervios cedieron; después de todo, yo era un chico impaciente de 17 años. Al ver el ícono blanco del servidor VNC volverse negro nuevamente, me asusté, abrí el código original que llenaba la cola de mensajes y lo ejecuté frente a sus ojos. Incluso esperé un par de segundos antes de hacer clic. End Process, sólo para asegurarse de que lo vio.

Si presionar ese botón no me convenció completamente de que valía la pena, entonces él saltando desde detrás de su fortaleza de monitores para acercarse rápidamente a mí y sacarme de la habitación ciertamente lo hizo.

Como resultado, me prohibieron la entrada a la red durante dos semanas. Un castigo justo, pensé. Después de unas tres semanas, el servidor VNC desapareció de los scripts de arranque y nunca apareció en ningún otro lugar. Nunca supe si mi incidente jugó algún papel en esto o no, pero arruinó por completo mi plan de hacerme fabulosamente rico vendiendo mi arma VNC a estudiantes deprimidos en las salas de informática de las universidades de todo el país.

Fuente: habr.com

Añadir un comentario