//安盾检测系统 msz
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h>
//#include <conio.h> //出现getch( )报错请引用这个头文件
#define N 100
#define msz mszz
//#define getch getchar
void pauseandclearscreen( )//暂停屏幕及清屏
{
 //   system("cls");
//    getch( );
    
}
//菜单输出函数的声明 
void mainMenu( );//主菜单
void assetMenu( ) ;//资产管理的子菜单 
void defenseMenu( );//入侵防御的子菜单
void logMenu( );//日志分析的子菜单

//主模块及各子模块主控函数的声明 
void mainMenuAction( ) ;//对主菜单选择进行处理
void assetMenuAction( ) ;//对资产管理模块选择进行处理
void defenseMenuAction( ) ;//对入侵防御模块选择进行处理
void logMenuAction( ) ;//对日志分析选择进行处理

//资产管理模块对应的函数的声明 
int host_number[100] = {0};//主机号,这是用来存放全局变量主机号的数组,你也可以用其他方式实现 
char host_system[100][100];//主机系统,这是用来存放全局变量主机系统的数组,你也可以用其他方式实现
void asset_manage(int number, char * system);//创建主机资产 
void change_asset(int number, char * system);//重新配置主机资产 
void check_asset();//查询主机资产 

//入侵防御模块对应的函数的声明 
int file_check(char * file, char muma);//文件查杀 
int risk_call(char * web, char * risk);//高危系统请求 
int file_change(int loc, char result_c, char *result_modify); //文件篡改 

//日志分析模块对应的函数的声明
void asset_record() ;//资产配置日志 
void risk_record() ; //入侵防御日志 
void init_asset_record();//初始化资产配置日志 
void init_risk_record()  ;//初始化入侵防御日志 

//主函数 
int main( )
{
	mainMenuAction( );
	return 0;
}

//资产发生修改的结构体及全局变量,这里定义全局变量是为了日志分析模块做数据准备 
int CheckAsset = 0; 
struct asset{
	int type;
	int id;
	char host_result[100];
}AssetRecord[100]; 

//入侵行为记录的结构体及全局变量 ,这里定义全局变量是为了日志分析模块做数据准备马诗哲
int CheckIncur = 0; 
struct incur{
	int type;
	char incur_result[100];
}IncurRecord[100]; 

//主菜单
void mainMenu( )
{
    printf("------------------------------\n");
    printf("|       安盾检测系统         |\n");    
    printf("------------------------------\n");
    printf("|       1、资产管理          |\n");  
    printf("|       2、入侵防御          |\n");     
    printf("|       3、日志分析          |\n");  
    printf("------------------------------\n");
    printf("|       0、退出系统          |\n");   
    printf("------------------------------\n");                     
	//在这里用printf函数编写显示主菜单的代码 
}

//资产管理部分的子菜单
void assetMenu( ) 
{
    printf("------------------------------\n");
    printf("|          资产管理          |\n");    
    printf("------------------------------\n");
    printf("|       1、创建主机资产      |\n");  
    printf("|       2、重新配置主机      |\n");     
    printf("|       3、查询主机资产      |\n");  
    printf("------------------------------\n");
    printf("|       0、返回主菜单        |\n");   
    printf("------------------------------\n");           
	//在这里用mprintf函数编写显示产管理子菜单的代码
} 

//入侵防御部分的子菜单
void defenseMenu( )
{
	//在这里用sprintf函数编写显示入侵防御子菜单的代码
    printf("------------------------------\n");
    printf("|          入侵防御          |\n");    
    printf("------------------------------\n");
    printf("|       1、文件查杀          |\n");  
    printf("|       2、高危系统调用      |\n");     
    printf("|       3、文件篡改          |\n");  
    printf("------------------------------\n");
    printf("|       0、返回主菜单        |\n");   
    printf("------------------------------\n");	
}


