Red de conocimiento informático - Computadora portátil - ¿Qué hace la inyección de DLL? La llamada inyección de DLL consiste en colocar una DLL en el espacio de direcciones de un proceso para que se convierta en parte del proceso. Para implementar la inyección de DLL, primero debe abrir el proceso de destino. La inyección de DLL también se denomina tecnología de intrusión en la tecnología de piratas informáticos. Para poder iniciar el sistema o disfrazarse de proceso del sistema, algunos troyanos, complementos robados y virus destructivos insertarán archivos DLL en el sistema y los llamarán encapsulados. funciones, como la interceptación de teclado. Ejemplo detallado del uso de la inyección de DLL y la llamada al mecanismo de gancho HOOK: hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //Permitir la creación remota de subprocesos PROCESS_VM_OPERATION | //Permitir que la máquina virtual remota opere PROCESS_VM_WRITE, //Permitir la máquina virtual remota. escribir FALSO, dwRemoteProcessId) Porque luego necesitamos escribir en la memoria del proceso remoto. Dado que luego necesitamos escribir en el espacio de direcciones de memoria del proceso remoto y crear un subproceso remoto, debemos aplicar permisos suficientes (PROCESS_CREATE_THREAD, VM_OPERATION, VM_WRITE). Si no se puede abrir el proceso, futuras operaciones serán imposibles. Una vez abierto el proceso, puede crear un hilo remoto, pero no se preocupe, primero piense en la función del hilo de este hilo remoto. Nuestro objetivo es inyectar una DLL, que sabemos que se puede cargar en el espacio de direcciones del proceso usando LoadLibrary. Por lo tanto, naturalmente pensamos que si podemos llamar a LoadLibrary en el proceso de destino, ¿no podemos cargar la DLL en el espacio de direcciones del proceso de destino? ¡Así es! Eso es todo. Aquí se utiliza un subproceso remoto. La función del subproceso remoto creado es LoadLibrary y el parámetro es el nombre del archivo DLL que se va a inyectar. (Debe pensarlo usted mismo aquí. Tenga en cuenta que la función de subproceso ThreadProc y la función LoadLibrary son muy similares, con el mismo valor de retorno y la misma cantidad de parámetros). Hay otra pregunta: ¿dónde está la dirección de la función LoadLibrary? Tal vez usted diga, esto es simple, se puede derivar GetProcAddress. Entonces salió el código. char *pszLibFileRemote="my.dll"; PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); ¡Pero no! No olvide que este es un hilo remoto, no en su proceso, y los datos señalados por pszLibFileRemote están en su proceso. Cuando llega al proceso de destino, no sabe a dónde apunta este puntero. la dirección pfnStartAddr también llega al proceso de destino. No estoy seguro de qué es, no estoy seguro de si desea LoadLibraryA. Sin embargo, el problema siempre se puede resolver: Windows tiene algunas funciones API muy poderosas que pueden asignar memoria en el proceso de destino y copiar datos de su proceso al proceso de destino. Por tanto, el problema de pszLibFileRemote se puede solucionar. char *pszLibFileName="my.dll"; //Tenga en cuenta que este debe ser el nombre del archivo de ruta completo, a menos que esté en el directorio del sistema;

¿Qué hace la inyección de DLL? La llamada inyección de DLL consiste en colocar una DLL en el espacio de direcciones de un proceso para que se convierta en parte del proceso. Para implementar la inyección de DLL, primero debe abrir el proceso de destino. La inyección de DLL también se denomina tecnología de intrusión en la tecnología de piratas informáticos. Para poder iniciar el sistema o disfrazarse de proceso del sistema, algunos troyanos, complementos robados y virus destructivos insertarán archivos DLL en el sistema y los llamarán encapsulados. funciones, como la interceptación de teclado. Ejemplo detallado del uso de la inyección de DLL y la llamada al mecanismo de gancho HOOK: hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //Permitir la creación remota de subprocesos PROCESS_VM_OPERATION | //Permitir que la máquina virtual remota opere PROCESS_VM_WRITE, //Permitir la máquina virtual remota. escribir FALSO, dwRemoteProcessId) Porque luego necesitamos escribir en la memoria del proceso remoto. Dado que luego necesitamos escribir en el espacio de direcciones de memoria del proceso remoto y crear un subproceso remoto, debemos aplicar permisos suficientes (PROCESS_CREATE_THREAD, VM_OPERATION, VM_WRITE). Si no se puede abrir el proceso, futuras operaciones serán imposibles. Una vez abierto el proceso, puede crear un hilo remoto, pero no se preocupe, primero piense en la función del hilo de este hilo remoto. Nuestro objetivo es inyectar una DLL, que sabemos que se puede cargar en el espacio de direcciones del proceso usando LoadLibrary. Por lo tanto, naturalmente pensamos que si podemos llamar a LoadLibrary en el proceso de destino, ¿no podemos cargar la DLL en el espacio de direcciones del proceso de destino? ¡Así es! Eso es todo. Aquí se utiliza un subproceso remoto. La función del subproceso remoto creado es LoadLibrary y el parámetro es el nombre del archivo DLL que se va a inyectar. (Debe pensarlo usted mismo aquí. Tenga en cuenta que la función de subproceso ThreadProc y la función LoadLibrary son muy similares, con el mismo valor de retorno y la misma cantidad de parámetros). Hay otra pregunta: ¿dónde está la dirección de la función LoadLibrary? Tal vez usted diga, esto es simple, se puede derivar GetProcAddress. Entonces salió el código. char *pszLibFileRemote="my.dll"; PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); ¡Pero no! No olvide que este es un hilo remoto, no en su proceso, y los datos señalados por pszLibFileRemote están en su proceso. Cuando llega al proceso de destino, no sabe a dónde apunta este puntero. la dirección pfnStartAddr también llega al proceso de destino. No estoy seguro de qué es, no estoy seguro de si desea LoadLibraryA. Sin embargo, el problema siempre se puede resolver: Windows tiene algunas funciones API muy poderosas que pueden asignar memoria en el proceso de destino y copiar datos de su proceso al proceso de destino. Por tanto, el problema de pszLibFileRemote se puede solucionar. char *pszLibFileName="my.dll"; //Tenga en cuenta que este debe ser el nombre del archivo de ruta completo, a menos que esté en el directorio del sistema;

//Calcule el espacio de memoria requerido para el nombre de la ruta de la DLL int cb = (1 lstrlenA(pszLibFileName))* sizeof(char); //Utilice la función VirtualAllocEx para asignar el búfer del nombre del archivo DLL pszLibFileRemote = (char *) VirtualAllocEx(hRemoteProcess , NULL, cb, MEM_COMMIT, PAGE_READWRITE); // Utilice la función WriteProcessMemory para copiar el nombre de la ruta de la DLL al espacio de memoria del proceso remoto iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL); Bien, ahora el proceso de destino también puede reconocer pszLibFileRemote, pero ¿cómo parece que pfnStartAddr sabe la dirección de LoadLibraryA en el proceso de destino? De hecho, Windows nos ha solucionado este problema. La función LoadLibraryA está ubicada en la DLL principal Kernel32.dll, y esta DLL es muy especial. Windows la cargará en la misma dirección sin importar qué proceso sea. Por lo tanto, la dirección de LoadLibraryA en su proceso es la misma que la dirección de LoadLibraryA en el proceso de destino (de hecho, todas las funciones en esta DLL son iguales). En este punto, finaliza la inyección de DLL.