[WINDOWS]安全卫士类软件部分功能检查实现

1: ActiveX检查,一般是注册表:(internet选项-安全-自定义级别)

注册表项:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3

如:注册表键“2201”=0x3        表示:[ActiveX 控件自动提示]勾选了“已禁用”

2:强制禁用ActiveX:

注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{ActiveX的ID}

注册表键:“Compatibility Flags”=0x400    表示:禁用固定ID的ACTIVEX控件

3:相关软件的依赖检查

使用Depends.exe软件可以查看某个dll,ocx,exe等程序,依赖哪些dll,ocx。

4:获得文件版本的两种方法

	//获得文件版本:只能获得版本如:4.0.0.1
	string GetFileVersion(const string strFile)
	{
		struct st_Language 
		{		
			WORD wLanguageID;
			WORD wCodePage;
		};
		DWORD dwSize = GetFileVersionInfoSize(CommonFunc::StringToLPCWSTR(strFile),NULL);
		if(0 == dwSize) return "Error:" + strFile;
		LPBYTE pBlock = (BYTE*)malloc(dwSize);
		BOOL b = GetFileVersionInfo(CommonFunc::StringToLPCWSTR(strFile),0,dwSize,pBlock);
		char* pVerValue = NULL;
		UINT nlen1 = 0;
		VerQueryValueA(pBlock,"file://VarFileInfo//Translation",
		(LPVOID*)&pVerValue,&nlen1);

		//获取语言
		char* pLanValue = NULL;
		UINT nLen2 = 0;
		VerQueryValueA(pBlock,"VarFileInfo\\Translation",(LPVOID*)&pLanValue,&nLen2);
		//080404b0为中文
		st_Language stlang = *((st_Language *)pLanValue);
		//获取版本属性
		VerQueryValueA(pBlock,"\\",(LPVOID*)&pVerValue,&nlen1);
		VS_FIXEDFILEINFO *pfixfileinfo = (VS_FIXEDFILEINFO *)pVerValue;
		//修改属性
		char *cstrR = new char[128];
		ZeroMemory(cstrR,128);
		sprintf_s(cstrR,128,"%d.%d.%d.%d" ,pfixfileinfo->dwProductVersionMS >> 16
				,pfixfileinfo->dwProductVersionMS & 0xFFFF
				,pfixfileinfo->dwProductVersionLS >> 16
				,pfixfileinfo->dwProductVersionLS & 0xFFFF);
		free(pBlock); 
		return string(cstrR);
	}
	
	//获得文件版本2//可以获得版本后面的信息例如6.1.00.845(win7sp_blue)
	string GetFileVersion2(const string strFile)
	{
		HRESULT hr;
		struct LANGANDCODEPAGE {
			WORD wLanguage;
			WORD wCodePage;
		} *lpTranslate;

		PathStripPath(CommonFunc::StringToLPWSTR(strFile));
		PathRemoveExtension (CommonFunc::StringToLPWSTR(strFile));

		DWORD dwSize = GetFileVersionInfoSize(CommonFunc::StringToLPCWSTR(strFile),NULL);
		BYTE *pBlock = new BYTE[dwSize];
		if (!GetFileVersionInfo(CommonFunc::StringToLPCWSTR(strFile),0,dwSize,pBlock))
		{        
			delete[] pBlock;
			return "ERROR1";
		}
		// Read the list of languages and code pages.    
		UINT cbTranslate;
		VerQueryValue(pBlock, TEXT("\\VarFileInfo\\Translation"), (LPVOID*)&lpTranslate, &cbTranslate);
		// Read the file description for each language and code page.
		//TCHAR SubBlock[50] = "\\StringFileInfo\\080403A8\\FileVersion";
		for(int i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
		{
	   		//hr = StringCchPrintf(SubBlock, 50, TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"), lpTranslate[i].wLanguage, lpTranslate[i].wCodePage);
			char cstrSubBlock[56] = {'\0'};
			ZeroMemory(cstrSubBlock,56);
			//IntToHex
			sprintf_s(cstrSubBlock ,56,"\\StringFileInfo\\%04x%04x\\FileVersion",lpTranslate[i].wLanguage, lpTranslate[i].wCodePage);

			string strSubBlock = string(cstrSubBlock);	
			//if (FAILED(hr))
			//{
			//	delete[] pBlock;
			//}
			LPVOID lpBuffer;
			UINT dwBytes;
			// Retrieve file description for language and code page "i".
			if (VerQueryValue(pBlock, CommonFunc::StringToLPCWSTR(strSubBlock), &lpBuffer, &dwBytes))
			{
				char* cbuffer = (char*)lpBuffer;
				string strRet = "";
				for(int j=0;j<dwBytes;j++)
				{
					strRet += string(cbuffer);
					cbuffer = cbuffer + 2;
				}
				if(pBlock) delete[] pBlock;
				return strRet;
			}
		}
		if(pBlock)delete[] pBlock;
		return "ERROR2";
	}

 

 5,网络检查

ping指令

	//ping url
	bool PingURL(const string strUrl, string& strReturn)
	{
		try
		{
			bool bSucceeded = true;
			//启用winsock
			WSADATA wsa_data;
			if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0)
			{
				strReturn += "探测"+strUrl+"失败:无法启用WinSock.\r\n";
				return false;
			}
			//调用 IcmpSendEcho 所需参数
			HANDLE icmp_file = ::IcmpCreateFile();

			char* request = new char[32];
			memset(request, 'a', 32);

			int response_size = sizeof(ICMP_ECHO_REPLY) + 32;
			char* response = new char[response_size];
			ZeroMemory(response, response_size);
			//检测域名
			strReturn =  ">ping " + strUrl + "\r\n";
			hostent* host = gethostbyname(strUrl.c_str());
			if (host == NULL)
			{
				strReturn += "解析域名" + strUrl + "失败!\r\n" ;
				return false;
			}
			in_addr ip = *(in_addr*)host->h_addr;
			for (int i=0; i<4; i++)
			{
				DWORD ret_val = IcmpSendEcho(   icmp_file,
                                        ip.s_addr,
                                        request,
                                        32,
                                        NULL,
                                        response,
                                        response_size,
                                        3000    );

				PICMP_ECHO_REPLY reply = (PICMP_ECHO_REPLY)(response);
				if (ret_val >= 1 && reply->Status == IP_SUCCESS)
				{
					strReturn += "Reply from " + string(inet_ntoa(ip)) +
                         ": bytes=32 time=" + CommonFunc::IntToString(reply->RoundTripTime) +
                         " TTL=" + CommonFunc::IntToString((int)reply->Options.Ttl) + "\r\n";

				}
				else
				{
					strReturn += "Request timed out.\r\n";
					bSucceeded = false;
				}
			}

			//END
			free( request );
			request = NULL;
			free( response );
			response = NULL;
			return bSucceeded;
		}catch(...)
		{
			strReturn+="ping url 异常。#e\r\n";
			return false;
		}
			return true;
	}

 

 

	//ping ip
	bool PingIP(const string strIP, string& strReturn)
	{
		try
		{
			bool bSucceeded = true;
			//reset
			strReturn = "";
			//调用 IcmpSendEcho 所需参数
			HANDLE icmp_file = ::IcmpCreateFile();

			char* request = new char[32];
			memset(request, 'a', 32);

			int response_size = sizeof(ICMP_ECHO_REPLY) + 32;
			char* response = new char[response_size];
			ZeroMemory(response, response_size);

			//ip 转换格式
			in_addr ip;
			ip.S_un.S_addr = inet_addr(strIP.c_str());

			strReturn =  ">ping " + strIP + "\r\n" ;
			for (int i=0; i<4; i++)
			{
				DWORD ret_val = IcmpSendEcho(   icmp_file,
                                        ip.s_addr,
                                        request,
                                        32,
                                        NULL,
                                        response,
                                        response_size,
                                        3000    );

				PICMP_ECHO_REPLY reply = (PICMP_ECHO_REPLY)(response);
				if (ret_val >= 1 && reply->Status == IP_SUCCESS)
				{
					strReturn += "Reply from " + string(inet_ntoa(ip)) +
                         ": bytes=32 time=" + CommonFunc::IntToString(reply->RoundTripTime) +
                         " TTL=" + CommonFunc::IntToString((int)reply->Options.Ttl) + "\r\n";

				}
				else
				{
					strReturn += "Request timed out.\r\n";
					bSucceeded = false;
				}
			}

			//END
			free( request );
			request = NULL;
			free( response );
			response = NULL;
			return bSucceeded;
		}catch(...)
		{
			strReturn += "ping ip 异常。#e\r\n";
			return false;
		}
		return true;
	}

 NSLOOK指令

	//NSLOOK  : DNS检测需要
	bool NsLookURL(const string strURL, string &strReturn)
	{
		try
		{
			strReturn = "";
			if(strURL.length() <=0)
			{
				strReturn += "Error:URL==NULL\r\n";
				return false;
			}
			strReturn += ">nslookup " + strURL + "\r\n";
			WSADATA wsa_data;
			if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0)
			{
				strReturn += "Error:WSAStartup\r\n";
				return false;
			}

			hostent* host = gethostbyname( strURL.c_str() );
			WSACleanup();
			if (host == NULL)
			{
				strReturn += "Error:Gethostbyname\r\n";
				return false;
			}
			else
			{
				strReturn += "Name: " + string(host->h_name) + "\r\n";
				char** addresses = host->h_addr_list;
				if (*addresses != NULL)
				{
					strReturn += "Addresses " + string(inet_ntoa(*(in_addr*)*addresses)) + "\r\n";
					while (*(++addresses) != NULL)
					{
						strReturn += "                  " + string(inet_ntoa(*(in_addr*)*addresses)) + "\r\n";
					}
				}
			char** aliases = host->h_aliases;
			if (*aliases != NULL)
			{
				strReturn += "Aliases: " + string(*aliases) + "\r\n";
				while (*(++aliases) != NULL)
				{
					strReturn += "             " + string(*aliases) + "\r\n";
				}
			}
			return true;
		}
		}catch(...)
		{
			strReturn += "Error:Exception\r\n";
			return false;
		}
	}

	//NSLOOK  : DNS检测需要  若成功,则返回具体ip
	bool NsLookURL(const string strURL, string &strReturn,string &strIP)
	{
		try
		{
			strReturn = "";
			strIP = "";
			if(strURL.length() <=0)
			{
				strReturn += "Error:URL==NULL\r\n";
				return false;
			}
			strReturn += ">nslookup " + strURL + "\r\n";
			WSADATA wsa_data;
			if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0)
			{
				strReturn += "Error:WSAStartup\r\n";
				return false;
			}

			hostent* host = gethostbyname( strURL.c_str() );
			WSACleanup();
			if (host == NULL)
			{
				strReturn += "Error:Gethostbyname\r\n";
				return false;
			}
			else
			{
				strReturn += "Name: " + string(host->h_name) + "\r\n";
				char** addresses = host->h_addr_list;
				if (*addresses != NULL)
				{
					strIP = string(inet_ntoa(*(in_addr*)*addresses)) ;
					strReturn += "Addresses " + strIP + "\r\n";
					while (*(++addresses) != NULL)
					{
						strReturn += "                  " + string(inet_ntoa(*(in_addr*)*addresses)) + "\r\n";
					}
				}
			char** aliases = host->h_aliases;
			if (*aliases != NULL)
			{
				strReturn += "Aliases: " + string(*aliases) + "\r\n";
				while (*(++aliases) != NULL)
				{
					strReturn += "             " + string(*aliases) + "\r\n";
				}
			}
			return true;
		}
		}catch(...)
		{
			strReturn += "Error:Exception\r\n";
			return false;
		}
	}

 trace指令

	//trace URL   , iPackLen为每次探测的包长 
	bool TraceURL(const string strURL,const int iPackLen,string &strReturn)
	{
		strReturn = "";
		WSADATA wsa;
		if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
		{
			strReturn += ("WSAStartup failed.\r\n");
			return false;
		}
		//转换IP地址到整数
		unsigned long ip = inet_addr(strURL.c_str());
		if(ip==INADDR_NONE)
		{
			//用户可能输入的是域名
			hostent* pHost = gethostbyname(strURL.c_str());
			//如果域名无法解析
			if(pHost==NULL)
			{
				strReturn += ("Invalid IP or domain name:" + strURL + "\r\n");
				return false;
			}
			//取域名的第一个IP地址
			ip = *(unsigned long*)pHost->h_addr_list[0];
			strReturn += ("trace route to " + strURL + "(" + string(inet_ntoa(*(in_addr*)&ip)) + ")"+ "  Len:" + CommonFunc::IntToString(iPackLen) + "\r\n");
		}
		else
		{
			strReturn += ("trace route to " + strURL + "  Len:" + CommonFunc::IntToString(iPackLen) + "\r\n");
		}
		//打开ICMP句柄
		HANDLE hIcmp;
		if ((hIcmp = IcmpCreateFile()) == INVALID_HANDLE_VALUE)
		{	
			strReturn +=  ("Unable to open ICMP file.\r\n" );
			return false;
		}
		//设置IP报头的TTL值
		IP_OPTION_INFORMATION IpOption;
		ZeroMemory(&IpOption,sizeof(IP_OPTION_INFORMATION));
		IpOption.Ttl = 1;
		//设置要发送的数据
		char *SendData;
		if(iPackLen == TRACER_1460_PACK)
		{
			SendData = new char[TRACER_1460_PACK];
		}
		else if(iPackLen == TRACER_1400_PACK)
		{
			SendData = new char[TRACER_1400_PACK];
		}
		else if(iPackLen == TRACER_1000_PACK)
		{
			SendData = new char[TRACER_1000_PACK];
		}
		else
		{
			SendData = new char[TRACER_32_PACK];
		}
		ZeroMemory(SendData,iPackLen);
    	//设置接收缓冲区
		char ReplyBuffer[sizeof(ICMP_ECHO_REPLY)+32];
		PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
		BOOL bLoop = TRUE;
		int iMaxHop = 30;
		while(bLoop && iMaxHop--)
		{
			string strLine = "";//记录一条记录
			strLine += CommonFunc::IntToString((int)IpOption.Ttl);
			//发送ICMP回显请求
			if(IcmpSendEcho(hIcmp,(IPAddr)ip, SendData, sizeof(SendData), &IpOption,
				ReplyBuffer, sizeof(ReplyBuffer), 3000)!=0)
			{
				if(pEchoReply->RoundTripTime==0)
				{
					strLine += "        <1ms";
				}
				else
				{
					strLine += "        " + CommonFunc::IntToString(pEchoReply->RoundTripTime) + "ms" ;
				}
				strLine += "        " + string(inet_ntoa(*(in_addr*)&(pEchoReply->Address))) ;
				//判断是否完成路由路径探测
				if((unsigned long)pEchoReply->Address==ip)
				{
					strLine += "\r\nTrace complete.";
					bLoop = FALSE;
				}
			}
			else
			{
				strLine += "        Request time out.";
			}
			strReturn +=  (strLine + "\r\n" );
			IpOption.Ttl++;
		}
		IcmpCloseHandle(hIcmp);
		WSACleanup();
		return true;
	}

 获得网页内容

	#define URLRESULT_MAXLEN 2048  //获得网页的最大长度
       //根据URL通过GET请求,获得网页内容//若要完整获取,可在InternetReadFile使用循环读取
	bool GetHtmlResultByURL(string& strHtmlResult,const string strURL)
	{
		//1,分解URL
		//PBDebug::WriteDebugLog("1、分解URL");
		bool bHttps = true;
		string strHostName = "";
		int iHostPort = 443;
		string strCommand = "";
		//string strGetData = "";
		strHtmlResult = "";
		if( false == CommonFunc::AnalyseURL(strURL, bHttps,strHostName,iHostPort,strCommand) )
		{
			strHtmlResult = "AnalyseURL ERROR : [" + strURL + "]\r\n";
			return false;
		}
	/*	PBDebug::WriteDebugLog(strURL);
	PBDebug::WriteDebugLog(strHostName);
	if(bHttps) PBDebug::WriteDebugLog("https");
	PBDebug::WriteDebugLog(CommonFunc::IntToString(iHostPort));
	PBDebug::WriteDebugLog(strCommand);
		*/
	


		wstring wstrHostName = CommonFunc::s2ws(strHostName);
		wstring wstrCommand = CommonFunc::s2ws(strCommand);
		//wstring wstrGetData = CommonFunc::s2ws(strGetData);
		LPCTSTR cstrHostName = wstrHostName.c_str();
		LPCTSTR cszCommand = wstrCommand.c_str();
		//LPCTSTR cstrGetData = wstrGetData.c_str();
		//int iGetDataLen = strGetData.length();
		//2、设置
	//PBDebug::WriteDebugLog("2、设置");
		LPCTSTR cstrRequestMethod = L"GET";
		DWORD dwOpenRequestFlags;
		if(bHttps)
		{
			dwOpenRequestFlags = 	INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
									INTERNET_FLAG_KEEP_CONNECTION |
									INTERNET_FLAG_NO_AUTH |
									INTERNET_FLAG_NO_COOKIES |
									INTERNET_FLAG_NO_UI |
									//设置启用HTTPS
									INTERNET_FLAG_SECURE |
									INTERNET_FLAG_IGNORE_CERT_CN_INVALID|
									INTERNET_FLAG_RELOAD;
		}
		else
		{
			dwOpenRequestFlags = INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD;
		}
		//3、打开连接
	//PBDebug::WriteDebugLog("3、打开连接");
		HINTERNET hInte = InternetOpen(L"", INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
		if(NULL == hInte)
		{
			strHtmlResult = "InternetOpen ERROR : " + CommonFunc::IntToString(GetLastError()) + "[" + strURL + "]\r\n";
			return false;
		}
		//4、尝试连接
	//PBDebug::WriteDebugLog("4、尝试连接");
		HINTERNET hConnection = InternetConnect(hInte,
												cstrHostName,
												iHostPort,
												NULL,
												NULL,
												INTERNET_SERVICE_HTTP,
												0,
												0);
		if(NULL == hConnection)
		{
			strHtmlResult = "InternetConnect ERROR " + CommonFunc::IntToString(GetLastError()) + ": [" + strURL + "]\r\n";
			InternetCloseHandle(hInte);
			return false;
		}
		//5、接收数据
	//PBDebug::WriteDebugLog("5、接收数据");
		HINTERNET hRequest = HttpOpenRequest(hConnection,
												 cstrRequestMethod,
												 cszCommand,
												 HTTP_VERSION,
												 L"",
												 NULL,
												 dwOpenRequestFlags,
												 0);
		if(NULL == hRequest)
		{
			strHtmlResult = "HttpOpenRequest ERROR " + CommonFunc::IntToString(GetLastError()) + ": [" + strURL + "]\r\n";
			InternetCloseHandle(hInte);
			InternetCloseHandle(hConnection);
			return false;
		}
		HttpAddRequestHeaders(hRequest,
									  L"---------------------------\r\n\r\n" ,
									  -1,
									  HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE);
		bool bRet = false;
		//6、发送数据
	//PBDebug::WriteDebugLog("6、发送数据");
		if( TRUE == HttpSendRequest(hRequest,NULL,0,"",0) )
		{
			DWORD dwLen = URLRESULT_MAXLEN;
			char szBuffer[URLRESULT_MAXLEN];
			memset(szBuffer,0,URLRESULT_MAXLEN);
			if( TRUE == InternetReadFile(hRequest, szBuffer, URLRESULT_MAXLEN, &dwLen) )
			{
					strHtmlResult = string(szBuffer,dwLen);
					bRet = true;
			}
			else
			{
					strHtmlResult = " InternetRead ERROR :" + CommonFunc::IntToString(GetLastError());
					bRet = false;
			}
		}
		else
		{
			strHtmlResult = " HttpSend ERROR " + CommonFunc::IntToString(GetLastError());
			bRet = false;
		}
		InternetCloseHandle(hInte);
		InternetCloseHandle(hConnection);
		InternetCloseHandle(hRequest);
		return bRet;
	}

 

转载于:https://www.cnblogs.com/SKeyC27/p/5590982.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值