3 Ways to load a driver

janvier 2nd, 2007 at 02:10 admin

Hello, pour la nouvelle année je vais vous montrer 3 différentes facons de
loader un driver à partir du UserLand. Chacunes à ses avantages, de la moins
discrète à la plus furtive, à vous de choisir celle qui conviendra le mieux à
votre code.

——–[1 The Documented Way
La première facon est de faire comme le SDK le suggère, crée un service avec
l’API CreateService et le champ dwServiceType mit à SERVICE_KERNEL_DRIVER :

hService=CreateService(hSCManager,
"Martin",
"Martin",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
path,
NULL,
NULL,
NULL,
NULL,
NULL);
if(hService==NULL)
{
printf("Error with CreateService: %dn", GetLastError());
Status=0;
goto cleanup;
}

if(StartService(hService, 0, NULL)==0)
{
printf("Error with StartService: %dn", GetLastError());
Status=0;
goto cleanup;
}

Le code est dispo dans Services.cpp.
Ici on demande au Service Manager de crée un service appelé Martin et de le
démarré à la demande, on utilise StartService() pour le lancer. Cette manière
est la plus propre pour loader un driver.

——–[2 The UnDocumented Way

En se documentant on peut voir qu’il existe l’API native NtLoadDriver :

NTSYSAPI
NTSTATUS
NTAPI

NtLoadDriver(
IN PUNICODE_STRING DriverServiceName
);

DriverServiceName :
Registry path in system format.
Path must begin with
"//registry//machine//SYSTEM//CurrentControlSet//Services//..." where "..." is
driver symbolic name.

Key must have at least 2 values:
# "ImagePath" System path to file, in UNICODE format
# "Type" Set to 1.

Il nous suffit de crée une clé dans le registre dans :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
De mettre l’ImagePath et le Type puis d’appeler l’API sur cette clé et hop notre
driver sera chargé.
L’ImagePath doit être le NtPath et non le DosPath, la différence ? Le DosPath
est le Path classique « c:\rofl.sys » alors que le NtPath est de la forme
« \??\C:\rofl.sys »
J’ai linker NtLoadDriver.cpp avec la librairie ntdll.lib qui est fournit dans le
DKK, pour ceux qui ne l’on pas je l’est mise dans le .rar. Le code est dans NtLoadDriver.cpp

——–[3 The Bad Way
La facon la plus simple mais la moins propre pour loader un driver, je l’est lu
dans « Rootkits Subverting the Windows Kernel » il s’agit d’utiliser l’API native
NtSetSystemInformation :

NtSetSystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN PVOID SystemInformation,
IN ULONG SystemInformationLength
);

Le champ SystemInformationClass doit être mit à SystemLoadAndCallImage. Ce qui
veut dire que le second argument est un pointeur sur une struture de type
SYSTEM_LOAD_AND_CALL_IMAGE qui contient une structure UNICODE_STRING sur le NtPath du .sys. Donc plus besoin d’utiliser le registre.
Par contre on ne peut plus unloader le driver, il existe bien
SystemLoadAndCallImage avec la classe SystemUnloadImage mais il faut lui donné
l’ImageBase du driver dans la mémoire noyau et être en KernelLand.
Le code est dispo dans NtSetSystemInformation.cpp

Le pack avec les codes et binaires est dispo ici
http://ivanlef0u.fr/repo/LoadDriver.rar
Enjoy !

Entry Filed under: Non classé

2 Comments

  • 1. santabug  |  janvier 2nd, 2007 at 17:06

    hehe nice paper :)

    Vive le RCE et la prog sys.


  • 2. abc  |  janvier 2nd, 2007 at 19:43

    Salut,

    Tu as fais attention à tes fautes d’orthographe, c’est bien! Tu as donné la référence du livre aussi c’est un autre bon point! Cependant je crois que tu as oublié de mentionner ,comme s’est bien écrit dans le livre, qu’avec la méthode NtSetSystemInformation ton driver va être dans le paged pool. Cela peut donc causer tout un problème si tu enregistre un ISR par exemple. Ok, tu fais des rootkit donc tu ne feras jamais cela, mais si tu hook une fonction du kernel et que cette fonction est appelé pendant que ton driver est « swaper » et que le système est dans un IRQL qui ne permet pas de faire un sleep (égale ou supérieur a DISPATCH_LEVEL), il va arriver quoi? Tu vas avoir un BSOD. Évidemment à partir de ton driver tu peux allouer de la mémoire non-paged et mettre tes fonctions dans cette plage de mémoire.

    Au plaisir de te revoir le plus tôt possible.

    La soeur à abcde.


Trackback this post


Calendar

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

Most Recent Posts