Red de Respuestas Legales - Consulta de información - Cómo escribir un enlace global para conectar la API en el sistemaHOOK API es un tema eterno. Sin HOOK, muchas tecnologías serán difíciles de implementar o es posible que no se implementen en absoluto. La API mencionada aquí es API en un sentido amplio, incluidas interrupciones en DOS, API en WINDOWS, servicios de interrupción, filtrado IFS y NDIS, etc. Por ejemplo, el software de traducción instantánea con el que todo el mundo está familiarizado se implementa mediante HOOK TextOut() o ExtTextOut(). Antes de utilizar estas dos funciones para generar texto, el sistema operativo reemplazará el inglés correspondiente con chino para lograr una traducción instantánea. Lo mismo ocurre con el filtrado IFS y NDIS. Antes de leer y escribir discos y enviar y recibir datos, el sistema llamará a la función de devolución de llamada proporcionada por el tercero para determinar si la operación se puede liberar. Es diferente del HOOK normal y está permitido por el sistema operativo. El sistema operativo proporciona una interfaz para instalar funciones de devolución de llamada. Incluso si no hay HOOK, no hay virus, porque los virus en DOS y WINDOWS realizan sus funciones a través del servicio del sistema HOOK: los virus en DOS infectan archivos (virus de archivos) a través de HOOK INT 21 e infectan sectores de arranque a través de HOOK INT 13; Los virus en WINDOWS infectan archivos conectando la API del sistema (incluidas las capas RING0 y RING3) o instalando IFS (el método utilizado por los virus CIH). Por lo tanto, se puede decir que "sin HOOK, hoy no habría un mundo de software colorido". Debido a que están involucradas patentes, derechos de propiedad intelectual o secretos comerciales, Microsoft siempre ha disuadido a las personas de conectarse a la API de su sistema. Proporciona otras interfaces de filtrado como IFS y NDIS, que también están abiertas para satisfacer las necesidades del software antivirus. y cortafuegos. Muchas veces la API HOOK tiene que ser creada por uno mismo. HOOK API tiene el principio de que no puede afectar la función original de la API enganchada de ninguna manera. Así como un médico trata una enfermedad y salva a un paciente, si el virus en el cuerpo del paciente muere y el paciente muere, entonces "tratar la enfermedad y salvar al paciente" no tiene sentido. Si conecta la API, su propósito se logra, pero la función original de la API no es válida, por lo que no se engancha, sino que se reemplaza. Las funciones normales del sistema operativo se verán afectadas o incluso fallarán. La tecnología HOOK API no es complicada de decir, es una tecnología que cambia el flujo del programa. Entre las instrucciones de la CPU, hay varias instrucciones que pueden cambiar el flujo del programa: JMP, CALL, INT, RET, RETF, IRET, etc. En teoría, cualquier código de máquina que cambie la entrada y salida de la API puede engancharse, pero la implementación real es mucho más complicada porque es necesario abordar las siguientes cuestiones: 1. La longitud de la instrucción de la CPU en un sistema de 32 bits. , la longitud de una instrucción JMP/CALL La longitud es de 5 bytes, por lo que debe reemplazar el código de máquina en la API que exceda los 5 bytes (o reemplazar varias instrucciones que sumen 5 bytes), de lo contrario. 2. Problemas de parámetros Para acceder a los parámetros de la API original, debe hacer referencia a los parámetros a través de EBP o ESP, por lo que en este momento debe tener muy claro los valores de EBP/ESP en su código de enlace; 3. Tiempo, algunos ganchos deben estar en la API Al principio, algunos deben estar al final de la API, como HOOK CreateFilaA(). Si la API está enganchada al final de la API, no puede escribir archivos ni acceder a ellos en este momento; enganchar RECV (), si está en la parte superior del enlace API y no ha recibido datos en este momento, puede hacerlo. check RECV() El búfer de recepción, por supuesto, no tiene los datos que desea. Debe esperar la ejecución normal de RECV() y luego verificar el búfer de RECV() para obtener los datos requeridos. 4. Problemas de contexto, algunos códigos de enlace no pueden realizar ciertas operaciones; de lo contrario, el contexto de la API original se destruirá y la API original dejará de ser válida. 5. Problemas de sincronización, intente no usar variables globales en los códigos de enlace, sino locales; variables, que también son módulos La necesidad de optimizar el programa 6. Lo último a tener en cuenta es que la función original de la instrucción de la CPU reemplazada debe simularse en algún lugar del código de enlace. Tomemos send() en ws2_32.dll como ejemplo para explicar cómo conectar esta función: Exportado fn().

