Windows10でGINAがロードされない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DAICHI0922
記事: 26
登録日時: 11ヶ月前

Windows10でGINAがロードされない

#1

投稿記事 by DAICHI0922 » 6ヶ月前

自作でGINAを作ってみようと思い、http://eternalwindows.jp/security/gina/gina00.html を参考に、まずは通常のGINAにスタブするプログラムを書いたのですが、思うように動いてくれません。

VC++でdllを作り、それをsystem32フォルダに移動してから、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon にGinaDLLという名前のREG_SZ型のデータを作り、絶対パスでdllのある位置を値として保存しました。

以下のプログラムの場合、SASが発行された場合やSecure Desktopに切り替わった時などにメッセージボックスが表示されるはずなのですが、表示されません。

どうしたらいいでしょうか?

コード:

#define UNICODE
#include <windows.h>
#include <winwlx.h>

typedef BOOL(WINAPI* LPFNWLXNEGOTIATE)(DWORD, PDWORD);
typedef BOOL(WINAPI* LPFNWLXINITIALIZE)(LPWSTR, HANDLE, PVOID, PVOID, PVOID*);
typedef VOID(WINAPI* LPFNWLXDISPLAYSASNOTICE)(PVOID);
typedef int  (WINAPI* LPFNWLXLOGGEDOUTSAS)(PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID*);
typedef BOOL(WINAPI* LPFNWLXACTIVATEUSERSHELL)(PVOID, PWSTR, PWSTR, PVOID);
typedef int  (WINAPI* LPFNWLXLOGGEDONSAS)(PVOID, DWORD, PVOID);
typedef VOID(WINAPI* LPFNWLXDISPLAYLOCKEDNOTICE)(PVOID);
typedef int  (WINAPI* LPFNWLXWKSTALOCKEDSAS)(PVOID, DWORD);
typedef BOOL(WINAPI* LPFNWLXISLOCKOK)(PVOID);
typedef BOOL(WINAPI* LPFNWLXISLOGOFFOK)(PVOID);
typedef VOID(WINAPI* LPFNWLXLOGOFF)(PVOID);
typedef VOID(WINAPI* LPFNWLXSHUTDOWN)(PVOID, DWORD);

LPFNWLXNEGOTIATE           g_lpfnWlxNegotiate = NULL;
LPFNWLXINITIALIZE          g_lpfnWlxInitialize = NULL;
LPFNWLXDISPLAYSASNOTICE    g_lpfnWlxDisplaySASNotice = NULL;
LPFNWLXLOGGEDOUTSAS        g_lpfnWlxLoggedOutSAS = NULL;
LPFNWLXACTIVATEUSERSHELL   g_lpfnWlxActivateUserShell = NULL;
LPFNWLXLOGGEDONSAS         g_lpfnWlxLoggedOnSAS = NULL;
LPFNWLXDISPLAYLOCKEDNOTICE g_lpfnWlxDisplayLockedNotice = NULL;
LPFNWLXWKSTALOCKEDSAS      g_lpfnWlxWkstaLockedSAS = NULL;
LPFNWLXISLOCKOK            g_lpfnWlxIsLockOk = NULL;
LPFNWLXISLOGOFFOK          g_lpfnWlxIsLogoffOk = NULL;
LPFNWLXLOGOFF              g_lpfnWlxLogoff = NULL;
LPFNWLXSHUTDOWN            g_lpfnWlxShutdown = NULL;

HANDLE                    g_hWlx = NULL;
PWLX_DISPATCH_VERSION_1_0 g_pDispatchTable = NULL;

BOOL InitializeStub(void);
BOOL ReplaceDefaultGina(void);

BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion)
{
	ReplaceDefaultGina();

	if (!InitializeStub())
		return FALSE;

	return g_lpfnWlxNegotiate(dwWinLogonVersion, pdwDllVersion);
}

BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, HANDLE hWlx, PVOID pvReserved, PVOID pWinlogonFunctions, PVOID* pWlxContext)
{
	g_hWlx = hWlx;
	g_pDispatchTable = (PWLX_DISPATCH_VERSION_1_0)pWinlogonFunctions;

	g_pDispatchTable->WlxMessageBox(hWlx, NULL, NULL, (LPWSTR)"WlxInitialize", MB_OK);

	return g_lpfnWlxInitialize(lpWinsta, hWlx, pvReserved, pWinlogonFunctions, pWlxContext);
}

VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxDisplaySASNotice", MB_OK);

	g_lpfnWlxDisplaySASNotice(pWlxContext);
}

int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, DWORD dwSasType, PLUID pAuthenticationId, PSID pLogonSid, PDWORD pdwOptions, PHANDLE phToken, PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, PVOID* pProfile)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxLoggedOutSAS", MB_OK);

	return g_lpfnWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);
}

BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, PWSTR pszDesktopName, PWSTR pszMprLogonScript, PVOID pEnvironment)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxActivateUserShell", MB_OK);

	return g_lpfnWlxActivateUserShell(pWlxContext, pszDesktopName, pszMprLogonScript, pEnvironment);
}

int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, DWORD dwSasType, PVOID pReserved)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxLoggedOnSAS", MB_OK);

	return g_lpfnWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved);
}

VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxDisplayLockedNotice", MB_OK);

	g_lpfnWlxDisplayLockedNotice(pWlxContext);
}

int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxWkstaLockedSAS", MB_OK);

	return g_lpfnWlxWkstaLockedSAS(pWlxContext, dwSasType);
}

BOOL WINAPI WlxIsLockOk(PVOID pWlxContext)
{
	return g_lpfnWlxIsLockOk(pWlxContext);
}

BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext)
{
	return g_lpfnWlxIsLogoffOk(pWlxContext);
}

VOID WINAPI WlxLogoff(PVOID pWlxContext)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxLogoff", MB_OK);

	g_lpfnWlxLogoff(pWlxContext);
}

VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD dwShutdownType)
{
	g_pDispatchTable->WlxMessageBox(g_hWlx, NULL, NULL, (LPWSTR)"WlxShutdown", MB_OK);

	g_lpfnWlxShutdown(pWlxContext, dwShutdownType);
}

BOOL InitializeStub(void)
{
	HINSTANCE hinstDll;

	hinstDll = LoadLibrary(L"msgina.dll");
	if (hinstDll == NULL)
		return FALSE;

	g_lpfnWlxNegotiate = (LPFNWLXNEGOTIATE)GetProcAddress(hinstDll, "WlxNegotiate");
	if (g_lpfnWlxNegotiate == NULL)
		return FALSE;

	g_lpfnWlxInitialize = (LPFNWLXINITIALIZE)GetProcAddress(hinstDll, "WlxInitialize");
	if (g_lpfnWlxInitialize == NULL)
		return FALSE;

	g_lpfnWlxDisplaySASNotice = (LPFNWLXDISPLAYSASNOTICE)GetProcAddress(hinstDll, "WlxDisplaySASNotice");
	if (g_lpfnWlxDisplaySASNotice == NULL)
		return FALSE;

	g_lpfnWlxLoggedOutSAS = (LPFNWLXLOGGEDOUTSAS)GetProcAddress(hinstDll, "WlxLoggedOutSAS");
	if (g_lpfnWlxLoggedOutSAS == NULL)
		return FALSE;

	g_lpfnWlxActivateUserShell = (LPFNWLXACTIVATEUSERSHELL)GetProcAddress(hinstDll, "WlxActivateUserShell");
	if (g_lpfnWlxActivateUserShell == NULL)
		return FALSE;

	g_lpfnWlxLoggedOnSAS = (LPFNWLXLOGGEDONSAS)GetProcAddress(hinstDll, "WlxLoggedOnSAS");
	if (g_lpfnWlxLoggedOnSAS == NULL)
		return FALSE;

	g_lpfnWlxDisplayLockedNotice = (LPFNWLXDISPLAYLOCKEDNOTICE)GetProcAddress(hinstDll, "WlxDisplayLockedNotice");
	if (g_lpfnWlxDisplayLockedNotice == NULL)
		return FALSE;

	g_lpfnWlxWkstaLockedSAS = (LPFNWLXWKSTALOCKEDSAS)GetProcAddress(hinstDll, "WlxWkstaLockedSAS");
	if (g_lpfnWlxWkstaLockedSAS == NULL)
		return FALSE;

	g_lpfnWlxIsLockOk = (LPFNWLXISLOCKOK)GetProcAddress(hinstDll, "WlxIsLockOk");
	if (g_lpfnWlxIsLockOk == NULL)
		return FALSE;

	g_lpfnWlxIsLogoffOk = (LPFNWLXISLOGOFFOK)GetProcAddress(hinstDll, "WlxIsLogoffOk");
	if (g_lpfnWlxIsLogoffOk == NULL)
		return FALSE;

	g_lpfnWlxLogoff = (LPFNWLXLOGOFF)GetProcAddress(hinstDll, "WlxLogoff");
	if (g_lpfnWlxLogoff == NULL)
		return FALSE;

	g_lpfnWlxShutdown = (LPFNWLXSHUTDOWN)GetProcAddress(hinstDll, "WlxShutdown");
	if (g_lpfnWlxShutdown == NULL)
		return FALSE;

	return TRUE;
}

BOOL ReplaceDefaultGina(void)
{
	HKEY hKey;
	LONG lResult;

	lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", 0, KEY_SET_VALUE, &hKey);
	if (lResult == ERROR_SUCCESS) {
		RegDeleteValue(hKey, L"GinaDLL");
		RegCloseKey(hKey);
		return TRUE;
	}
	else
		return FALSE;
}

DAICHI0922
記事: 26
登録日時: 11ヶ月前

Re: Windows10でGINAがロードされない

#2

投稿記事 by DAICHI0922 » 6ヶ月前

もしかしたらdefファイルなどが必要ですか...?
しかし、そのdefファイルはどこに置けばいいのでしょうか?

Math

Re: Windows10でGINAがロードされない

#3

投稿記事 by Math » 6ヶ月前

http://eternalwindows.jp/security/gina/gina01.html

Windows 2000/XP環境下ではGINAと呼ばれる置き換え可能なDLLが存在します。 GINAとは、Graphical Identification aNd Authenticationの略で、 その名の通りグラフィカルな対話と認証をサポートします。 GINAはWindows Vistaで廃止された技術であるため、 Windows Vista以降の環境ではCredential Providerという新しい技術を使用するようにしてください。

とありますね。

https://en.wikipedia.org/wiki/Graphical ... entication

GINA is discontinued in Windows Vista. とあります

DAICHI0922
記事: 26
登録日時: 11ヶ月前

Re: Windows10でGINAがロードされない

#4

投稿記事 by DAICHI0922 » 6ヶ月前

なるほど...
GINAは廃止されてしまったのですね...

その Windows Fingerprint Credential Provider についての詳細な説明(C++などのプログラムを用いた解説 http://eternalwindows.jp/security/gina/gina00.html のようなサイト)はありませんか?
結構ニッチな市場なようで解説があまり見つかりません...


DAICHI0922
記事: 26
登録日時: 11ヶ月前

Re: Windows10でGINAがロードされない

#6

投稿記事 by DAICHI0922 » 6ヶ月前

そうですね。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る