⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mento supplicantdlg.cpp

📁 一个非常漂亮的802.1x客户端源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		"System\\CurrentControlSet\\Services\\Class\\NetTrans\\0001";
	CString sDNSSubKey;
	CString sNGSubKey;
	LPDWORD lpcbData = &cbData;
	CString sForNetGate = "DefaultGateway";
	CString sForDNS = "NameServer";
	CString sForNetMask = "IPMask";
	CString sClassIDofNIC;

	//注册表主键打开
	sNGSubKey.Format( "%s", lpNGSubKey );
	sDNSSubKey.Format( "%s", lpDNSSubKey );

	WriteDebugInfo("InitNICP"," >> Step 0");
	//获得初始化系统设置 IP Mask NetGate DNS
	if ( m_pCurrentNIC == NULL )
	{
		PrintOutput( "请确认你装有具有外网网址的网卡"," ** 没有合适的网卡",true);
		return false;
	}

	m_IP[0] = m_pCurrentNIC->m_bIP[0];
	m_IP[1] = m_pCurrentNIC->m_bIP[1];
	m_IP[2] = m_pCurrentNIC->m_bIP[2];
	m_IP[3] = m_pCurrentNIC->m_bIP[3];

	kResult = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, sNGSubKey, NULL,
		KEY_EXECUTE, &kLocalMachine);
	if( kResult != ERROR_SUCCESS )
	{
		DWORD dwTemp = GetLastError();
		LPVOID lpMsgBuf;
		FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL, dwTemp, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
			(LPTSTR) &lpMsgBuf, 0, NULL );
		PrintOutput( (const char*)lpMsgBuf ," ** 初始化网络配置参数错误!!", true );
		return false;
	}

	WriteDebugInfo("InitNICP"," >> Step 2");
	//初始化网关参数
	dwType = REG_MULTI_SZ;
	cbData = 50;
	kResult = ::RegQueryValueEx( kLocalMachine, sForNetGate, NULL, &dwType, 
		lpData, lpcbData);
	if(kResult != ERROR_SUCCESS)
	{
		DWORD dwTemp = GetLastError();
		m_bStartupConnect = false;
		LPVOID lpMsgBuf;
		FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL, dwTemp, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
			(LPTSTR) &lpMsgBuf, 0, NULL );
		PrintOutput( (const char*)lpMsgBuf ," ** 获取网关参数错误!!", true );
		return false;
	}
	{
		unsigned short int i1,i2,i3,i4;
		m_sNetGate = lpData;
		sscanf( (const char*)lpData, "%d.%d.%d.%d", &i1, &i2, &i3, &i4);
		m_NetGate[0] = (byte) i1;
		m_NetGate[1] = (byte) i2;
		m_NetGate[2] = (byte) i3;
		m_NetGate[3] = (byte) i4;
	}

	WriteDebugInfo("InitNICP"," >> Step 3");
	//初始化网络掩码参数
	dwType = REG_MULTI_SZ;
	cbData = 50;
	kResult = ::RegQueryValueEx( kLocalMachine, sForNetMask, NULL, &dwType, 
		lpData, lpcbData);
	if(kResult != ERROR_SUCCESS)
	{
		DWORD dwTemp = GetLastError();
		m_bStartupConnect = false;
		LPVOID lpMsgBuf;
		FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL, dwTemp, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
			(LPTSTR) &lpMsgBuf, 0, NULL );
		PrintOutput( (const char*)lpMsgBuf ," ** 获取网络掩码错误!!", true );
		return false;
	}
	{
		unsigned short int i1,i2,i3,i4;
		sscanf( (const char*)lpData, "%d.%d.%d.%d", &i1, &i2, &i3, &i4);
		m_NetMask[0] = (byte) i1;
		m_NetMask[1] = (byte) i2;
		m_NetMask[2] = (byte) i3;
		m_NetMask[3] = (byte) i4;
	}	
	::RegCloseKey(kLocalMachine);

	kResult = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, lpDNSSubKey, NULL,
		KEY_EXECUTE, &kLocalMachine);
	if( kResult != ERROR_SUCCESS )
	{
		DWORD dwTemp = GetLastError();
		LPVOID lpMsgBuf;
		FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL, dwTemp, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
			(LPTSTR) &lpMsgBuf, 0, NULL );
		PrintOutput( (const char*)lpMsgBuf ," ** 初始化DNS参数错误!!", true );
		return false;
	}

	WriteDebugInfo("InitNICP"," >> Step 4");
	//初始化DNS参数
	dwType = REG_SZ;
	cbData = 50;
	kResult = ::RegQueryValueEx( kLocalMachine, sForDNS, NULL, &dwType, 
		lpData, lpcbData);
	if(kResult != ERROR_SUCCESS)
	{
		DWORD dwTemp = GetLastError();
		m_bStartupConnect = false;
		LPVOID lpMsgBuf;
		FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL, dwTemp, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
			(LPTSTR) &lpMsgBuf, 0, NULL );
		PrintOutput( (const char*)lpMsgBuf ," ** 获取DNS错误!!", true );
		return false;
	}
	
	::RegCloseKey(kLocalMachine);
	
	for ( int i=0 ; i<50 ; i++ )
	{
		if ( lpData[i] == ',' )
		{
			lpData[i] = '\0';
			break;
		}
		else if ( lpData[i] == '\0' )
			break;
	}
	{
		unsigned short int i1,i2,i3,i4;
		sscanf( (const char*)lpData, "%d.%d.%d.%d", &i1, &i2, &i3, &i4);
		m_DNS1[0] = (byte) i1;
		m_DNS1[1] = (byte) i2;
		m_DNS1[2] = (byte) i3;
		m_DNS1[3] = (byte) i4;
	}
	
	return true;
}

