¡Cómo conectar una función API en C#!
La API mencionada aquí es una API en un sentido amplio, incluidas interrupciones en DOS, API en WINDOWS, servicios de interrupción, IFS y.
Filtrado NDIS, etc. Por ejemplo, el software de traducción instantánea con el que todo el mundo está familiarizado se basa en HOOK TextOut() o ExtTextOut().
Función, antes de que el sistema operativo utilice estas dos funciones para generar texto, reemplaza el inglés correspondiente con chino.
Traducción temporal; lo mismo ocurre con el filtrado IFS y NDIS. Antes de leer y escribir discos y enviar y recibir datos, el sistema llama a un tercero.
La función de devolución de llamada se utiliza para determinar si la operación se puede liberar. Esto es diferente de los ganchos ordinarios. Está permitido por el sistema operativo y está determinado por el sistema operativo.
Proporciona una interfaz para instalar funciones de devolución de llamada.
Incluso si no hay gancho, no hay virus, porque ya sea un virus en DOS o un virus en WINDOWS,
todos realizan sus funciones a través del servicio del sistema HOOK: los virus en DOS usan HOOK INT 21 infecta archivos (virus de archivos) y HOOK INT 13 infecta sectores de arranque (los virus de arranque en WINDOWS se infectan conectando las API del sistema (incluidas las capas RING0 y RING3) o instalando IFS (método utilizado por); Virus CIH). Por lo tanto, se puede decir que "sin HOOK, hoy no habría un mundo de software colorido".
Dado que se trata de patentes y derechos de propiedad intelectual, o secretos comerciales, Microsoft no ha abogado por vincular la API de su sistema.
Para satisfacer las necesidades de software antivirus y cortafuegos, también se abren otras interfaces de filtrado, como IFS y NDIS. Entonces
Muchas veces la API HOOK la tiene que hacer 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
los médicos salvan vidas. Si el virus en el cuerpo del paciente muere y el paciente muere, entonces este "salvar vidas" 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 es un enlace, sino un reemplazo. Las funciones normales del sistema operativo se verán afectadas o. incluso chocar.
La tecnología HOOK API no es complicada de decir, es una tecnología que cambia el flujo del programa. Hay varias instrucciones en la CPU.
Las instrucciones pueden cambiar el proceso del programa: JMP, CALL, INT, RET, RETF, IRET y otras instrucciones. En teoría, basta con cambiar la API
Cualquier código de máquina de entrada y salida se puede enganchar, pero la implementación real es mucho más complicada porque es necesario abordar los siguientes problemas:
1 Problema de longitud de las instrucciones de la CPU En sistemas de 32 bits, la longitud de una instrucción JMP/CALL es de 5 bytes, por lo que es necesario reemplazar la API.
Código de máquina con una longitud superior a 5 bytes (o sustituyendo varias instrucciones con una longitud total de 5 bytes), en caso contrario la corrección se verá afectada.
Las instrucciones detrás del código de máquina se modifican a menos de 5 bytes y el flujo del programa puede incluso verse interrumpido, lo que provoca consecuencias impredecibles.
2. el original Para los parámetros API, 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. , algunos ganchos deben estar en la API Al principio, algunos deben estar al final de la API, como HOOK CreateFilaA().
Si la API está enlazada al final de la API, no puede escribir archivos ni siquiera acceder a ellos en este momento; enlace RECV(),
Si está en el encabezado de la API. gancho, en este momento, los datos no se han recibido. Puede verificar el búfer de recepción de RECV (), pero definitivamente no hay datos en él.
Para obtener los datos que desea, debe esperar a que RECV() se ejecute normalmente y conectarse al final de RECV(), luego verificar el búfer de RECV().
Solo existen los datos deseados;
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 se convertirá en no válido;
p>
5. Problemas de sincronización. Intente no utilizar variables globales en el código de enlace, pero utilice variables locales. Esta es también la necesidad de programas modulares. 6. Lo último a tener en cuenta es que cuando se reemplaza La función original de la instrucción de la CPU debe simularse en algún lugar del código de enlace.
Tome send() en ws2_32.dll como ejemplo para explicar cómo conectar esta función:
Salga de fn(): Enviar - Orden: 0013h
Dirección código máquina código ensamblador
: 71a 21af 455 push ebp//Código máquina a enganchar (Método 1)
: 71A21F58BEC MOVEBP, ESP//Código máquina a enganchar (Método 1) 2).
: 71a 21af 7 83ec 10 sub esp, 00000010
: 71A21AFA 56 push esi
: 71A21AFB 57 push edi
: 71A21AFC 33FF
:71a 21b 08 0f 84853d 0000 je 71a 25893
:71a 21B0E 8d 45 F8 lea eax, dword ptr [ebp-08]
:71a 21b 11 50 push eax
: 71a 21b 12 e 869 f 7 ffff teléfono 71A21280
: 71a 21b 17 3bc 7 CMP eax, edi
: 71a 21b 19 8945 fc mov dword ptr [ebp-04], eax
: 71a 21b 1C 0f 85c 4940000 jne 71a 2 AFE 6
: 71A21B22 FF7508 push [ebp 08]
: 71A21B25 E826F7FFFF teléfono 71A21250
: 71A21B2A 8BF0 mov esi, eax
: 71A21B2C 3BF7 cmp esi, edi
: 71a 21B2E 0f 84 ab 940000 je 71a 2 afdf
: 71a 21b 34 8b 4510 mov eax, dword ptr [ebp 10]
: 71A21B37 53 push ebx
: 71a 21b 38 8d 4 DFC lea ecx, dword ptr [ebp-04]
: 71A21B3B 51 push ecx
: 71A21B3C FF75F8 push [ebp-08]
: 71a 21B3F 8d 4d 08 lea ecx, dword ptr [ebp 08]
: 71A21B42 57 push edi
: 71A21B43 57 push edi
: 71a 21b 44 ff 7514 push [ebp 14]
: 71a 21b 47 8945 f 0 mov dword ptr [ebp-10], eax
: 71a 21B4A 8b 450 c mov eax, dword ptr [ebp 0C]
: 71A21B4D 51 push ecx
: 71A21B4E 6A01 push 00000001
: 71a 21b 50 8d 4 df 0 lea ecx, dword ptr [ebp-10]
: 71A21B53 51 push ecx
: 71A21B54 FF7508 push [ebp 08]
: 71a 21b 57 8945 F4 mov dword ptr [ebp-0C], eax
:71a 21B5A 8b 460 c mov eax, dword ptr [esi 0C]
:71a 21B5D ff 5064 call[eax 64]
:71A21B60 8BCE mov ecx , esi
: 71A21B62 8BD8 mov ebx, eax
: 71a 21b 64 E8 c 7 6 fff call 71a 21230//Código de máquina a enganchar (Método 3)
:71A21B69 3BDF cmp ebx,edi
:71A2
1B6B 5B pop ebx
:71a 21B6C 0f 855 f 940000 jne 71a 2 AFD 1
:71a 21b 72 8b 4508 mov eax, dword ptr [ebp 08]
: 71A21B75 5F pop edi
: 71A21B76 5E pop esi
: 71A21B77 C9 dejar
: 71a 21b 78 c 21000 ret 0010
Las siguientes son cuatro formas de conectar la API:
1. Reemplace la primera instrucción en la entrada de la API con INT 3 (código de máquina 0xcc) con la instrucción push EBP (código de máquina 0x55).
Luego utilice la función de depuración proporcionada por WINDOWS para ejecutar su propio código, que es ampliamente utilizado por DEBUGER como Ruanbing.
Consiste en fijar una instrucción INT 3 en el lugar correspondiente a través de BPX para romper el punto. 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 está básicamente depurado;
2. Cambie las segundas instrucciones mov ebp, esp ( El código de máquina 8BEC, 2 bytes) se reemplaza con la instrucción INT F0 (código de máquina CDF0).
Luego configura 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 //Guardar sitio
Pushad //Guardar escena
//Haz lo que quieras aquí.
Popad //Restaurar la escena
Popfd //Restaurar la escena
Iretd //Volver a la siguiente instrucción de la instrucción original para continuar ejecutando la original función (la dirección es 71A21AF7).
Este método es bueno, pero la desventaja es que se configura una puerta de interrupción en el IDT, es decir, ingresando a RING0.
3. Cambie la dirección relativa de la instrucción de llamada (las llamadas son 71A21B12, 71A21B25, 71A21B64, pero hay una condición antes de las dos primeras llamadas.
Es posible que la instrucción de salto no ejecutarse, por lo que necesitamos la instrucción CALL en HOOK 71A21B64). ¿Por qué buscas instrucciones 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, puede transferir cambiando la dirección relativa posterior.
Vaya a nuestro código de enlace para su ejecución y luego vaya a la dirección de destino después de nuestro código de enlace para su ejecución.
Supongamos que nuestro código de enlace está en 71A20400, luego cambiamos la instrucción de llamada de 71A21B64 a llamar a 71A20400 (la instrucción original es así: llamar a 71A21230).
El código de enlace en 71A20400 es así:
71A20400:
Pushad
//Haz lo que quieras aquí Hecho.
Popod
Jmp 71A21230 // Salte a la dirección de destino de la instrucción de llamada original, de la siguiente manera: llame a 71A21230.
Este método está muy oculto, pero es difícil encontrar esta instrucción de llamada de 5 bytes y calcular la dirección relativa también es muy complicado.
4. Reemplace las instrucciones CMP DWORD PTR [71a 3201C] y 71A21C93 en la dirección 71A265438 (código de máquina: 813D 10A3765438).
Llame al 71A20400
no se proporciona lo contrario a menos que se indique lo contrario
no se proporciona lo contrario a menos que se indique lo contrario
no se proporciona lo contrario a menos que se indique lo contrario Requisitos
no se proporciona lo contrario, a menos que se indique lo contrario
no se proporciona lo contrario, a menos que se indique lo contrario
(Código de máquina: E8XX XX XX 90 90 90 90 90 Sección de 10 palabras) p>
El código de enlace en 71A20400 es:
Pushad
Mov edx, 71A3201Ch // Simula la instrucción original CMP DWORD PTR[71a 3201c 93], 71A21C93.
Cmpword ptr [EDX], 71a21c93h//Simula la instrucción original cmpd word ptr[71a 3201c], 71a 21c 93.
pushfd
//Haz lo que quieras aquí.
popfd
Popfd
Remojar en agua para suavizar
Este método es el mejor para ocultar, pero no todos los API existen. dichas instrucciones y debe utilizarlas de acuerdo con la situación específica.
Los métodos anteriores se utilizan comúnmente. Vale la pena mencionar que muchas personas cambian los primeros cinco bytes de la API, pero muchos programas antivirus ahora utilizan este método.
Compruebe si la API ha sido modificada por HOOK u otros virus troyanos después de usted. Esto se cubrirá entre sí y el funcionamiento de la última API de HOOK es válido.