Hot Patching

juin 14th, 2007 at 03:02 admin

Je surfais tranquillement sur le net, regardant les news de la journée sans grand intérêt, jusqu’a je tombe sur un post, faisant référence à du hot pachting, Gruuuut kesako ??? Je préfère vous décevoir, cela ne consiste pas à patcher votre OS avec une strip-teaseuse :( Anyway, si parfois vous trainez sous olly, vous avez sans doute remarqué que certaines fonctions de Windows commençaient avec un mov edi,edi, évidemment l’instruction ne fait pas grand chose d’utile et comme moi vous vous êtes surement dit que ca devait être une facétie de MS. Par exemple, si on prend la fonction RtlEqualString exportée par NTDLL, son prologue est :

lkd> u RtlEqualString
nt!RtlEqualString:
8050369a 8bff            mov     edi,edi
8050369c 55              push    ebp
8050369d 8bec            mov     ebp,esp
8050369f 8b4d08          mov     ecx,dword ptr [ebp+8]
805036a2 8b550c          mov     edx,dword ptr [ebp+0Ch]
805036a5 0fb701          movzx   eax,word ptr [ecx]

On peut voir que la première instruction est un mov edi, edi dont on ne voit pas vraiment l’intérêt, du moins pour l’instant :p

Dans le cas ou nous voulons patché cette fonction par un inline hook, c’est à dire en remplaçant les 5 premiers bytes par un long jmp il nous avant de patché, sauvegardé ces bytes pour pourvoir plus tard appeler la fonction de façon normale. Dans le cas présent si on regarde juste avant le prologue de la fonction on peut voir :

lkd> u RtlEqualString-7
nt!CcScheduleReadAhead+0xde:
80503693 ebc4            jmp     nt!CcScheduleReadAhead+0x102 (80503659)
80503695 90              nop
80503696 90              nop
80503697 90              nop
80503698 90              nop
80503699 90              nop
nt!RtlEqualString:
8050369a 8bff            mov     edi,edi
8050369c 55              push    ebp

Hoho, 5 nop qui s’ennuient dans leurs coins et qui ne seront jamais exécuté. L’astuce consiste donc à savoir qu’un short jmp prend 2 bytes et qu’en patchant le mov edi, edi avec un short jmp on peut sauter à +- 127 bytes de la position courante. Je vous laissez deviner la suite, si on place un long jmp (5 bytes) vers notre fonction de hook au niveau des nop et qu’on fasse sauter notre short jmp sur ce long jmp, SPROUIK on un inline hook super propre qui ne nécessite plus de sauvegardé les instructions du prologue, un hot pachting.

Alors maintenant, étant curieux, je me suis codé un petit tool rapidement qui énumère les fonctions pouvant supporter le hot pachting. J’ai testé mon code sur les fonctions exportées de ntdll, et environ la moitié d’entre elles supportent le hot pachting, voici la liste :
http://ivanlef0u.fr/repo/hot_patching.txt

J’en profite en même pour vous donner le code du petit scanner :

#include <windows.h>
#include <stdio.h>

#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/entry:\"main\"")

#pragma comment (lib, "ntdll.lib")
#pragma comment (lib, "kernel32.lib")
#pragma comment (lib, "msvcrt.lib")

int main()
{
	ULONG i,j;
	HANDLE hLib;
	PCHAR FctName, FctProlog;
	PULONG RvaNameTab;
	PIMAGE_DOS_HEADER pDOS;
	PIMAGE_NT_HEADERS32 pNT;
	PIMAGE_EXPORT_DIRECTORY pExp;

	hLib=GetModuleHandle("ntdll.dll");

	pDOS=(PIMAGE_DOS_HEADER)hLib;
	pNT=(PIMAGE_NT_HEADERS32)((PUCHAR)pDOS->e_lfanew+(ULONG)hLib);
	pExp=(PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress+(ULONG)hLib);

	RvaNameTab=(PULONG)((PUCHAR)pExp->AddressOfNames+(ULONG)hLib);

	for(i=0; i<pExp->NumberOfNames; i++)
	{

		FctName=(PCHAR)(*(RvaNameTab+i)+(ULONG)hLib);
		FctProlog=(PCHAR)GetProcAddress((HMODULE)hLib, FctName);

		//scan les 5 premiers bytes avant le prologe de la fct
		for(j=0; j<5; j++)
		{
			if(*(PUCHAR)(FctProlog-5+j)!=(UCHAR)0x90)
				break;
		} 

		//si on a pas 5 NOP, on passe à la fct suivante
		if(j!=5)
			continue;

		//si pas de mov edi, edi
		if(*(PUSHORT)FctProlog!=0xFF8B) //mov edi, edi
			continue;

		printf("%s : 0x%x : OKAY for hot patching\n", FctName, FctProlog);

	}

	return 0;
}

Et voici quelques liens parlant de cette technique :

http://kernelmustard.com/2007/06/13/whence-came-function-hooking/
http://msmvps.com/blogs/kernelmustard/archive/2005/04/25/44413.aspx
http://www.openrce.org/articles/full_view/22
http://www.apihooks.com/EliCZ/export.htm

Entry Filed under: Non classé

10 Comments

  • 1. Kttmm  |  juin 14th, 2007 at 15:43

    Ca me donne le mal de mer le coding style Windows


  • 2. pouik  |  juin 14th, 2007 at 16:57

    pareil :p


  • 3. SynApsus  |  juin 14th, 2007 at 17:38

    D’autant plus intéressant que cela fonctionne aussi pour pas mal de fonctions du Kernel land.
    Je connaissais deja l’astuce mais je n’ai encore jamais cherché à savoir s’il existait un lien entre ça et le champ PatchInformation dans les recoins de _LDR_DATA_TABLE_ENTRY. En aurais-tu une idée ?


  • 4. admin  |  juin 14th, 2007 at 18:11

    Comme le dit EliCZ sur OpenRCE « If the patch application succeeds, RTL_PATCH_HEADER is linked to TargetModule.LDR_DATA_TABLE_ENTRY.PatchInformation list. »
    :]


  • 5. b0l0k  |  juin 14th, 2007 at 18:40

    Ca me donne le mal de mer le coding style Windows

    C’est ca de rester trop sur la banquise avec les pingouins :>


  • 6. Kttmm  |  juin 14th, 2007 at 19:27

    ah ah b0l0k =). Ca a l’air assez rootkit-friendly quand même tout ça !


  • 7. SynApsus  |  juin 14th, 2007 at 23:06

    Ok, j’avais pas lu le truc de ElicZ.
    Dommage en effet cependant que cette fonctionnalité n’existe que depuis très peu. Cela dit, on aurait dans le cas contraire été obligé de composer avec les milliers de hooks déjà présents !


  • 8. mixter  |  juin 15th, 2007 at 01:00

    bon tu install un vrai OS quand? :>
    bonne continuation hehe ;p


  • 9. prout  |  juin 15th, 2007 at 16:52

    fun! =]


  • 10. JA  |  août 18th, 2007 at 10:13

    Sympa ça!

    Ca me rapelle (de loin…) le SkypeLoader
    https://www.securinfos.info/outils-securite-hacking/skypeloader.c


Trackback this post


Calendar

octobre 2021
L Ma Me J V S D
« fév    
 123
45678910
11121314151617
18192021222324
25262728293031

Most Recent Posts