void CMentoSupplicantDlg::SetShellIconState(int IState)
{
	if ( m_iCallWay == 0 && m_bMinimizeModeSign )
	{
		m_Notify.cbSize = sizeof(NOTIFYICONDATA);
		m_Notify.hWnd = GetSafeHwnd();
		m_Notify.uID = 0;
		m_Notify.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
		m_Notify.uCallbackMessage = WM_COMMAND;
		switch ( m_iState )
		{
		case IDT_DISCONNECT:
			m_Notify.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),
				MAKEINTRESOURCE(IDI_FAILED),IMAGE_ICON,16,16,NULL);
			lstrcpy(m_Notify.szTip,"Mento Supplicant -- 认证失败或未认证!!");
			break;
		case IDT_FIND_SERVER:
		case IDT_ACK_NAME:
		case IDT_ACK_PSWD:
			m_Notify.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),
				MAKEINTRESOURCE(IDI_CERTTING),IMAGE_ICON,16,16,NULL);
			lstrcpy(m_Notify.szTip,"Mento Supplicant -- 正在认证...");
			break;
		case IDT_ACK_ECHO:
			m_Notify.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),
				MAKEINTRESOURCE(IDI_SUCCESS),IMAGE_ICON,16,16,NULL);
			lstrcpy(m_Notify.szTip,"Mento Supplicant -- 认证成功!!");
			break;
		}
		Shell_NotifyIcon( NIM_MODIFY, &m_Notify );
	}
}

void CMentoSupplicantDlg::SwitchSystemState(int IState)
{
	if ( m_iState == IState )
		return;
	else
		m_iState = IState;

	OnSetShellIconState(IState);
	CheckAndSetButtonStatus();
	switch( IState ) {
	case IDT_DISCONNECT:		
		SetBrandLabel( " ** 认证失败或未认证!!" );
		break;
	case IDT_FIND_SERVER:
		SetBrandLabel( " >> 寻找服务器 ..." );
		break;
	case IDT_ACK_NAME:
		SetBrandLabel( " >> 发送用户名 ..." );
		break;
	case IDT_ACK_PSWD:
		SetBrandLabel( " >> 发送密码 ..." );
		break;
	case IDT_ACK_ECHO:
		if( m_ServerMsgSign)
		  SetBrandLabel( ":: 请注意服务器系统消息!!" );
	     else
		  SetBrandLabel( " :: 认证成功!!" );
		
		if ( m_bConnectMinimize )
			OnMinimize();
		
		break;
	case IDSHELL_FAILED:
		SetBrandLabel( " ** 认证失败!!" );
		break;
	}
}

void CMentoSupplicantDlg::OnInteligenceReconnect() 
{
	UpdateData();
}

void CMentoSupplicantDlg::OnArtificalAddressEnable()
{
	UpdateData();
	CheckAndSetButtonStatus();

}


void CMentoSupplicantDlg::FillNetParamater(byte ForFill[])
{
	ForFill[ 0] = Alog( m_IP[0] );
	ForFill[ 1] = Alog( m_IP[1] );
	ForFill[ 2] = Alog( m_IP[2] );
	ForFill[ 3] = Alog( m_IP[3] );
	ForFill[ 4] = Alog( m_NetMask[0] );
	ForFill[ 5] = Alog( m_NetMask[1] );
	ForFill[ 6] = Alog( m_NetMask[2] );
	ForFill[ 7] = Alog( m_NetMask[3] );
	ForFill[ 8] = Alog( m_NetGate[0] );
	ForFill[ 9] = Alog( m_NetGate[1] );
	ForFill[10] = Alog( m_NetGate[2] );
	ForFill[11] = Alog( m_NetGate[3] );
	ForFill[12] = Alog( m_DNS1[0] );
	ForFill[13] = Alog( m_DNS1[1] );
	ForFill[14] = Alog( m_DNS1[2] );
	ForFill[15] = Alog( m_DNS1[3] );
	ForFill[16] = Alog( circleCheck[0] );
	ForFill[17] = Alog( circleCheck[1] );
}

