Archive for janvier 2nd, 2007

3 Ways to load a driver

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 !

2 comments janvier 2nd, 2007


Calendar

janvier 2007
L Ma Me J V S D
« déc   fév »
1234567
891011121314
15161718192021
22232425262728
293031  

Posts by Month

Posts by Category