Cómo escribir un enlace global para conectar la API en el sistemaHOOK API es un tema eterno. Sin HOOK, muchas tecnologías serán difíciles de implementar o es posible que no se implementen en absoluto. La API mencionada aquí es API en un sentido amplio, incluidas interrupciones en DOS, API en WINDOWS, servicios de interrupción, filtrado IFS y NDIS, etc. Por ejemplo, el software de traducción instantánea con el que todo el mundo está familiarizado se implementa mediante HOOK TextOut() o ExtTextOut(). Antes de utilizar estas dos funciones para generar texto, el sistema operativo reemplazará el inglés correspondiente con chino para lograr una traducción instantánea. Lo mismo ocurre con el filtrado IFS y NDIS. Antes de leer y escribir discos y enviar y recibir datos, el sistema llamará a la función de devolución de llamada proporcionada por el tercero para determinar si la operación se puede liberar. Es diferente del HOOK normal y está permitido por el sistema operativo. El sistema operativo proporciona una interfaz para instalar funciones de devolución de llamada. Incluso si no hay HOOK, no hay virus, porque los virus en DOS y WINDOWS realizan sus funciones a través del servicio del sistema HOOK: los virus en DOS infectan archivos (virus de archivos) a través de HOOK INT 21 e infectan sectores de arranque a través de HOOK INT 13; Los virus en WINDOWS infectan archivos conectando la API del sistema (incluidas las capas RING0 y RING3) o instalando IFS (el método utilizado por los virus CIH). Por lo tanto, se puede decir que "sin HOOK, hoy no habría un mundo de software colorido". Debido a que están involucradas patentes, derechos de propiedad intelectual o secretos comerciales, Microsoft siempre ha disuadido a las personas de conectarse a la API de su sistema. Proporciona otras interfaces de filtrado como IFS y NDIS, que también están abiertas para satisfacer las necesidades del software antivirus. y cortafuegos. Muchas veces la API HOOK tiene que ser creada por uno mismo. HOOK API tiene el principio de que no puede afectar la función original de la API enganchada de ninguna manera. Así como un médico trata una enfermedad y salva a un paciente, si el virus en el cuerpo del paciente muere y el paciente muere, entonces "tratar la enfermedad y salvar al paciente" no tiene sentido. Si conecta la API, su propósito se logra, pero la función original de la API no es válida, por lo que no se engancha, sino que se reemplaza. Las funciones normales del sistema operativo se verán afectadas o incluso fallarán. La tecnología HOOK API no es complicada de decir, es una tecnología que cambia el flujo del programa. Entre las instrucciones de la CPU, hay varias instrucciones que pueden cambiar el flujo del programa: JMP, CALL, INT, RET, RETF, IRET, etc. En teoría, cualquier código de máquina que cambie la entrada y salida de la API puede engancharse, pero la implementación real es mucho más complicada porque es necesario abordar las siguientes cuestiones: 1. La longitud de la instrucción de la CPU en un sistema de 32 bits. , la longitud de una instrucción JMP/CALL La longitud es de 5 bytes, por lo que debe reemplazar el código de máquina en la API que exceda los 5 bytes (o reemplazar varias instrucciones que sumen 5 bytes), de lo contrario. 2. Problemas de parámetros Para acceder a los parámetros de la API original, debe hacer referencia a los parámetros a través de EBP o ESP, por lo que en este momento debe tener muy claro los valores de EBP/ESP en su código de enlace; 3. Tiempo, algunos ganchos deben estar en la API Al principio, algunos deben estar al final de la API, como HOOK CreateFilaA(). Si la API está enganchada al final de la API, no puede escribir archivos ni acceder a ellos en este momento; enganchar RECV (), si está en la parte superior del enlace API y no ha recibido datos en este momento, puede hacerlo. check RECV() El búfer de recepción, por supuesto, no tiene los datos que desea. Debe esperar la ejecución normal de RECV() y luego verificar el búfer de RECV() para obtener los datos requeridos. 4. Problemas de contexto, algunos códigos de enlace no pueden realizar ciertas operaciones; de lo contrario, el contexto de la API original se destruirá y la API original dejará de ser válida. 5. Problemas de sincronización, intente no usar variables globales en los códigos de enlace, sino locales; variables, que también son módulos La necesidad de optimizar el programa 6. Lo último a tener en cuenta es que la función original de la instrucción de la CPU reemplazada debe simularse en algún lugar del código de enlace. Tomemos send() en ws2_32.dll como ejemplo para explicar cómo conectar esta función: Exportado fn().