int CMentoSupplicantDlg::SendFindServerPacket()
{
	static byte broadPackage[0x3E8] = {	//广播包,用于寻找服务器
		0x00,0x00,0x00,0x00,0x00,0x00,	//Destination
		0x00,0x00,0x00,0x00,0x00,0x00,	//Source
		0x88,0x8E,						//Ethertype = 0x888E (8021X)
		0x01,							//Version = 1
		0x01,							//Packet Type  0x00 ;0x01,EAPOL-Start ;0x02 ;0x03 ;0x04
		0x00,0x00,						//Packet Body Length

		0xFF,0xFF,0x37,0x77,0xFF,0xFC,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,				//*实达专有响应附加包
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x15,0x00,0x00,0x13,0x11,0x38,0x30,0x32,	//
		0x31,0x78,0x2E,0x65,0x78,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,	//
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x1F,0x00,	//
		0x00,0x00,0x00,0x00,0x13,0x11,0x00,0x28,0x1A,0x28,0x00,0x00,0x13,0x11,0x17,0x22,	//
		0x92,0x68,0x64,0x66,0x92,0x94,0x62,0x66,0x91,0x93,0x95,0x62,0x93,0x93,0x91,0x94,	//
		0x64,0x61,0x64,0x64,0x65,0x66,0x68,0x94,0x98,0xA7,0x61,0x67,0x65,0x67,0x9C,0x6B};	//


   /*yte ackShida[] = {				//实达专有响应附加包
		0xFF,0xFF,0x37,0x77,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x08,0x15,0x00,0x00,0x13,0x11,0x38,0x30,0x32,0x31,0x78,
		0x2E,0x65,0x78,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x29,0x00,0x00,0x00, 
		0x00,0x00,0x13,0x11,0x00,0x28,0x1A,0x28,0x00,0x00,0x13,0x11,0x17,0x22,0x93,0x91,
		0x65,0x65,0x62,0x60,0x66,0x96,0x93,0x68,0x91,0x62,0x91,0x67,0x66,0x61,0x96,0x91,
		0x64,0x68,0x93,0x62,0x69,0x64,0x61,0x69,0xc9,0xD3,0x62,0x65,0x67,0x68,0x00,0x00,
		0x13,0x11,0x18,0x06};*/
	

	WriteDebugInfo("CertProcess"," >> Step 0");
	if ( m_iSelectedMode == 1 )
		memcpy( broadPackage, StarAddr, 6 );
	else
		memcpy( broadPackage, StandardAddr, 6 );
	memcpy( broadPackage+6, bLocalMAC, 6 );		//填充MAC地址

	FillNetParamater( &ackShida[0x05]);
    for(int i=0 ; i<0x74 ; i++ )
	broadPackage[18+i] = ackShida[i];
	m_OutputCtl.AddString(" >> 寻找服务器 ...");
	//发送认证请求"客户端发起认证"
	return pcap_sendpacket( m_pCurrentNIC->m_pHandle, broadPackage, 0x3E8 );
}

