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.
Hiç yorum yok:
Yorum Gönder