25 Nisan 2009 Cumartesi

Programatik olarak driver yükleme

Rootkitlerle veya daha genel anlamda driverlarla uğraşmış olanlar ‘sc create|start|delete|….’ komut varyasyonunun makina üzerindeki sürücüleri kontrol etmede kullanıldığını bilir. Sürekli şekilde driver yükleyip silenlerden iseniz bu yöntem can sıkmaya başlayabiliyor. Peki o zaman napalım: Bu işlemin programatik şekilde nasıl yapılacağına bakalım.

Şöyle küçük bir sınıf yazıp static fonksiyonları üzerinden işimizi halledebiliriz sanırım.

#include "windows.h"

#include "iostream"

#include "string"

#include "stdio.h"

using namespace std;

class Driver{

public:

static DWORD Install(IN LPCTSTR, IN LPCTSTR);

static DWORD Start(IN LPCTSTR);

static DWORD Open( IN LPCTSTR, HANDLE *);

static DWORD Stop(IN LPCTSTR);

static DWORD Remove(IN LPCTSTR);

};

Aşağıdaki kodu incelediğinizde de anlayacağınız üzere her bir fonksiyon öncelikle “Service Control Manager” açıyor ve onun üzerinden işini görüyor.

#include "stdafx.h"

#include "InstallDriver.h"

#include "winuser.h"

#include "stdlib.h"

DWORD Driver::Install(IN LPCTSTR DriverName, IN LPCTSTR ServiceExe){

SC_HANDLE hSCManager,hService;

TCHAR data[80];

DWORD dw=0;

hSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

if(hSCManager==NULL)

return GetLastError();

hService = CreateService( hSCManager, // SCManager database

DriverName, // name of service

DriverName, // name to display

SERVICE_ALL_ACCESS, // desired access

SERVICE_KERNEL_DRIVER, // service type

SERVICE_DEMAND_START, // start type

SERVICE_ERROR_NORMAL, // error control type

ServiceExe, // service's binary

NULL, // no load ordering group

NULL, // no tag identifier

NULL, // no dependencies

NULL, // LocalSystem account

NULL // no password

);

if(hService==NULL){

dw=GetLastError();

CloseServiceHandle(hSCManager);

return dw;

}

CloseServiceHandle( hService );

CloseServiceHandle(hSCManager);

return dw;

}

//Sürücünün doğru bir şekilde yüklenip yüklenmediğini kontrol etmek için

DWORD Driver::Open( IN LPCTSTR DriverName, HANDLE * lphDevice )

{

TCHAR completeDeviceName[64];

HANDLE hDevice;

DWORD dw=0;

//Burada ABC ismindeki bir sürücünün \DosDevices\ABC adında bir

//sembolik link oluşturduğunu varsayıyoruz. Tabi böyle bir varsayım

//yerine QueryDosDevice komutuyla varolan sembolik linkleri çekebilirdik.

if( (GetVersion() & 0xFF) >= 5 )

wsprintf( completeDeviceName, TEXT("\\\\.\\Global\\%s"), DriverName );

else

wsprintf( completeDeviceName, TEXT("\\\\.\\%s"), DriverName );

hDevice = CreateFile( completeDeviceName,

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,

NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL

);

if ( hDevice == INVALID_HANDLE_VALUE)

return GetLastError();

if ( lphDevice )

*lphDevice = hDevice;

else

CloseHandle( hDevice );

return dw;

}

DWORD Driver::Start( IN LPCTSTR DriverName){

SC_HANDLE hSCManager;

SC_HANDLE hService;

BOOL ret;

DWORD dw=0;

hSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

if(hSCManager==NULL)

return GetLastError();

hService = OpenService( hSCManager,DriverName,SERVICE_ALL_ACCESS );

if ( hService == NULL ){

dw=GetLastError();

CloseServiceHandle(hSCManager);

return dw;

}

ret = StartService( hService, 0, NULL );

dw=ret?0:GetLastError();

CloseServiceHandle( hService );

CloseServiceHandle(hSCManager);

return dw;

}

DWORD Driver::Stop(IN LPCTSTR DriverName){

SERVICE_STATUS serviceStatus;

SC_HANDLE hSCManager;

SC_HANDLE hService;

BOOL ret;

DWORD dw=0;

hSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

if(hSCManager==NULL)

return GetLastError();

hService = OpenService( hSCManager,DriverName,SERVICE_ALL_ACCESS );

if ( hService == NULL ){

dw=GetLastError();

CloseServiceHandle(hSCManager);

return dw;

}

ret = ControlService( hService, SERVICE_CONTROL_STOP, &serviceStatus );

dw=ret?0:GetLastError();

CloseServiceHandle( hService );

CloseServiceHandle(hSCManager);

return dw;

}

DWORD Driver::Remove(IN LPCTSTR DriverName){

SC_HANDLE hSCManager;

SC_HANDLE hService;

BOOL ret;

DWORD dw=0;

hSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

if(hSCManager==NULL)

return GetLastError();

hService = OpenService( hSCManager,DriverName,SERVICE_ALL_ACCESS );

if ( hService == NULL ){

dw=GetLastError();

CloseServiceHandle(hSCManager);

return dw;

}

ret = DeleteService( hService );

dw=ret?0:GetLastError();

CloseServiceHandle( hService );

CloseServiceHandle(hSCManager);

return dw;

}

Kullanıma örnek olarakta aşağıdaki resimdeki gibi arayüze sahip bir program yazılabilir.












Proje dosyasına Dosyalarım bölümünden erişilebilir.