int CMentoSupplicantDlg::SendNamePacket()
{
	static byte ackPackage[0x3E8] = {	//应答包,包括用户名和MD5
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x8E,0x01,0x00,
		0x00,0x0D,0x02,0x01,0x00,0x0D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
		0xFF,0x37,0x77,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x11,0x38,0x30,0x32,0x31,0x78,0x2E,
		0x65,0x78,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*	byte ackShida[] = {				//实达专有响应附加包
		0xFF,0xFF,0x37,0x77,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x08,0x15,0x00,0x00,0x13,0x11,0x38,0x30,0x32,0x31,0x78,
		0x2E,0x65,0x78,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x29,0x00,0x00,0x00,
		0x00,0x00,0x13,0x11,0x00,0x28,0x1A,0x28,0x00,0x00,0x13,0x11,0x17,0x22,0x93,0x91,
		0x65,0x65,0x62,0x60,0x66,0x96,0x93,0x68,0x91,0x62,0x91,0x67,0x66,0x61,0x96,0x91,
		0x64,0x68,0x93,0x62,0x69,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x13,0x11,0x18,0x06};*/

	int iNameLen = m_sName.GetLength();

	WriteDebugInfo("CertProcess"," >> Step 1");
	for( int i=0 ; i<6 ; i++ )
		ackPackage[i] = bDestMAC[i];		//将目的MAC地址填入组织回复的包

	for( i=0 ; i<6 ; i++ )
		ackPackage[i+6] = bLocalMAC[i];		//将本机MAC地址填入组织回复的包

	ackPackage[18] = 0x02;					//code,2代表应答
	ackPackage[19] = bIndentify;

	*(short *)(ackPackage+16) = ntohs((short)(5+m_sName.GetLength()));//len
	*(short *)(ackPackage+20) = *(short *)(ackPackage+16);//len

	for( i=0 ; i<iNameLen ; i++)
		*(ackPackage+23+i) = *(m_sName.GetBuffer(0)+i);	//填入用户名

	//	FillNetParamater(&ackPackage[0x24]);
	FillNetParamater( &ackShida[0x05] );
	
	for( i=0 ; i<0x74 ; i++ )
		ackPackage[0x17+m_sName.GetLength()+i] = ackShida[i];
	PrintOutput(" >> 发送用户名 ... ");

	//iRtn = pcap_sendpacket(m_pCurrentNIC->m_pHandle,ackPackage,23+m_sName.GetLength());
	return pcap_sendpacket( m_pCurrentNIC->m_pHandle, ackPackage, 0x3E8 );
}

int CMentoSupplicantDlg::SendPasswordPacket()
{
	static byte ackPackage[0x3E8] = {	//应答包,包括用户名和MD5
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x8E,0x01,0x00,
		0x00,0x0D,0x02,0x01,0x00,0x0D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
		0xFF,0x37,0x77,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x11,0x38,0x30,0x32,0x31,0x78,0x2E,
		0x65,0x78,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	
	byte md5src[30],*md5Dig;
	int iLen,i;

	WriteDebugInfo("CertProcess"," >> Step 2");
	bpMD5Source = bMD5Source;

	iLen = ntohs(*(short *)(bpMD5Source+16));
	for( i=0 ; i<iLen+16 ; i++ )
		ackPackage[i] = *(bpMD5Source+i);

	iLen = ntohs(*(short *)(bpMD5Source+16));

	for( i=0 ; i<6 ; i++ )
		ackPackage[i] = bDestMAC[i];		//将目的MAC地址填入组织回复的包

	for( i=0 ; i<6 ; i++ )
		ackPackage[i+6] = bLocalMAC[i];		//将本机MAC地址填入组织回复的包

	ackPackage[18] = 0x02;					//code,2代表应答
	ackPackage[19] = bpMD5Source[19];		//ID
	*(ackPackage+22) = *(bpMD5Source+22);	//type,即应答方式

	*(short *)(ackPackage+16) = ntohs((short)( 22+m_sName.GetLength()) );//len
	*(short *)(ackPackage+20) = *(short *)( ackPackage+16 );

	md5src[0] = ackPackage[19];//ID

	for( i=0 ; i<m_sPassword.GetLength() ; i++ )
		md5src[1+i] = *( m_sPassword.GetBuffer(0) + i );//密码
	
	for( i=0 ; i<(int)*(ackPackage+23) ; i++ )
		md5src[1+m_sPassword.GetLength()+i] = bMD5Source[24+i];//密匙
	
	md5Dig = ComputeHash( md5src, 1+(int)*(ackPackage+23)+ m_sPassword.GetLength() );
	
	for( i=0 ; i<(int)*(ackPackage+23) ; i++ )
		ackPackage[24+i] = md5Dig[i];
	
	for( i=0 ; i<m_sName.GetLength() ; i++ )
		ackPackage[24+(int)*(ackPackage+23)+i] = *( m_sName.GetBuffer(0)+i );

	FillNetParamater( &ackShida[0x05] );
	
	for( i=0 ; i<0x74 ; i++ )
		ackPackage[24+(int)*(ackPackage+23)+m_sName.GetLength()+i] = ackShida[i];
	
	PrintOutput(" >> 发送密码 ... ");
	return pcap_sendpacket( m_pCurrentNIC->m_pHandle, ackPackage, 0x3E8 );
}

int CMentoSupplicantDlg::SendEchoPacket()
{
	static byte echoPackage[] = {	//echo包,用于每5秒钟激活一次
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x8E,0x01,0xBF,
		0x00,0x1E,0xFF,0xFF,0x37,0x77,0x7F,0x9F,0xF7,0xFF,0x00,0x00,0xFF,0xFF,0x37,0x77,
		0x7F,0x9F,0xF7,0xFF,0x00,0x00,0xFF,0xFF,0x37,0x77,0x7F,0x3F,0xFF};
	ULONG_BYTEARRAY uCrypt1,uCrypt2,uCrypt1_After,uCrypt2_After;

	WriteDebugInfo("CertProcess"," >> Step 3");
	m_uSerialNo.ulValue++;
	uCrypt1.ulValue = m_uKey.ulValue + m_uSerialNo.ulValue;
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -