Cómo configurar el mouse para que recoja palabras al inicio
El primer método: implementar interceptando algunas llamadas API de GDI, como TextOut, TextOutA, etc.
Segundo: haga una copia de un solo punto de cada contexto de dispositivo (DC) y realice un seguimiento de todas las operaciones de modificación en el contexto (DC).
El segundo método es más potente, pero la compatibilidad no es buena. El primer método se utiliza para interceptar llamadas a la API de Windows. El poder de esta tecnología puede estar mucho más allá de su imaginación. Se dice que utilizando la tecnología de interceptación WindowsAPI, se puede transformar todo el sistema operativo. De hecho, ¡muchos complementos para la plataforma china de Windows se implementan de esta manera! Y esta tecnología es el tema de este artículo.
Específicamente, la interceptación de llamadas a WindowsAPI se puede dividir en dos métodos:
El primer método es reescribir directamente la imagen de WinAPI en la memoria e incrustarla en el código ensamblador, de modo que salta a la dirección especificada para ejecutar cuando llama para interceptar; el segundo método es reescribir la IAT (tabla de direcciones de importación) para redirigir WinAPI a una dirección específica. Tabla), redirigir las llamadas a funciones de WinAPI e implementar la interceptación de WinAPI.
La implementación del primer método es más engorrosa y difícil en Win95 y 98. Esto se debe a que, aunque Microsoft afirma que la API WIN16 se conserva solo por compatibilidad, los programadores deben llamar a tantas API de 32 bits como sea posible. ¡Pero este no es el caso en absoluto! La mayoría de las API de 32 bits dentro de WIN 9X son API de 16 bits modificadas llamadas con el mismo nombre, lo que significa que debemos interceptarlas en el bloque WINAPI. La mayoría de las API de 32 bits dentro de WIN 9X llaman a las API de 16 bits del mismo nombre mediante conversión, es decir, ¡necesitamos incrustar código ensamblador de 16 bits en las funciones interceptadas!
Presentaremos un segundo método de interceptación que es más estable y compatible con Win95, 98 y NT. Debido a que necesitamos utilizar conocimientos de bajo nivel, como administrar la memoria virtual de Windows, romper los límites del proceso, inyectar código en el espacio del proceso de la aplicación, el formato de archivo PE (Portable Executable) y la IAT (Tabla de direcciones de entrada), primero entendemos los aspectos involucrados. una introducción aproximada al conocimiento y finalmente proporcione el código clave para la parte interceptada.
Primero, hablemos de la gestión de la memoria virtual de Windows. Windows9X asigna 4 GB de espacio de direcciones a cada proceso, mientras que para NT este número es de 2 GB. El sistema reserva un espacio de direcciones de entre 2 GB y 4 GB para el acceso al proceso. En Win9X, todos los procesos WIN32 utilizan la parte del espacio de direcciones virtuales entre 2 GB y 4 GB. En Win9X, esta parte del espacio de direcciones virtuales de 2 GB a 4 GB es utilizada por todos los procesos WIN32, y esta parte del espacio de direcciones está cargada con archivos, incluidos WIN32 DLL, archivos asignados en memoria, VXD y administradores de memoria. Código del sistema, esta parte del espacio de direcciones en Win9X es visible para todos los procesos, razón por la cual el sistema operativo Win9X no es lo suficientemente potente.
Win9X reserva de 0 a 4 MB de espacio de direcciones para sistemas operativos de 16 bits, y de 4 MB a 2 GB de espacio de direcciones es el espacio de direcciones privado del proceso Win32. Dado que el espacio de direcciones de cada proceso es relativamente independiente, es decir, si el programa quiere interceptar llamadas API de otros procesos, debe romper el muro límite del proceso e inyectar código que intercepte llamadas API en otros procesos.
Para inyectar código de interceptación de llamadas API en otros procesos, dejamos esta tarea a la función de enlace (SetWindowsHookEx). Con respecto a cómo crear una biblioteca de enlaces dinámicos que contenga enlaces del sistema, la revista "Computer Expert" tiene una introducción especial, así que no iré. en detalles aquí.
Todas las funciones de enlace del sistema deben ubicarse en la biblioteca de enlaces dinámicos, de modo que cuando el proceso llame implícita o explícitamente a una función en la biblioteca de enlaces dinámicos, el sistema asignará la biblioteca de enlaces dinámicos al espacio de direcciones virtuales. del proceso, haciendo así que la biblioteca de enlaces dinámicos se convierta en parte del proceso, ejecutándose como un proceso, usando la pila del proceso, es decir, el código en la biblioteca de enlaces dinámicos está enganchado por la función de enlace. En otras palabras, el código en la biblioteca de enlaces dinámicos se inyecta en el espacio de direcciones de otros procesos GUI (para procesos que no son GUI, la función de enlace no puede hacer nada), mientras que cuando la DLL que contiene el enlace se inyecta en otros procesos , puede obtener la dirección base de cada módulo (EXE y DLL) asignada a la memoria virtual de este proceso, por ejemplo: