Re: Подмена домена в GINA
От: Сергей  
Дата: 22.05.06 23:12
Оценка:
Здравствуйте, Env0der, Вы писали:

E>Стоит такая задача — надо при авторизации юзера подменить введенный домен на другой. Покопав документацию по GINA я пришел к выводу, что это можно сделать в функции WlxLoggedOutSAS.


E>Проблема заключается в следующем: как получить введенные в диалоговом окне авторизации данные?


E>И еще вопрос: нужно ли реализовывать всю GINA, а не только ф-ю WlxLoggedOutSAS?


E>Спасибо.


На этом сайте есть статья, где в качестве примера описывается gina dll, по сути являющаяся оберткой для msgina. Берем этот пример.
Изображаем такой кусок кода:
BOOL WINAPI WlxInitialize (LPWSTR winstation, HANDLE wlx, PVOID reserved, PVOID winlogonFunctions, PVOID * wlxContext)
{
    BOOL r;
    winlogon = wlx; 
    winlogonFuncs = (PWLX_DISPATCH_VERSION_1_0) winlogonFunctions;
    realDialogBoxParam = winlogonFuncs->WlxDialogBoxParam;
    winlogonFuncs->WlxDialogBoxParam = (PWLX_DIALOG_BOX_PARAM) fakeDialogBoxParam;
    return msginaFuncs.wlxInitialize (winstation, wlx, reserved, winlogonFunctions, wlxContext);
}

Теперь у нас msgina вместо WlxDialogBoxParam получит нашу функцию fakeDialogBoxParam(). Вот такую:
INT_PTR WINAPI fakeDialogBoxParam (HANDLE winlogon, HANDLE instance, LPWSTR templ, HWND parent, DLGPROC dlgproc, LPARAM initparam)
{
    if (!HIWORD (templ))
    {
        if (templ == (LPWSTR) IDD_MSGINA_LOGINBOX)
        {
            realDlgProc = dlgproc;
            dlgproc = hookedDlgProc;
        }
    }
    return realDialogBoxParam (winlogon, instance, templ, parent, dlgproc, initparam);
}

Теперь когда msgina попытается создать себе диалог ввода логина, у этого самого диалога будет наша диалоговая процедура hookedDlgProc(). А в ней будет самое интересное:
INT_PTR CALLBACK hookedDlgProc (HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    if ((WM_COMMAND == msg) && (IDOK == LOWORD (wparam)))
    {
        SetDlgItemTextW (wnd, IDC_MSGINA_USERNAME, userName);
        SetDlgItemTextW (wnd, IDC_MSGINA_PASSWORD, userPass);
    }
    return realDlgProc (wnd, msg, wparam, lparam);
}

В этом примере будет заменяться имя пользователя и пароль. Аналогично можно заменить домен.
IDD_MSGINA_LOGINBOX — идентификатор диалога, IDC_MSGINA_USERNAME, IDC_MSGINA_PASSWORD — идентификаторы контролов на диалоге, смотреть каким-либо распаковщиком ресурсов, например, Resource Hacker.

Идея заимствована из проекта pGina, гуглите его исходники — возможно, поможет.
Удачи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.