:send-Ord:0013h Dirección código máquina código ensamblador: 71a 21af 455 pushe BP//Código máquina a montar (Método 1): 71a 21f 58 bec move BP, ESP//Código máquina a montar (Método 2): 71a 2100065438+)dword ptr[ebp-08]:71a 21b 11 50 push eax:71a 21b 12 e 869 f 7 ffff call 71a 21280:71a 21b 6 5438+07 3 BCF dword ptr[ebp+08]:71a 21b 42 57 Empujar edi:71A21B43 57 empujar EDI:71a 21b 44 ff 7514 empujar [ebp+14]:71a 21b 47 8945 F0 mov dw EDI:71a 21B6B 5B pop ebx:71a 21B6C 0f 855 f 940000 jne 71a 2 AFD 1a 21b 72 8b 4508 mov eax, dword ptr[ebp+08]:71a 265448 Este método es ampliamente utilizado por DEBUGER como Sofice. Establece una instrucción INT 3 en el lugar correspondiente a través de BPX como punto de interrupción. Sin embargo, este método no se recomienda porque entrará en conflicto con WINDOWS o las herramientas de depuración, y el código ensamblador básicamente ha sido depurado. 2. Reemplace la segunda instrucción mov ebp, esp (código de máquina 8BEC, 2 bytes) con la instrucción INT F0 ( Código de máquina CDF0), y luego configure una puerta de interrupción en IDT para que apunte a nuestro código. Aquí doy un código de enlace: lea ebp, [esp+12] //Simula la función de la instrucción original mov ebp, esp pushfd //Guarda la escena pushad //Guarda la escena //Haz lo que quieras hacer aquí popad // Escenario de recuperación popfd // Regrese a la siguiente instrucción del anillo 0 de la instrucción original para continuar ejecutando la función original (la dirección es 71A21A7). Este método es bueno, pero la desventaja es que establece una puerta de interrupción en el IDT. 3. Cambie la dirección relativa de la instrucción de llamada (las llamadas están en 71A21B12, 71A21B25 y 71A21B64, pero hay una instrucción de salto condicional antes de las dos primeras llamadas, que puede no ejecutarse. ¿Por qué busca la instrucción de llamada? Debido a que todas son instrucciones de 5 bytes y todas son instrucciones de llamada, siempre que el código de operación 0xE8 permanezca sin cambios, podemos ejecutar nuestro código de enlace cambiando la dirección relativa posterior y luego ejecutarlo en la dirección de destino después de nuestro código de enlace. Suponiendo que nuestro código de enlace está en 71A20400, lo colocamos. La instrucción de llamada en 71A21A64 se cambia para llamar a 71A20400 (la instrucción original es así: llame a 71A21230) y el código de enlace en 71A20400 es así: 71A20400. desea aquí popad JMP 71a 21230/salte a la llamada original La dirección de destino de la instrucción es la siguiente: llame a 71A21230. Este método está muy oculto, pero es difícil encontrar esta instrucción de llamada de 5 bytes. , y el cálculo de la dirección relativa es complicado 4. Reemplace el CMP DWORD PTR [71a 3201C] con la dirección 71A265438 y la instrucción 71A21C93 (código de máquina: 813D 10A3765438+) se convierte en Llamada 71a 20400 nopnoponop. : E8XX XX XX 90 90 90 90 90, 10 bytes). El código de enlace en 71A20400 es: Pushed MOVEDX. 71A3201Ch //Simula el comando original CMP DWORD PTR [71a 3201C], 71a 21C 93 c CMP DWORD PTR [EDX], 71a 2193h //Simula el comando original CMP DWORD PTR [71a 3201C], 765438 Este método es el más encubierto. pero no es así. No todas las API tienen dicha directiva. Los métodos anteriores se utilizan comúnmente. Vale la pena mencionar que muchas personas modifican los primeros cinco bytes de la API, pero muchos software antivirus ahora usan este método para verificar si la API se ha enganchado o si otros virus troyanos han modificado los primeros cinco bytes después de usted. esto se sobrescribirá entre sí y la última operación para conectar la API será válida.