¿Qué sucede cuando se llama a sysenter en modo kernel?
llamada sysenter
Tome CreateFile como ejemplo, porque es común y corresponde a la función NtCreateFile en nt.
Para la llamada a CreateFile en el escuadrón del programa, el compilador lo compilará en el siguiente código ensamblador:
Los parámetros se insertarán en la pila primero y luego la función ser llamado:
01031017 call dword ptr[__imp__CreateFileW@28 (1032000h)]
El valor en 1032000 anterior es 0x7664cc56, lo que significa saltar a este valor. Esta es la forma estándar de aplicar funciones de otros módulos. (Salte a la tabla de importación)
Mire el siguiente código, en el módulo kernel32,
_CreateFileWImplementation@28:
7664CC56 mov edi,edi p>
. . .
7664CC98 push dword ptr [ebp+8]
7664CC9B call _CreateFileW@28(7664CCA9h)
. . .
La función se llama nuevamente, el método de llamada aún debe estar en kernel32
_CreateFileW@28:
7664CCA9 jmp dword ptr[__imp__CreateFileW@28 (766019E0h) ]
Parece que el método de procesamiento es el mismo que en exe. Al saltar a funciones en otros módulos, se utilizará la dirección de función correspondiente en la tabla de importación.
Efectivamente, está en KernelBase.dll (descubrí que VS2010 se iniciará desde la ubicación cada vez que carga el dll. Esto es por razones de seguridad, pero es muy molesto al depurar)
_CreateFileW@28:
75B9A850 mov edi,edi
. . .
Prepare los parámetros y envíelos a la pila (44 bytes de parámetros),
75B9AA1B lea eax,[ebp-8]
75B9AA1E push eax p>
p>
75B9AA1F llamada esi
75B9AA21 mov ebx,eax
75B9AA23 mov edi,0C0000022h
. . .
Después de la llamada, llega a _NtCreateFile@44 en ntdll (esta función se introduce en msdn y el nombre del archivo procesado se incluye en el parámetro). Esta función debe ser generada por software, porque muchas de estas funciones solo tienen diferentes números de llamada y el número de bytes que aparecen tiene un nombre llamado función stub.
_NtCreateFile@44:
778455C8 mov eax,42h
778455CD mov edx,7FFE0300h
778455D2 llamada dword ptr [edx]
778455D4 ret 2Ch
¡Las 42h anteriores no están en win7! El número de llamada del sistema de NtCreateFile (a diferencia de win2003, Microsoft es realmente repugnante). 7FFE0300h es una ubicación fija, que está configurada para diferentes funciones dependiendo de si la CPU admite sysenter.
El siguiente es KiFastSystemCall:
_KiFastSystemCall@0:
778470B0 mov edx,esp
778470B2 sysenter
Antes de llamar a la función anterior sin retorno, eax es el número de llamada de la llamada al sistema, entonces, ¿qué es edx? Observe la siguiente estructura de pila:
La dirección eip después del regreso de KiFastSystemCall@0
La dirección eip después del regreso de _NtCreateFile@44
Parámetro 1
Parámetro 2
El parámetro 3 contiene información de ruta. Consulte a continuación los métodos de verificación.
. . .
Parámetro 11
Entonces, edx-8 es la dirección del primer parámetro. El parámetro 3 se verifica como:
Se encuentra el contenido del parámetro 3 (4 bytes). La dirección apunta a la estructura POBJECT_ATTRIBUTES. Esta estructura está definida en msdn.
Bien, eso es todo el modo de usuario, el resto necesita ingresar al kernel.