Red de conocimiento informático - Aprendizaje de programación - Libros de programación de ganchos

Libros de programación de ganchos

Lo sentimos, los enlaces de API y los enlaces de mensajes son diferentes. Aunque ambos se denominan ganchos, son esencialmente diferentes, por lo que no existe distinción entre global y local. Los enlaces de mensajes son aplicaciones comunes proporcionadas por Windows a las aplicaciones, y la API "utiliza" las características de Windows para lograr su propósito.

Solo hay dos formas de conectar una API al proceso de destino: usar la estructura del archivo PE, modificar la tabla de importación en cada módulo ejecutable (incluidos exe y dll) del proceso de destino y modificar la dirección de la API de destino. Funciones escritas por uno mismo. Este método es el método más clásico para conectar la API presentado en el Capítulo 22 de Programación principal de Windows.

El método anterior tiene una gran desventaja, es decir, si el proceso de destino ya se está ejecutando antes de que se ejecute su programa y la dirección de la API de destino se obtuvo mediante GetProcAddress, entonces este método es inútil , porque lo más probable es que el proceso de destino no obtenga la dirección API a través de la tabla de importación en el futuro. Hace algún tiempo hice un enlace de socket para IE y usé otro método:

El predecesor de este método es cambiar los primeros cinco bytes de la API de destino a una instrucción de salto jmp y saltar directamente. a su API, luego escribe estos cinco bytes y luego llama a la API de destino con los mismos parámetros. Después de que la API de destino regresa, devuelve esos cinco bytes (un poco como el proceso de interrupción por falla de página). Ahora puedes interceptar todas las llamadas a la API de destino. Sin embargo, la mayor desventaja de este método es que no es eficaz para subprocesos múltiples. Así que introduje otro método: cuando la llamada a la API de destino salta a mi código, no escriba esos cinco bytes, pero en su API, use el ensamblaje para implementar esos cinco bytes. La función original y luego salte directamente al sexto. byte de la API de destino a ejecutar, para que su API nunca se pierda, y siempre que preste atención al guardado y reciclaje de registros y al equilibrio de la pila, este método será muy estable. Por supuesto, este método estará limitado por la versión de API. Los primeros cinco bytes pueden diferir entre versiones, por lo que deben tratarse por separado.

Después de decir tantas tonterías, el punto central es que la forma más fácil de inyectar su propio código en el proceso de destino es usar Dll. Por supuesto, hay formas de hacerlo sin Dll. Por ejemplo, Luo Yunbin mencionó en "Programación en lenguaje ensamblador de 32 bits en el entorno Windows" que escribir en ensamblador es más problemático que Dll.

Los derechos de autor de los comentarios anteriores pertenecen a "From Sincerity to Forever".