//日z志分析部分的子菜单
void logMenu( )
{
    printf("------------------------------\n");
    printf("|          日志分析          |\n");    
    printf("------------------------------\n");
    printf("|       1、资产配置日志      |\n");  
    printf("|       2、入侵防御日志      |\n");     
    printf("|       3、初始化入侵日志    |\n");  
    printf("|       4、初始化资产日志    |\n");      
    printf("------------------------------\n");
    printf("|       0、返回主菜单        |\n");   
    printf("------------------------------\n");		

	//在这里用printf函数编写显示日志分析子菜单的代码	
}
//msz
//对主菜单选择进行处理
void mainMenuAction( )
{
	int mChoice = 0;
	char c;
	while(1)
	{
		mainMenu( );
		printf("	请选择执行功能0~3:") ;
		scanf("%d",&mChoice);
		if( 0 == mChoice )
			exit(0);//退出系统
		else if( 1 == mChoice ) 
		{
			system("cls");//清屏msz
			assetMenuAction( );
		}
		else if( 2 == mChoice ) 
		{
			system("cls");//清屏

			defenseMenuAction( );
		}
		else if( 3 == mChoice ) 
		{
			system("cls");//清屏

			logMenuAction( );
		}
		else
		{
			printf("	没有这项功能。\n");
			printf("	请核对后重新选择\n");
			printf("	按任意键继续.....\n") ;
			scanf("%c",&c); //getch( );
			system("cls");//清屏
		}
		fflush(stdin);//清除键盘缓冲区,以便下一次输入 
	
	}//end of while(1)
}
//对资产管理模块进行处理
void assetMenuAction( ) 
{			
	int mChoice = 0;
	char c;
	while(1)//msz
	{
		assetMenu( );
		printf("	请选择资产管理功能0~3:") ;
		scanf("%d",&mChoice);
		if( 0 == mChoice )
		{
			system("cls");
			return;//返回主控函数 
		 } 
		else if( 1 == mChoice ) 
		{
			int name;
			char system[100];
			printf("请输入你要创建的主机号和主机系统,中间用空格分开\n");
			printf("请输入一个数和一个字符串\n");
			scanf("%d %s", &name, system);
			asset_manage(name, system);
			AssetRecord[CheckAsset].type = 1;//这里操作开始定义的全局变量,是为了日志分析模块记录做准备的,1代表是创建资产的操作 
			AssetRecord[CheckAsset].id = name;//这里操作开始定义的全局变量,是为了日志分析模块记录主机号做准备的
			strcpy(AssetRecord[CheckAsset].host_result, system);//这里操作开始定义的全局变量,是为了日志分析模块记录操作系统类型做准备的
			CheckAsset++;//为便于下次资产日志存放
			printf("按任意键继续......\n");
			getch( );//随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			pauseandclearscreen( );
		}
		else if( 2 == mChoice ) 
		{
			int name;
			char system[100];
			printf("请输入你要修改的主机号,以及修改后的系统名称\n");
			printf("二者用空格分隔\n");
			scanf("%d %s", &name, system);
			change_asset(name, system); 
			AssetRecord[CheckAsset].type = 2;//这里操作开始定义的全局变量,是为了日志分析模块记录做准备的,2代表是修改资产的操作
			AssetRecord[CheckAsset].id = name;//这里操作开始定义的全局变量,是为了日志分析模块记录主机号做准备的
			strcpy(AssetRecord[CheckAsset].host_result, system);//这里操作开始定义的全局变量,是为了日志分析模块记录操作系统类型做准备的
			CheckAsset++;//为便于下次资产日志存放 
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			pauseandclearscreen( );
		}
		else if( 3 == mChoice ) 
		{
			printf("你正在查看你名下的主机资产\n");
			check_asset(); 
			AssetRecord[CheckAsset].type = 3;//这里操作开始定义的全局变量,是为了日志分析模块记录做准备的,3代表是查看资产的操作
			CheckAsset++;//为便于下次资产日志存放
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");
			
		}
		else 
		{	
			printf("	没有这个分支程序。\n");
			printf("	请核对后重新选择\n");
			printf("	按任意键继续......\n") ;
			scanf("%c",&c); //getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");//清屏
		}
		fflush(stdin);//清除键盘缓冲区,以便下一次输入 
	}//end of while(1)	
}
//入侵防御模块的处理 
void defenseMenuAction( ) 
{
	int mChoice = 0;
	char c;//msz
	while(1)
	{
		defenseMenu( );
		printf("	请选择入侵防御功能0~3:") ;
		scanf("%d",&mChoice);
		if( 0 == mChoice )
		{
			system("cls");
			return;//返回主控函数 
		 } 
		else if( 1 == mChoice ) //文件查杀 
		{
			char muma = 'a';//假设这是一个木马文件的关键字,只要包含该关键字即认为是木马 
			char file[100];
			int result;
			printf("系统将帮你校验文件是否包含木马病毒...\n");
			printf("请上传一个文本文件\n");
			scanf("%s", file);
			IncurRecord[CheckIncur].type = 1;//这里操作开始定义的全局变量,是为了日志分析模块记录做准备的,1代表是文件查杀的操作 
			strcpy(IncurRecord[CheckIncur].incur_result, file);//这里操作开始定义的全局变量,是为了日志分析模块记录用户操作记录做准备的
			CheckIncur++;//为便于下次资产日志存放
			result = file_check(file, muma);
			if(result)
				printf("该文件包含木马,请不要上传\n");
			else
				printf("该文件不包含木马,请放心使用\n");
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");
		}
		else if( 2 == mChoice ) 
		{
			char web[100];
			char risk[] = "www.risk.com";//设置一个黑名单网站,可以自定义 
			int result; 
			printf("系统正在监控你的请求...\n");
			printf("请输入一个网址\n");
			scanf("%s", web);
			IncurRecord[CheckIncur].type = 2;//这里操作开始定义的全局变量,是为了日志分析模块记录做准备的,2代表是高危请求的操作 
			strcpy(IncurRecord[CheckIncur].incur_result, web);//这里操作开始定义的全局变量,是为了日志分析模块记录用户操作记录做准备的
			CheckIncur++;//为便于下次资产日志存放
			result = risk_call(web, risk);
			if(result)
				printf("该网站高危,请停止访问\n");
			else
				printf("该网站安全,可正常访问\n");//msz
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");
		}
		else if( 3 == mChoice ) 
		{
			char result_c, result_modify[1000];
			int loc, result;
			printf("系统将帮你检测是否发生文件篡改!\n");
			printf("请先编写一个文件......\n");
			printf("请输入一个字符串......\n");
			scanf("%s", result_modify);
			IncurRecord[CheckIncur].type = 3;//m这里操作开始定义的全局变量,是为了日志分析模块记录做准备的,3代表是文件篡改的操作 
			strcpy(IncurRecord[CheckIncur].incur_result, result_modify);//z这里操作开始定义的全局变量,是为了日志分析模块记录用户操作记录做准备的
			CheckIncur++;//s为便于下次资产日志存放
			printf("请您尝试对文件进行修改,本系统将校验文件是否发生真正的修改...\n");
			printf("请输入想要修改的字符位置和字符,用空格分隔。注意输入的位置不要发生数组越界!\n");
			scanf("%d %c", &loc, &result_c);
			result = file_change(loc, result_c, result_modify);
			if(result == 1)
			{
				printf("警告!发生文件篡改......\n"); 
				result_modify[loc] = result_c;
				printf("将您的文件篡改为%s,请核对\n", result_modify); 
			}	
			else
				printf("本文件未发生任何修改......\n");
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");
		}
		else 
		{
	
			printf("	没有这个循环程序。\n");
			printf("	请核对后重新选择\n");
			printf("	按任意键继续......\n") ;
			scanf("%c",&c); //getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");//清屏
		}
		fflush(stdin);//清除键盘缓冲区,以便下一次输入 
	}
}


