防火墙代码
BOOL IpRule::OnInitDialog()
{
CDialog::OnInitDialog();
m_hDLGBKBrush = CreateSolidBrush(RGB(242,246,250)); // TODO: Add extra initialization here
m_iprulelist.SetExtendedStyle(m_iprulelist.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FLATSB | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT); m_iprulelist.InsertColumn(0,"启用",LVCFMT_LEFT,20,-1);
m_iprulelist.InsertColumn(1,"规则名称",LVCFMT_LEFT,180,-1); m_iprulelist.InsertColumn(2,"动作",LVCFMT_LEFT,40,-1);
m_iprulelist.InsertColumn(3,"协议",LVCFMT_LEFT,45,-1);
m_iprulelist.InsertColumn(4,"方向",LVCFMT_LEFT,40,-1);
m_iprulelist.InsertColumn(5,"对方IP",LVCFMT_LEFT,80,-1);
m_iprulelist.InsertColumn(6,"对方端口",LVCFMT_LEFT,60,-1);
m_iprulelist.InsertColumn(7,"本机端口",LVCFMT_LEFT,60,-1);
m_iprulelist.InsertItem(0,"");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void IpRule::OnBeditip()
{
EditIPRule m_editDlg;
POSITION pos ;
int row;
DialogText dText;
CString address;
ICMP_ITEM *icRule = new ICMP_ITEM();
//TU_ITEM *tuRule;
pos = m_iprulelist.GetFirstSelectedItemPosition(); row = m_iprulelist.GetNextSelectedItem(pos); /*CString temp;
temp.Format("%d",row);
MessageBox(temp);*/
dText.name = m_iprulelist.GetItemText( row, 1 ); dText.action = m_iprulelist.GetItemText( row, 2 ); dText.direction = m_iprulelist.GetItemText( row, 4 ); if(m_iprulelist.GetItemText( row, 5 ) == "任意")
{
dText.destStartIp = 0;
dText.destEndIp = 0;
}
else
{
address = m_iprulelist.GetItemText( row, 5 ); dText.destStartIp = 0x00000000;//not finished dText.destEndIp = 0x00000000;
}
if(address = m_iprulelist.GetItemText( row, 6 ) == "")
{
dText.destStartPort = "";
dText.destEndPort = "";
}
else
{
}
if(address = m_iprulelist.GetItemText( row, 7 ) == "")
{
dText.srcStartPort = "";
dText.srcEndPort = "";
}
else
{
}
GetDlgItemText(IDC_DESCRIPTION,dText.description);
///////////////////得到ICMP的详细信息
currRules->setPos(row+1); //置规则链表当前指针 if((dText.protocol=m_iprulelist.GetItemText( row, 3 ))=="ICMP")
{
currRules->getItem(icRule);
CString temp;
temp.Format("%d",icRule->code);
dText.icmpCode = temp;
temp.Format("%d",icRule->type);
dText.icmpType = temp;
}
m_editDlg.dText = dText; //显示在eidtIpRule对话框里
if(m_editDlg.DoModal() == IDOK)
{
dText = m_editDlg.dText; //得到eidtIpRule对话框里的内容
//名称
m_iprulelist.SetItemText(row,1,dText.name);
////动作///////////////////////////
m_iprulelist.SetItemText(row,2,dText.action); //协议/////////////////////////////////////
m_iprulelist.SetItemText(row,3,dText.protocol); //方向
m_iprulelist.SetItemText(row,4,dText.direction);
//IP段////////////////////////////////////////////////// if(dText.destStartIp == 0 && dText.destEndIp == 0) m_iprulelist.SetItemText(row,5,"任意");
else
{
address.Format("%s-->%s",inet_ntoa(*(in_addr*)&(dText.destStartIp)),
作者: ministar 2005-6-25 23:05 回复此发言
--------------------------------------------------------------------------------
2 防火墙代码
inet_ntoa(*(in_addr*)&(dText.destEndIp))); m_iprulelist.SetItemText(row,5,address);
}
///端口////////////////////////
if(dText.protocol == "ICMP")
m_iprulelist.SetItemText(row,6,"");
else
{
if(dText.destStartPort == "" && dText.destEndPort == "") m_iprulelist.SetItemText(row,6,"任意");
else
{
address.Format("%s-->%s",dText.destStartPort,dText.destEndPort); m_iprulelist.SetItemText(row,6,address);
}
if(dText.srcStartPort == "" && dText.srcEndPort == "") m_iprulelist.SetItemText(row,7,"任意");
else
{
address.Format("%s-->%s",dText.srcStartPort,dText.srcEndPort); m_iprulelist.SetItemText(row,7,address);
}
}
//描述///////////////////////////
SetDlgItemText(IDC_DESCRIPTION,dText.description); }
}
void IpRule::OnBaddip()
{
EditIPRule m_editDlg;
int row;
DialogText dText;
CString address;
row = m_iprulelist.GetItemCount();
row--;
if(m_editDlg.DoModal() == IDOK)
{
dText = m_editDlg.dText; //得到eidtIpRule对话框里的内容
//名称
m_iprulelist.SetItemText(row,1,dText.name); ////动作///////////////////////////
m_iprulelist.SetItemText(row,2,dText.action); //协议///////////////////////////////////// m_iprulelist.SetItemText(row,3,dText.protocol); //方向
m_iprulelist.SetItemText(row,4,dText.direction);
//IP段////////////////////////////////////////////////// if(dText.destStartIp == 0 && dText.destEndIp == 0) m_iprulelist.SetItemText(row,5,"任意");
else
{
address.Format("%s-->%s",inet_ntoa(*(in_addr*)&(dText.destStartIp)),
inet_ntoa(*(in_addr*)&(dText.destEndIp))); m_iprulelist.SetItemText(row,5,address); }
///端口////////////////////////
if(dText.protocol == "ICMP")
m_iprulelist.SetItemText(row,6,"");
else
{
if(dText.destStartPort == "" && dText.destEndPort == "")
m_iprulelist.SetItemText(row,6,"任意");
else
{
address.Format("%s-->%s",dText.destStartPort,dText.destEndPort); m_iprulelist.SetItemText(row,6,address);
}
if(dText.srcStartPort == "" && dText.srcEndPort == "") m_iprulelist.SetItemText(row,7,"任意");
else
{
address.Format("%s-->%s",dText.srcStartPort,dText.srcEndPort); m_iprulelist.SetItemText(row,7,address);
}
}
//描述///////////////////////////
SetDlgItemText(IDC_DESCRIPTION,dText.description); }
}
HBRUSH IpRule::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here if(nCtlColor == (CTLCOLOR_DLG | CTLCOLOR_STATIC | CTLCOLOR_BTN)) {
pDC->SetBkColor(RGB(242,246,250));
return m_hDLGBKBrush;
}
// TODO: Return a different brush if the default is not desired return hbr;
}
int IpRule::WriteDefaultRule()
{
int num = 0;
if(rlFile.Open("rule\\rule.rl", CFile::modeReadWrite | CFile::typeBinary
|CFile::shareExclusive) ==0 )
{
MessageBox("can't open rule file");
return false;
}
int count = 7;//规则数
ICMP_ITEM rl[7];
作者: ministar 2005-6-25 23:05 回复此发言
--------------------------------------------------------------------------------
3 防火墙代码
rlFile.Write(&count,4);
//rule 1;
rl[0].num = 1;
rl[0].use = 0;
strcpy(rl[0].name,"允许自己用ping探测其他机器");
rl[0].Proto = 1;
rl[0].destStartIp = inet_addr("0.0.0.0"); rl[0].destEndIp = inet_addr("0.0.0.0"); rl[0].type = 8;
rl[0].code = 0;
rl[0].direction = 2;
rl[0].action = 1;
strcpy(rl[0].description,""); //rule 2
rl[1].num = 2;
rl[1].use = 0;
strcpy(rl[1].name,"允许路由器返回“超时”的ICMP回应包"); rl[1].Proto = 1;
rl[1].destStartIp = inet_addr("0.0.0.0"); rl[1].destEndIp = inet_addr("0.0.0.0"); rl[1].type = 11;
rl[1].code = 0;
rl[1].direction = 1;
rl[1].action = 1;
strcpy(rl[1].description,""); //rule 3
rl[2].num = 3;
rl[2].use = 0;
strcpy(rl[2].name,"允许路由器返回“无法到达”的ICMP回应包"); rl[2].Proto = 1;
rl[2].destStartIp = inet_addr("0.0.0.0"); rl[2].destEndIp = inet_addr("0.0.0.0"); rl[2].type = 3;
rl[2].code = 0;
rl[2].direction = 1;
rl[2].action = 1;
strcpy(rl[2].description,""); //rule 4
rl[3].num = 4;
rl[3].use = 0;
strcpy(rl[3].name,"允许其他机器用ping探测");
rl[3].Proto = 1;
rl[3].destStartIp = inet_addr("0.0.0.0"); rl[3].destEndIp = inet_addr("0.0.0.0"); rl[3].type = 0;
rl[3].code = 0;
rl[3].direction = 1;
rl[3].action = 1;
strcpy(rl[3].description,"");
//rule 5
rl[4].num = 5;
rl[4].use = 1;
strcpy(rl[4].name,"禁止所有ICMP包");
rl[4].Proto = 1;
rl[4].destStartIp = inet_addr("0.0.0.0"); rl[4].destEndIp = inet_addr("0.0.0.0"); rl[4].type = 0;
rl[4].code = 0;
rl[4].direction = 1;
rl[4].action = 1;
strcpy(rl[4].description,"");
//rule 6
rl[5].num = 6;
rl[5].use = 1;
strcpy(rl[5].name,"禁止所有TCP包");
rl[5].Proto = 6;
rl[5].destStartIp = inet_addr("0.0.0.0"); rl[5].destEndIp = inet_addr("0.0.0.0"); rl[5].type = 0;
rl[5].code = 0;
rl[5].direction = 1;
rl[5].action = 1;
strcpy(rl[5].description,"");
//rule 7
rl[6].num = 6;
rl[6].use = 1;
strcpy(rl[6].name,"禁止所有UDP包");
rl[6].Proto = 17;
rl[6].destStartIp = inet_addr("0.0.0.0"); rl[6].destEndIp = inet_addr("0.0.0.0"); rl[6].type = 0;
rl[6].code = 0;
rl[6].direction = 1;
rl[6].action = 1;
strcpy(rl[6].description,"");
//写入
rlFile.Write(&rl,272*7);
rlFile.Close();
return 0;
}
BOOL IpRule::WriteRule(CString fileName, TU_ITEM &rl) //返回值代表成功与否 {
return true;
}
BOOL IpRule::WriteRule(CString fileName, ICMP_ITEM &rl) //返回值代表成功与否 {
return true;
}
int IpRule::ReadRule(CString fileName) {
int count,i;
BYTE protocol;
pos =0;
if(rlFile.Open(fileName, CFile::modeReadWrite | CFile::typeBinary
|CFile::shareExclusive) ==0 ) {
MessageBox("can't open rule file"); return false;
}
ICMP_ITEM *icItem;
TU_ITEM *tuItem;
char buffer[272];
rlFile.SeekToBegin(); //到文件头
//CString t;
rlFile.Read(&count,4); //读取规则数目
pRule = (passRule *)malloc(count*sizeof(passRule)); //分配buffer //t.Format("count:%d",a);
//AfxMessageBox(t);
//读入规则链表并初始化passRule////////////////////////////////////////
currRules = new CRule();
作者: ministar 2005-6-25 23:05 回复此发言
--------------------------------------------------------------------------------
4 防火墙代码
for(i=0;iuse) //存到下传规则buffer中
{
pRule[i].Proto = icItem->Proto; pRule[i].destStartIp = icItem->destStartIp; pRule[i].destEndIp = icItem->destEndIp; pRule[i].srcStartPort = 0;
pRule[i].srcEndPort = 0;
pRule[i].destStartPort = 0;
pRule[i].destEndPort = 0;
}
currRules->append(icItem);
// }
/* else
{
rlFile.Seek(-5,CFile::current); rlFile.Read(buffer,280);
//tuItem = (TU_ITEM *)buffer;
m_iprulelist.InsertItem(pos,""); //icItem = (ICMP_ITEM *)buffer; //m_iprulelist.SetItemText(pos,1,tuItem->name); AddToList(tuItem);
if(tuItem->use) //存到下传规则buffer中
{
pRule[i].Proto = tuItem->Proto; pRule[i].destStartIp = tuItem->destStartIp; pRule[i].destEndIp = tuItem->destEndIp; pRule[i].srcStartPort = tuItem->srcStartPort;
pRule[i].srcEndPort = tuItem->srcEndPort; pRule[i].destStartPort = tuItem->destStartPort; pRule[i].destEndPort = tuItem->destEndPort; }
currRules->append(tuItem);
}*/
/*CString temp;
temp.Format("%d",pRule[i].destStartIp); AfxMessageBox(temp);*/
}
//MessageBox(t);
rlFile.Close();
return 0;
}
void IpRule::AddToList(ICMP_ITEM *item) {
CString address; ///IP,PORT;
m_iprulelist.InsertItem(pos,""); m_iprulelist.SetItemText(pos,1,item->name); //是否启用///////////////////////////////// if(item->use)
ListView_SetCheckState(m_iprulelist.m_hWnd,pos,true);
////动作///////////////////////////
if(item->action == 1)
m_iprulelist.SetItemText(pos,2,"放行");
else
m_iprulelist.SetItemText(pos,2,"禁行");
//协议///////////////////////////////////// if(item->Proto == 1)
m_iprulelist.SetItemText(pos,3,"ICMP"); else if(item->Proto == 6)
m_iprulelist.SetItemText(pos,3,"TCP"); else if(item->Proto == 17)
m_iprulelist.SetItemText(pos,3,"UDP"); //方向///////////////////////////////////////////////
if(item->direction == 1)
m_iprulelist.SetItemText(pos,4,"传出");
else if(item->direction == 0)
m_iprulelist.SetItemText(pos,4,"传入");
else
m_iprulelist.SetItemText(pos,4,"出入");
//IP段//////////////////////////////////////////////////
if(item->destStartIp == 0)
m_iprulelist.SetItemText(pos,5,"任意");
else
{
address.Format("%s-->%s",inet_ntoa(*(in_addr*)&(item->destStartIp)),
inet_ntoa(*(in_addr*)&(item->destEndIp))); m_iprulelist.SetItemText(pos,5,address); }
//描述///////////////////////////
SetDlgItemText(IDC_DESCRIPTION,item->description); pos++;
}
void IpRule::AddToList(TU_ITEM *item) {
CString address; ///IP,PORT;
m_iprulelist.InsertItem(pos,"");
m_iprulelist.SetItemText(pos,1,item->name); //是否启用///////////////////////////////// if(item->use)
ListView_SetCheckState(m_iprulelist.m_hWnd,pos,true);
////动作///////////////////////////
if(item->action == 1)
m_iprulelist.SetItemText(pos,2,"放行");
else
m_iprulelist.SetItemText(pos,2,"禁行");
//协议///////////////////////////////////// if(item->Proto == 1)
m_iprulelist.SetItemText(pos,3,"ICMP"); else if(item->Proto == 6)
m_iprulelist.SetItemText(pos,3,"TCP"); else if(item->Proto == 17)
m_iprulelist.SetItemText(pos,3,"UDP"); //方向/////////////////////////////////////////////// if(item->direction == 1)
m_iprulelist.SetItemText(pos,4,"传出");
else if(item->direction == 0)
m_iprulelist.SetItemText(pos,4,"传入");
else
m_iprulelist.SetItemText(pos,4,"出入");
//IP段//////////////////////////////////////////////////
if(item->destStartIp == 0)
m_iprulelist.SetItemText(pos,5,"任意");
else
{
address.Format("%s-->%s",inet_ntoa(*(in_addr*)&(item->destStartIp)),
inet_ntoa(*(in_addr*)&(item->destEndIp))); m_iprulelist.SetItemText(pos,5,address); }
//端口//////////////////////////////////////////////// if(item->destEndPort == 0)
m_iprulelist.SetItemText(pos,6,"任意");
else
{
address.Format("%d-->%d",item->destStartPort,item->destEndPort);
m_iprulelist.SetItemText(pos,6,address); }
if(item->srcEndPort == 0)
m_iprulelist.SetItemText(pos,7,"任意");
else
{
address.Format("%d-->%d",item->srcStartPort,item->srcEndPort);
m_iprulelist.SetItemText(pos,7,address); }
//描述///////////////////////////
SetDlgItemText(IDC_DESCRIPTION,item->description); pos++;
}