ScreenLogger - sonríe, una cámara oculta te filma

Entonces bienvenido. En este artículo, analizaremos el proceso de escribir un programa que permita el monitoreo en tiempo real de todas las acciones que ocurren en una computadora remota, sin el conocimiento del usuario final. El autor del artículo advierte que no es responsable del uso ilegal de las siguientes tecnologías y no recomienda su uso con fines ilegales. Vamos!

Al escribir cualquier producto de software lo suficientemente grande, debe dividir la tarea global en varias más simples. Entonces, en este caso, he identificado varios procesos prácticamente no relacionados que, trabajando juntos, nos permiten lograr el resultado deseado. En particular, para implementar la tarea se requiere implementar:

0) Agregar archivos de servicio en la primera ejecución a las carpetas del sistema
1) Tome una captura de pantalla de la pantalla
2) Enviar una captura de pantalla a un servidor remoto

En consecuencia, se seleccionó la plataforma .NET para su implementación, que tiene toda la funcionalidad necesaria. La aplicación está escrita en WindowsForms con el propósito de visualización y depuración, en general podría ser una consola.

Descripción de funciones:

SetConfig: proporciona parámetros de configuración de lectura del archivo de configuración adjunto
Enviar: responsable de enviar una captura de pantalla al correo electrónico
MakeScreen: responsable de tomar una captura de pantalla
Círculo: es responsable de repetir la toma y enviar una captura de pantalla en segundo plano a una frecuencia especificada
CasualStart: define acciones en el próximo lanzamiento del programa
FirstStart: garantiza la correcta instalación del programa

Ahora, un poco más de detalle sobre cada una de las funciones. Configuración de configuración:

Como el software debe ser flexible, debería ser posible cambiar los parámetros internos del programa desde fuera de su código. En cada inicio, este software intenta encontrar el archivo SaveScreen.ini, actualizar su configuración y solo entonces comenzar a funcionar en modo normal. En el caso de que sea imposible actualizar los parámetros, se utilizan los valores predeterminados.

(qué parámetro es responsable de lo que estará al final del artículo)

Por razones técnicas, en lugar de un espacio, tuve que usar el guión bajo y en lugar de @ - #, pero dentro del programa se realiza el reemplazo inverso.

La ejecución del programa comienza en el bloque Form1_load y puede desarrollarse en dos modos: inicio normal (si la computadora tiene un directorio de instalación) e instalación (si no hay un directorio de instalación). Consideremos cada uno de ellos.

Primera ejecución:
En el primer inicio, debe crear un directorio en el que se colocarán los archivos del programa, transferir el archivo ejecutable y el archivo de configuración allí, así como agregar las entradas necesarias al registro para agregar software para la ejecución automática.

En consecuencia, esto es implementado por la función FirstStart ()

imagen

Después de la instalación, la aplicación se cierra; la próxima vez que reinicie la computadora, funcionará como siempre.

Lanzamiento regular:
Un lanzamiento regular inicia un subproceso en segundo plano que toma capturas de pantalla y las envía, además de borrar la carpeta con capturas de pantalla tomadas durante la última sesión. Después de lo cual, espera un período considerable de tiempo antes de la terminación forzada de la aplicación. Antes de comenzar el subproceso en segundo plano, es posible una pausa, que debe establecerse en computadoras relativamente lentas para acelerar la carga del sistema y la ausencia de conflictos en el inicio.
asualStart ()

imagen

Circulación:
Todo es prosaico para deshonrar: en el ciclo eterno que tomamos y enviamos capturas de pantalla, luego de lo cual esperamos el tiempo especificado. Un orden de magnitud más interesante es el proceso de tomar y enviar una pantalla.

imagen

Toma una captura de pantalla:
En C #, es posible guardar una imagen en un mapa de bits utilizando la función de copia desde la pantalla. Por lo tanto, todo lo que debe hacerse es crear un objeto para almacenar una captura de pantalla con una resolución igual a la resolución de pantalla actual, adjuntarle un objeto que pueda recibir un mapa de bits de la pantalla y guardarlo en un directorio creado previamente.

imagen

Enviando por correo:
En C #, es posible trabajar con el correo utilizando clases predefinidas que le permiten completar los campos del mensaje, especificar el destinatario y el destinatario y, de hecho, enviar llamando a un método. Envuelva este método en un bloque try-catch en caso de que no haya conexión de red; incluso en este caso, el programa no dará un mensaje de error, sino que esperará obedientemente hasta que tenga la oportunidad de acceder al servidor. El servidor de correo se eligió por razones de simplicidad, en principio: puede lanzar imágenes en cualquier lugar.

imagen

Interacción general:
El lanzamiento del programa, repito, se lleva a cabo en el método Form1_Load. El programa intenta actualizar la configuración, luego determina si se inició por primera vez, si es así, se agrega a la carpeta correcta y al inicio y se deshabilita, y si no, inicia un proceso en segundo plano que arroja de manera estable la imagen de la pantalla al servidor de correo en un intervalo determinado. Nada complicado o inusual, solo la interacción de varias clases integradas.
imagen

Y, finalmente, una explicación del archivo de autoconfiguración: todos los nombres de variables coinciden con los nombres en el programa, por lo tanto, al explicar los campos en el archivo int, también describo las variables mismas.

imagen

wayToDir: el nombre de la subcarpeta en la que se sueltan las capturas de pantalla
finalDir = -name del directorio al que se transfiere el programa
nameOfApp = nombre del archivo ejecutable
subKeyAdress = ruta a la entrada del registro para agregar a la ejecución automática
reservado - campo reservado
nombre: nombre de la entrada del registro
startPause: pausa antes de grabar capturas de pantalla
exitPause - pausa antes de la salida forzada del programa
adressFrom - dirección del remitente
nameFrom - firma del remitente
nameTo: dirección de correo del destinatario
mailSubject - Asunto del correo electrónico
mailBody - mensaje de texto
smtpAdress: dirección SMTP del servidor de correo del remitente
smtpPort - puerto para enviar correo
mailPassword: contraseña del correo del remitente
exp - extensión de archivo
timeBetweenScreens: el tiempo entre tomar dos capturas de pantalla.

En resumen:

El proceso de escribir una aplicación para el seguimiento de acciones en una computadora remota se acaba de describir. Al conectar aquí, recibir un archivo con una lista de comandos del servidor y dividirlo, obtenemos un TeamViewer auto-escrito simplificado. Pero esto no está en este artículo.

Código fuente

Source: https://habr.com/ru/post/457172/


All Articles