//日志分析模块的处理
void logMenuAction( ) 
{
	int mChoice = 0;
	char c;
	while(1)
	{
		logMenu( );
		printf("	请选择日志分析功能0~4:") ;
		scanf("%d",&mChoice);
		if( 0 == mChoice )
		{
			system("cls");
			return;//返回主控函数 msz
		 } 
		 //msz
		else if( 1 == mChoice ) 
		{
			printf("你正在查看资产配置日志\n");
			printf("\n");
			asset_record();
			printf("\n");
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 msz
			system("cls");
			
		}
		else if( 2 == mChoice ) 
		{
			printf("你正在查看入侵防御日志\n");
			printf("\n");
			risk_record();
			printf("\n");
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");
			
		}
		else if( 3 == mChoice ) 
		{
			char c;
			printf("你确定要清空资产相关全部日志吗?\n");
			printf("确定请输入y,否则输入n\n");
			getchar(); //过滤掉回车符   
			scanf("%c", &c) ;
			if(c == 'y')
			{
				init_asset_record();
				printf("资产日志已清空!\n");
			}
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 msz
			system("cls");
			
		}
		else if( 4 == mChoice ) 
		{
			char c;
			printf("你确定要清空入侵防御相关全部日志吗?\n");
			printf("确定请输入y,否则输入n\n");
			getchar(); //过滤掉回车符 
			scanf("%c", &c);
			if(c == 'y')
			{
				init_risk_record(); 
				printf("资产日志已清空!\n");
			}
			printf("按任意键继续......\n");
			getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 msz
			system("cls");
			
		}
		else 
		{
	
			printf("	没有这个循环程序。\n");
			printf("	请核对后重新选择\n");
			printf("	按任意键继续......\n") ;
			scanf("%c",&c); //getch( ); //随机接收一个输入,让屏幕暂停等待,让用户能看程序结果 
			system("cls");//清屏
		}
		fflush(stdin);//清除键盘缓冲区,以便下一次输入 
	}
}


