Red de conocimiento informático - Aprendizaje de código fuente - Tutorial de API HOOK en lenguaje sencillo Descripción detallada

Tutorial de API HOOK en lenguaje sencillo Descripción detallada

# incluir bInheritHandle, DWORD dwProcessId) { typedef HANDLE (WINAPI *PFNTERMINATEPROCESS)(DWORD, BOOL,DWORD); if(dwProcessId!= dwCurrentProcessId) { return ((PFNTERMINATEPROCESS)(PROC)g_OpenProcess)(dwDesiredAccess,bInheritHandle,dwProcessId } return 0 } // enganchar la función OpenProcess CFNTERMINATEPROCESS(PROC)g_OpenProcess)(dwDesiredAccess,bInheritHandle,dwProcessId).//Enganchar la función OpenProcess CAPIHook g_OpenProcess("kernel32.dll", "OpenProcess",(PROC)Hook_OpenProcess);/// /static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase } else { return NULL } } static LRESULT; .} LRESULT estático WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::.CallNextHookEx(g_hHook, code, wParam, lParam }BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId) { BOOL bOk; ; si (bInstall) { g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), 0k = (g_hHook! = NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; API implementa HOOK OpenProcess() para evitar que el proceso se elimine 2007-07-04 14:41 En el sistema operativo WINDOWS .

Cuando no podemos finalizar o no sabemos cómo finalizar un programa, o somos demasiado vagos para encontrar el botón "Salir", generalmente presionamos "CTRL+ALT+SUPR" para abrir el administrador de tareas, buscar el programa para finalice y haga clic! “Finalizar misión” y listo, jaja, es un poco grosero, pero funciona en la mayoría de los casos, ¿no? Imagínese, si existe un software de este tipo que impone ciertas restricciones al trabajo que los usuarios pueden realizar en la computadora y las actividades del usuario no se pueden liberar fácilmente "finalizando la tarea", ¿qué debemos hacer? Sólo hay tres métodos: 1. Bloquear la combinación de teclas de acceso rápido "CTRL+ALT+SUPR"; 2. Hacer que el programa no aparezca en la lista del administrador de tareas; 3. Hacer que el administrador de tareas no pueda finalizar la tarea; Para el primer método, esto es demasiado cruel. Si está acostumbrado al método de "finalizar tarea", se sentirá muy incómodo con el segundo método, puede usar fácilmente el método de registrar el proceso de servicio en WINDOWS 9X, pero existe. ¡No existe tal método para sistemas operativos basados ​​en la arquitectura WINDOWS NT! El segundo método se puede implementar fácilmente en WINDOWS 9X registrando un proceso de servicio, pero no existe tal método para el sistema operativo de arquitectura WINDOWS NT. Es muy difícil ocultar un proceso. Aunque se puede ocultar, el mecanismo de implementación es más complicado. En cuanto al tercer método, es más fácil de implementar: IPGate URL Filter utiliza este método antivirus. La "Tarea final" del Administrador de tareas en realidad finaliza el proceso a la fuerza. La aplicación asesina utilizada es una función API de Win32 llamada TerminateProcess(). Echemos un vistazo a su definición: BOOL TerminateProcess(HANDLE); terminado hProcess; // El identificador del proceso que finalizará UINT uExitCode; // El código de salida del proceso especificado. Al ver esto, no es necesario mirar hacia abajo para saber qué hacer a continuación: conecte TerminateProcess(). ) Función, cada vez que se llama a TerminateProcess (), es necesario determinar si el proceso que intenta finalizar es mi proceso. Podemos ver que el final del proceso lo determina primero el proceso. Cada vez que se llama a TerminateProcess(), primero determina si el proceso que intenta terminar es mi proceso y, si lo es, simplemente devuelve un código de error y listo. ¿Es realmente así de simple? Comencemos con la pregunta, ¿cómo puedo determinar si hProcess es un identificador de mi proceso? La respuesta es: obtener el identificador de mi proceso en mi proceso, luego pasarlo a la función de enlace a través del mecanismo de comunicación entre procesos y compararlo con hProcess, ¿verdad? ¡Equivocado! Debido a que el identificador es un valor que depende del proceso, no tiene sentido comparar el valor del identificador de mi proceso entre diferentes procesos. ¿Qué hacer? Veamos cómo lo consigue mi hProcess. Un proceso es único solo por su ID de proceso. El sistema operativo identifica un proceso a través de la ID del proceso. Cuando un programa quiere acceder al proceso, primero debe usar la función OpenProcess y pasar la ID del proceso para acceder al proceso y obtener el identificador. del proceso para ver sus parámetros: HANDLE OpenProcess (DWORD dwDesiredAccess, // acceso deseado BOOL bInheritHandle, // indique si desea que se herede el identificador obtenido DWORD dwProcessId // ID del proceso al que acceder aparece gradualmente: después de llamar); TerminateProcess() Antes, primero se debe llamar a OpenProcess(), y el dwProcessId en la lista de parámetros de OpenProcess() está determinado de forma única por todo el sistema.

Conclusión: la función a enganchar no es TerminateProcess (), sino OpenProcess (), cada vez que se llama a OpenProcess (), primero debemos verificar si dwProcessId es el ID de mi proceso (usando el mecanismo de comunicación entre procesos). , El código de error se devuelve directamente. El Administrador de tareas no puede controlar mi proceso, entonces, ¿cómo finaliza mi proceso? En este punto, se revela el misterio. Desde Hook TerminateProcess () hasta Hook OpenProcess (), este proceso incorpora el concepto de pensamiento inverso. De hecho, me metí en el callejón sin salida de TerminateProcess() y no pude salir durante mucho tiempo, pero finalmente tuve una chispa de inspiración y centré mi atención en OpenProcess(), dándome cuenta de la anti-muerte del proceso. Es un placer para mí compartir esta experiencia con todos ustedes.

Referencia: /wlw7758/blog/item/9d109322816032f1d7cae2d7.html Todos los derechos reservados. !!!!!!