yo en los casos que he visto, es mas el porcentaje que guarda los bytes reales para hacer la llamada o no.
Seguro pero el salto al comienzo de la funcion hookeada no va ahi, me atreveria a decir que siempre va a otra funcion que hace algo al menos (sino no tiene sentido hookear) y el codigo original puede estar en cualquier lado mas o menos cerca pero nunca ahi mismo.
es lo mismo, evadir una restriccion sea de el modo que sea es saltarsela , engañar, burlar llamemosle como sea.
Puede ser pero el codigo del hook sigue siendo ejecutado siempre, no es como el caso al que me refiero justo despues.
si ¿y la ntdll no va a morir a la api del sistema?, igual estoy confundido pero me gustaria ver un MessageBox por ejemplo sin tocar en ningun caso una una dll del sistema, o borrar archivos sin hacer uso alguno de ninguna funcion modo usuario/kernel y que sea estable y funcional en todos los sistemas windows logicamente.
Partimos de diferente nomenclatura pero el se refirio a DLLs y APIs y se entiende como API de Windows el subsistema de ventanas (ni el Kernel ni la parte del subsistema de ventanas en modo Kernel en XP, al cual la API termina llamando, son .DLLs) y son una serie de DLLs de modo Usuario (Kernel32, User32, Advapi32, etc.) que si son hookeadas pueden ser saltados los hooks por estar el llamado y el llamador en el mismo CPL.
Lo mismo ocurre con los servicios del sistema que son llamados desde la NTDLL, User32 o Gdi32 (tal y como en MS-DOS son los de la 21h, en Windows son los de la 2Eh aunque ahora se usen instrucciones mas modernas).
Supongamos un hook simple en modo Usuario, lo siguiente es lo que hacia el malware que mencione antes:
;antes del hook
kernel32!OpenProcess:
7c8309e9 8bff mov edi,edi
7c8309eb 55 push ebp
7c8309ec 8bec mov ebp,esp
7c8309ee 83ec20 sub esp,20h
7c8309f1 8b4510 mov eax,dword ptr [ebp+10h]
7c8309f4 8945f8 mov dword ptr [ebp-8],eax
7c8309f7 8b450c mov eax,dword ptr [ebp+0Ch]
7c8309fa 56 push esi
;supuesto hook
kernel32!OpenProcess:
7c8309e9 e922269dd3 jmp 50203010
7c8309ee 83ec20 sub esp,20h
7c8309f1 8b4510 mov eax,dword ptr [ebp+10h]
7c8309f4 8945f8 mov dword ptr [ebp-8],eax
7c8309f7 8b450c mov eax,dword ptr [ebp+0Ch]
7c8309fa 56 push esi
7c8309fb 33f6 xor esi,esi
7c8309fd f7d8 neg eax
Lo unico que tiene que hacer el que quiera saltar el hook es esto:
mov edi,edi
push ebp
mov ebp,esp
jmp 7c8309ee
Es decir ejecutar por su cuenta los primeros bytes que han sido reemplazados por el hook (estos bytes se pueden leer del disco facilmente) y saltar a la funcion originales despues del hook. Despues existen mas complicaciones como
rebasear el codigo y desensamblar para encontrar la ultima instruccion completa que quedo tras el salto pero alguien ya lo hizo, simplemente sobreescribir el codigo del hook por el original es muchisimo mas simple.
En cuanto al tema API y demas, de Windows Internals:
Windows API functions Documented, callable subroutines in the Windows API. Examples include CreateProcess, CreateFile, and GetMessage.
Native system services (or executive system services) The undocumented, underlying services in the operating system that are callable from user mode. For example, NtCreateProcess is the internal system service the Windows CreateProcess function calls to create a new process. (For a definition of native functions, see the section "System Service Dispatching" in Chapter 3.)
Kernel support functions (or routines) Subroutines inside the Windows operating system that can be called only from kernel mode (defined later in this chapter). For example, ExAllocatePool is the routine that device drivers call to allocate memory from the Windows system heaps.
PD: con api me refiero tanto en modo usuario como en modo kernel, hacer una aplicacion sin tocar en ningun caso ni una sola funcion.
La API como tal es de modo Usuario, esto solo se puede hacer desde modo Kernel directamente O lo podes hacer habilitando los puertos de I/O que quieras desde Kernel y accediendo desde Usuario (estan bloqueados por defecto). Obviamente seria un tremendisima
hack pero que yo sepa ya existen porquerias que acceden al disco directamente.