//创建主机资产 
void asset_manage(int number, char * system)
{
    
    for(int i=0;i<=99;i++){
		if(host_number[i] ==0) {
			host_number[i] = number;
			strcpy(host_system[i], system);
			pauseandclearscreen( );
			break;
		}
    }  
}

//重新配置主机 
void change_asset(int number, char * system)
{
	for(int i=0;i<=99;i++){
		if(host_number[i] ==number) {
			host_number[i] = number;
			strcpy(host_system[i], system);
			pauseandclearscreen( );
			break;
		}
	}
}

//查询主机资产 
void check_asset()
{
for(int i=0;i<=99;i++) {
	if(host_number[i] !=0) {
		printf("%d %s\n",host_number[i],host_system[i]);
	}
}
}

//文件查杀
int file_check(char * file, char muma)
{
	for(int j=0;file[j]!='\0';j++) {
		if(file[j] == muma) {
			return 1;
		}
	}
	return 0;
} 

//高危系统请求
int risk_call(char * web, char * risk)
{
	int weblen = strlen(web);
	int risklen = strlen(risk);
	if(weblen != risklen) return 0;
	for (int i=0;i<weblen;i++) {
		if (web[i]!=risk[i]) return 0;
	}
	return 1;
}

//文件篡改 
int file_change(int loc, char result_c, char *result_modify) 
{
	if (result_modify[loc] == result_c) return 0;
	else {
    result_modify[loc] = result_c;
    return 1;
    }
}
//资产配置日志 msz
void asset_record()
{
    printf("资产日志类型\tid\t系统\n");
    for(int i=0;i<100;i++) {
        if(AssetRecord[i].id!=0||AssetRecord[i].type==3){
            int a=AssetRecord[i].type;
            if(a==1) printf("创建主机资产\t%d\t%s\n",AssetRecord[i].id,AssetRecord[i].host_result);
            if(a==2) printf("修改主机资产\t%d\t%s\n",AssetRecord[i].id,AssetRecord[i].host_result);
            if(a==3) printf("查看主机资产\t-\t-\n");
       }
    }
}

//入侵防御日志 msz
void risk_record()
{
    printf("入侵日志类型\t记录\n");
    for(int i=0;i<100;i++) {
            int a=IncurRecord[i].type;
            if(a==1) printf("文件查杀\t%s\n",IncurRecord[i].incur_result);
            if(a==2) printf("高危请求\t%s\n",IncurRecord[i].incur_result);
            if(a==3) printf("文件篡改\t%s\n",IncurRecord[i].incur_result);
    }	
}

//初始化资产相关日志 msz
void init_asset_record()
{
    for(int i=0;i<100;i++) {
       AssetRecord[i].id=0;
       memset(AssetRecord[i].host_result,'\0',sizeof(AssetRecord[i].host_result));
       AssetRecord[i].type=0;
    }	
}

//初始化入侵防御相关日志 msz
void init_risk_record()
{
    for(int i=0;i<100;i++) {
       IncurRecord[i].type=0;
       memset(IncurRecord[i].incur_result,'\0',sizeof(IncurRecord[i].incur_result));
       IncurRecord[i].type=0;
    }		
} 

-