Palabras clave de ejemplo de un programa de enlace completo: enlace, bloqueo, servicio
Esta es la pregunta de prueba para "Analista senior de programas de Windows" de xx empresa que recibí cuando estaba solicitando un trabajo. Los requisitos específicos (es decir, la descripción de mi programa) son:
1. El programa cliente se denomina Cliente. Supervise el funcionamiento del sistema. Si encuentra que hay un proceso de "bloc de notas" (notepad.exe) o un proceso de "calculadora" (calc.exe) en el sistema, finalice el proceso inmediatamente y escriba el evento en la base de datos; periódicamente Verifique la base de datos cada 1 minuto y cargue los registros de eventos que aún no se hayan cargado en el servidor.
1. El entorno operativo de destino es el sistema operativo Windows 2000.
2. Diseñe el programa para servir al sistema.
3. El programa debe tener capacidades antiataques, incluidas funciones como anti-borrado y resistencia a la terminación forzada de procesos.
(1) Mantener el programa ejecutándose continuamente y evitar que otros programas interrumpan por la fuerza la ejecución del programa actual;
(2) Proteger la base de datos de eventos y el archivo de ejecución principal para que no se eliminen;
(3) Si se encuentra una anomalía (el proceso finaliza, el archivo se elimina, etc.), fuerce inmediatamente la recarga/ejecución del programa;
(4) Si se detecta una anomalía tres veces seguidas, el proceso del demonio obligará al sistema operativo a reiniciarse después de reiniciar el sistema, para garantizar que el programa se cargue y se ejecute normalmente;
(A) Para realizar las funciones anteriores, el programa no se limita al formato EXE, y uno mismo puede decidir la forma de implementación según las necesidades.
(B) Todas las funciones anteriores se implementan en el entorno operativo normal de Windows 2000 y bajo permisos de administrador. No es necesario considerar el modo de seguridad o los permisos de Windows ni otras cuestiones.
4. Utilice bases de datos de escritorio simples, como Access, xBase y otras bases de datos de archivos.
5. Cada evento generado contiene al menos dos datos: la hora en que ocurrió el evento y el objeto de procesamiento del evento.
Los datos del evento se almacenan en la base de datos en la tabla tEvent. La tabla tEvent contiene al menos dos campos:
(1) Campo EventTime: tipo de hora/fecha. Registre la hora en que ocurrió el evento.
(2) Campo EventTarget: tipo de carácter. Registra los objetos asesinados en el evento. Los objetos a considerar son el proceso del Bloc de notas y el proceso de la Calculadora.
Si necesita otras tablas o campos, puede agregarlos según sea necesario.
6. Se personaliza el formato de transmisión de datos de la red. Decida el contenido específico y el formato de transmisión de acuerdo con sus necesidades, no existen requisitos específicos. La red del cliente debe funcionar en conjunto con la red del servidor.
7. No hay límite en el lenguaje de desarrollo ni en el entorno de desarrollo integrado utilizado, puede elegirlo usted mismo.
8. Para el método de conexión de la base de datos, elija según sus necesidades.
2. El programa del lado del servidor se denomina Servidor. Supervise la red y, una vez que un cliente carga datos, la información del evento se extrae inmediatamente y se muestra en una lista en la interfaz de usuario.
1. El entorno operativo de destino es el sistema operativo Windows 2000.
2. El programa debe diseñarse como una aplicación GUI normal de Windows 2000. La interfaz de usuario debe contener al menos una lista de información de eventos, que contiene al menos tres datos: hora de ocurrencia del evento, objeto de procesamiento de eventos y origen del evento.
(1) Hora de ocurrencia del evento: la misma que la hora de ocurrencia del evento del cliente.
(2) Objeto de procesamiento de eventos: igual que el objeto de procesamiento de eventos del cliente.
(3) Fuente del evento: dirección IP de la máquina cliente que cargó el evento actual.
3. El formato de transmisión de datos de la red se personaliza;
4. No hay límite en el lenguaje de desarrollo ni en el entorno de desarrollo integrado utilizado, puede elegirlo usted mismo.
Instrucciones para ejecutar el programa:
client.ini debe colocarse en el directorio raíz de la unidad C. Se pueden colocar otros archivos en cualquier lugar, pero survival.exe y client.exe deben colocarse en la misma carpeta. Antes de iniciar survival.exe, configure la IP del servidor (interval_server). ) en client.ini ) y luego inicie ADServer.exe.
Descripción del código fuente 1. Servidor ADServer.exe
Debido a que el lado del servidor es simple, hablemos primero del lado del servidor :)
El trabajo del servidor es recibir datos de la red y utilizar TServerSocket para bloquear la transmisión. Cada vez que TServerSocket recibe una solicitud de conexión de un cliente, genera un hilo TServerClientThread. Debe crear un nuevo TWinSocketStream en este hilo para leer y escribir datos del cliente. El código principal está escrito en la parte ClientExecute de este hilo.
No hay ningún problema con que TWinSocketStream escriba datos en el cliente, pero la lectura de datos del cliente (usando el método de lectura) a menudo regresa antes de terminar de leer, incluso si usa WaitForData. Entonces escribí una función waitDateComplete para esperar a que se lean los datos.
2. Cliente El cliente es un poco más problemático. Client.exe es un servicio y survival.exe es una aplicación. Los dos se monitorean entre sí. Si uno se apaga, el otro lo reiniciará. hookDll.dll se utiliza para los enlaces. Los enlaces globales deben escribirse en módulos dll independientes (a excepción de algunos enlaces, consulte este artículo: http://www.pconline.com.cn/pcedu/empolder/gj/vc/ 0403/340480.html).
Client.exe no tiene algunas líneas de código. Utiliza principalmente CreateProcess para iniciar el proceso. Tenga en cuenta que si el servicio quiere hacer cosas relacionadas con el shell de Windows, como los enlaces utilizados en hookdll.dll iniciado por este programa, ServiceType debe establecerse en stWin32 y la propiedad TService::Interactive debe establecerse en verdadero.
survival.exe se utiliza para iniciar el servicio, cargar hookdll.dll e informar eventos al servidor.
1. Iniciar el servicio requiere tres procesos. Primero, abra el controlador de servicio, que es el backend del "servicio" en la herramienta de administración. Use OpenSCManager para obtener el identificador del administrador de servicios y luego use OpenService (identificador del administrador de servicios, nombre del servicio). , SERVICE_START | SERVICE_QUERY_STATUS) para obtener el identificador del servicio especificado y, finalmente, puede usar StartService(...) para abrir el servicio. Tenga en cuenta que se deben obtener al menos los dos permisos, SERVICE_START y SERVICE_QUERY_STATUS.
2. En términos de carga de hookdll.dll, este programa utiliza enlaces implícitos, es decir, utiliza proyectoAgregar al proyecto de BCB para importar el archivo lib del dll. Después de la importación, si la función del dll no se llama en el código, el dll no se cargará. Este programa llama a la función beginTrace (host HWND) para pasar el identificador de ventana de survival.exe, y el dll envía algunos mensajes a survival.exe a través de este identificador.
3. En términos de informar eventos al servidor, se escribió especialmente una clase TMSocketClient, que es la principal responsable del proceso de envío de mensajes -> recibir recibos de mensajes. El código principal está en TMSocketClient::Command (….). El código en ADServer.exe es muy simple de leer. Al #definir diferentes constantes de comando, este módulo puede completar muchos tipos de tareas de transmisión. De hecho, este módulo es una clase que escribí en el pasado para simular TNMFTP. Se simplificó eliminando muchos #defines y se usó para transferir archivos en una LAN virtual (TNMFTP no puede funcionar en una LAN virtual).
3. ganchoDll.dll
El código es muy simple, solo preste atención a una cosa, es decir, si N procesos llaman al mismo dll, este dll se copiará N veces. En términos generales, cada copia diferente de estos N dll tiene sus propios segmentos de datos. Es decir, el valor de su misma variable en cada copia es diferente y no interfiere entre sí. Pero, de hecho, Windows ha dejado un mecanismo que nos permite declarar dicha variable en una dll y mantener los datos consistentes entre N instancias de la dll, como si fuera un puntero que trasciende el espacio del proceso. Para declarar dicha variable, primero cree un archivo .def con el mismo nombre que la dll y escriba en el archivo:
SECCIONES
SHSEG LEER ESCRIBIR COMPARTIR
Luego, declare las variables dll que desea compartir entre procesos como variables globales e inicialice estas variables. Tenga en cuenta que la diferencia entre compartir y no compartir es si está inicializado.
Este programa se refiere a "Aplicación de ganchos: monitoreo de ejecución de programas" en CCRun. Gracias al autor Victor Chen.
Bien, parece que eso es básicamente todo lo que hay que explicar. Además, hay algunas variables inútiles en el programa. No tengo tiempo para limpiarlas. Por favor, perdóname :) ¡Gracias por mirar!
Expandir