?? checkacl.cpp
字號:
//=============================================================================================
/*
文件: CheckAcl.cpp
說明:
---------------------------------------------------
控管規則訪問控制,通過控管規則的檢查認證,確定
Socket 連接是否允許通過。
---------------------------------------------------
工程: Xfilter 個人防火墻
作者: 朱雁輝,朱雁冰
創建日期: 2001/08/21
網址: http://www.xfilt.com
電子郵件: xstudio@xfilt.com
版權所有 (c) 2001-2002 X 工作室
警告:
---------------------------------------------------
本電腦程序受著作權法的保護。未經授權,不能使用
和修改本軟件全部或部分源代碼。凡擅自復制、盜用或散
布此程序或部分程序或者有其它任何越權行為,將遭到民
事賠償及刑事的處罰,并將依法以最高刑罰進行追訴。
凡通過合法途徑購買本軟件源代碼的用戶被默認授權
可以在自己的程序中使用本軟件的部分代碼,但作者不對
代碼產生的任何后果負責。
使用了本軟件代碼的程序只能以可執行文件形式發布,
未經特別許可,不能將含有本軟件源代碼的源程序以任何
形式發布。
---------------------------------------------------
*/
//=============================================================================================
#include "stdafx.h"
#include "CheckAcl.h"
#include "TcpIpDog.h"
//=============================================================================================
// share data
#pragma data_seg(".inidata")
int m_iWorkMode = XF_PASS_ALL;
BOOL m_bAclIsChange = FALSE;
HWND m_GuiHwnd = NULL;
BOOL m_bIsWin9x = FALSE;
#pragma data_seg()
#pragma bss_seg(".uinidata")
XACL_FILE m_AclFile;
SESSION m_SessionBuf[MAX_SESSION_BUFFER];
TCHAR m_sGuiPathName[MAX_PATH];
TCHAR m_sSystemPath[MAX_PATH];
TCHAR m_sWin9xSys1[MAX_PATH];
TCHAR m_sWin2kSys1[MAX_PATH];
TCHAR m_sWin2kSys2[MAX_PATH]; // v1.0.2 add 2001-12-22
#pragma bss_seg()
CRITICAL_SECTION m_csWorkMode;
CRITICAL_SECTION m_csAclChangeMode;
CRITICAL_SECTION m_csSetProcessName;
CRITICAL_SECTION m_csSystemVersion;
CRITICAL_SECTION m_csSetAcl;
//=============================================================================================
// extern globals variable
extern TCHAR m_sProcessName[MAX_PATH];
//=============================================================================================
// initialize class function and pre-destroy class function.
CCheckAcl::CCheckAcl()
{
InitializeCriticalSection(&m_csWorkMode);
InitializeCriticalSection(&m_csSetAcl);
InitializeCriticalSection(&m_csAclChangeMode);
InitializeCriticalSection(&m_csSetProcessName);
InitializeCriticalSection(&m_csSystemVersion);
InitializeCriticalSection(&m_csSession);
m_SessionCount = 0;
}
CCheckAcl::~CCheckAcl()
{
FinallySession();
delete[](m_Session);
}
BOOL CCheckAcl::SetWindowsVersion()
{
EnterCriticalSection(&m_csSystemVersion);
{
OSVERSIONINFO VerInfo;
VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&VerInfo);
if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
m_bIsWin9x = TRUE;
}
else if(VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
(VerInfo.dwMajorVersion == 4 || VerInfo.dwMajorVersion == 5))
{
m_bIsWin9x = FALSE;
}
GetSystemDirectory(m_sSystemPath, MAX_PATH);
_tcscpy(m_sWin9xSys1, m_sSystemPath);
_tcscat(m_sWin9xSys1, _T("\\icsmgr.exe"));
_tcscpy(m_sWin2kSys1, m_sSystemPath);
_tcscat(m_sWin2kSys1, _T("\\services.exe"));
// v1.0.2 add 2001-12-22
_tcscpy(m_sWin2kSys2, m_sSystemPath);
_tcscat(m_sWin2kSys2, _T("\\INETSRV\\INETINFO.EXE"));
}
LeaveCriticalSection(&m_csSystemVersion);
return TRUE;
}
//=============================================================================================
// Static function, XFILTER.EXE to change the work mode and ACL information,
// it's operate by XfIoControl.
int CCheckAcl::IsWin9x()
{
return m_bIsWin9x;
}
int CCheckAcl::SetGuiProcessName(const TCHAR *sPathName)
{
EnterCriticalSection(&m_csSetProcessName);
{
_tcscpy(m_sGuiPathName, sPathName);
}
LeaveCriticalSection(&m_csSetProcessName);
return XERR_SUCCESS;
}
int CCheckAcl::SetGuiWnd(HWND hwnd)
{
EnterCriticalSection(&m_csWorkMode);
{
m_GuiHwnd = hwnd;
}
LeaveCriticalSection(&m_csWorkMode);
return XERR_SUCCESS;
}
HWND CCheckAcl::GetGuiWnd()
{
return m_GuiHwnd;
}
int CCheckAcl::SetWorkMode(int iWorkMode)
{
EnterCriticalSection(&m_csWorkMode);
{
m_iWorkMode = iWorkMode;
}
LeaveCriticalSection(&m_csWorkMode);
return XERR_SUCCESS;
}
int CCheckAcl::GetWorkMode()
{
return m_iWorkMode;
}
int CCheckAcl::SetAcl(XACL_FILE AclFile)
{
EnterCriticalSection(&m_csSetAcl);
{
m_bAclIsChange = TRUE;
SetWorkMode(CXCommon::GetBit(AclFile.mAclHeader.bSet, 4, 2));
m_AclFile = AclFile;
m_bAclIsChange = FALSE;
}
LeaveCriticalSection(&m_csSetAcl);
return XERR_SUCCESS;
}
BOOL CCheckAcl::SetAclToChangedMode(BOOL IsChange)
{
EnterCriticalSection(&m_csAclChangeMode);
{
m_bAclIsChange = IsChange;
}
LeaveCriticalSection(&m_csAclChangeMode);
return TRUE;
}
//=============================================================================================
// Check rule operation. it's return access value with the ACL.
BOOL CCheckAcl::IsLocalIP(DWORD *ip)
{
BYTE IsLocalIP[4];
memcpy(IsLocalIP, ip, sizeof(DWORD));
if(*ip == 0 || IsLocalIP[3] == 127)
return TRUE;
ODS(m_sWin9xSys1);
ODS(m_sWin2kSys1);
static CString Win9xSys1 = m_sWin9xSys1;
static CString Win2kSys1 = m_sWin2kSys1;
static CString Win2kSys2 = m_sWin2kSys2; // v1.0.2 add 2001-12-22
if(m_bIsWin9x)
{
if(Win9xSys1.CompareNoCase(m_sProcessName) == 0)
return TRUE;
}
else
{
if(Win2kSys1.CompareNoCase(m_sProcessName) == 0
|| Win2kSys2.CompareNoCase(m_sProcessName) == 0) // v1.0.2 add 2001-12-22
{
ODS(_T("Is Win2000 System Process ..."));
return TRUE;
}
}
ODS(_T("Not Is Win2000 System Process ..."));
return FALSE;
}
int CCheckAcl::GetAccessInfo(SESSION *session)
{
int iRet;
iRet = GetAccessFromAcl(session);
if(iRet != XF_PASS)
session->bAction = ACL_ACTION_DENY;
else
session->bAction = ACL_ACTION_PASS;
return iRet;
}
int CCheckAcl::GetAccessFromWorkMode()
{
if(m_bAclIsChange)
return XF_UNKNOWN;
if(m_iWorkMode == XF_PASS_ALL)
return XF_PASS;
if(m_iWorkMode == XF_DENY_ALL)
return XF_DENY;
if(m_iWorkMode != XF_QUERY_ALL)
return XF_UNKNOWN;
return XF_FILTER;
}
int CCheckAcl::GetAccessFromAcl(SESSION *mSession)
{
if(m_AclFile.mAclHeader.sSignature[0] == 0
|| _tcscmp(m_sGuiPathName, m_sProcessName) == 0
|| IsLocalIP(&mSession->ulRemoteIP)
)
return XF_PASS;
int iRet;
if((iRet = GetAccessFromWorkMode()) != XF_FILTER)
return iRet;
BOOL IsOne = TRUE;
DWORD iIndex = 0;
BYTE bAction = ACL_ACTION_PASS;
COMPARE:
if(!IsOne) iIndex ++;
iIndex = FindAcl(m_sProcessName, iIndex);
if(iIndex >= m_AclFile.mAclHeader.ulAclCount)
{
if(IsOne)
{
if(m_bIsWin9x)
{
if(!QueryAccess())
return XF_DENY;
else
return XF_PASS;
}
else
{
//
// 2001-12-25 modify
// return XF_QUERY;
// chage to
//
if(!QueryAccess())
return XF_DENY;
else
return XF_PASS;
}
}
else
{
if(bAction == ACL_ACTION_DENY)
return XF_PASS;
else
return XF_DENY;
}
}
if(IsOne) IsOne = FALSE;
bAction = m_AclFile.mpAcl[iIndex].bAction;
if(m_AclFile.mpAcl[iIndex].bDirection != ACL_DIRECTION_IN_OUT
&& mSession->bDirection != m_AclFile.mpAcl[iIndex].bDirection)
goto COMPARE;
if(m_AclFile.mpAcl[iIndex].bServiceType != ACL_SERVICE_TYPE_ALL
&& mSession->bProtocol != m_AclFile.mpAcl[iIndex].bServiceType)
goto COMPARE;
if(m_AclFile.mpAcl[iIndex].bAccessTimeType != ACL_TIME_TYPE_ALL
&& FindTime(mSession->tStartTime) != m_AclFile.mpAcl[iIndex].bAccessTimeType)
goto COMPARE;
if(m_AclFile.mpAcl[iIndex].bRemoteNetType != ACL_NET_TYPE_ALL
&& FindIP(mSession->ulRemoteIP) != m_AclFile.mpAcl[iIndex].bRemoteNetType)
goto COMPARE;
if(m_AclFile.mpAcl[iIndex].uiServicePort != ACL_SERVICE_PORT_ALL
&& mSession->uiPort != m_AclFile.mpAcl[iIndex].uiServicePort)
goto COMPARE;
if(m_AclFile.mpAcl[iIndex].bAction == ACL_ACTION_DENY)
return XF_DENY;
return XF_PASS;
}
DWORD CCheckAcl::FindAcl(CString sApplication, DWORD iStart)
{
DWORD iIndex = 0;
for(iIndex = iStart; iIndex < m_AclFile.mAclHeader.ulAclCount; iIndex ++)
if(sApplication.CompareNoCase(m_AclFile.mpAcl[iIndex].sApplication) == 0)
break;
return iIndex;
}
int CCheckAcl::FindTime(CTime time)
{
for(DWORD i = 0; i < m_AclFile.mAclHeader.ulTimeCount; i ++)
{
if(CXCommon::GetBit(m_AclFile.mAclTime[i].bWeekDay,time.GetDayOfWeek() - 1) != 1)
continue;
if(m_AclFile.mAclTime[i].tStartTime == m_AclFile.mAclTime[i].tEndTime)
return i + 1;
CTime t = time.GetHour() * 3600 + time.GetMinute() * 60 + time.GetSecond();
if(m_AclFile.mAclTime[i].tStartTime < m_AclFile.mAclTime[i].tEndTime)
{
if(t >= m_AclFile.mAclTime[i].tStartTime && t <= m_AclFile.mAclTime[i].tEndTime)
return i + 1;
}
else
{
if(t >= m_AclFile.mAclTime[i].tStartTime || t <= m_AclFile.mAclTime[i].tEndTime)
return i + 1;
}
}
return ACL_TIME_TYPE_ALL;
}
int CCheckAcl::FindIP(DWORD IP)
{
DWORD i = 0;
if(IP >= m_AclFile.mAclIntranetIP.ulStartIP && IP <= m_AclFile.mAclIntranetIP.ulEndIP)
return ACL_NET_TYPE_INTRANET;
for(i = 0; i< m_AclFile.mAclHeader.ulDistrustIPCount; i++)
if(IP >= m_AclFile.mpAclDistrustIP[i].ulStartIP && IP <= m_AclFile.mpAclDistrustIP[i].ulEndIP)
return ACL_NET_TYPE_DISTRUST;
for(i = 0; i< m_AclFile.mAclHeader.ulTrustIPCount; i++)
if(IP >= m_AclFile.mpAclTrustIP[i].ulStartIP && IP <= m_AclFile.mpAclTrustIP[i].ulEndIP)
return ACL_NET_TYPE_TRUST;
for(i = 0; i< m_AclFile.mAclHeader.ulCustomIPCount; i++)
if(IP >= m_AclFile.mpAclCustomIP[i].ulStartIP && IP <= m_AclFile.mpAclCustomIP[i].ulEndIP)
return ACL_NET_TYPE_CUSTOM;
return ACL_NET_TYPE_ALL;
}
//=============================================================================================
// session operation. session include the socket connection info.
int CCheckAcl::GetSessionAndSetSessionNull(SESSION *session, int iIndex)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -