driver etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
driver etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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.