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

📄 ctrlthread.c

📁 Linux下面截获以态网数据包!是在内核态下面运行的驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <linux/module.h> 
#include <linux/config.h> 
#include <linux/init.h> 
#include <linux/netdevice.h> 	/* for dev_base */
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/dnotify.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/time.h>
#include <linux/vmalloc.h>
#include <linux/syscalls.h>
#include <asm/semaphore.h>
#include <asm/unistd.h>

#include "createDir.h"
#include "DomainIPHash.h"
#include "list.h"
#include "Rule.h"
#include "RuleIp.h"
#include "protocol.h"
#include "function.h"

extern GVAR	gVar;

void SmtpPop3Config(void);
void WebMailConfig(void);
void MsnConfig(void);
void ImLogConfig(void);
void HttpUrlConfig(void);
void FtpConfig(void);
void TelnetConfig(void);
void IcqConfig(void);
void YahooConfig(void);
void IcqConfig(void);
char*ReadWebMailConfig(void);
unsigned int GetProfileString( char* lpAppName, char* lpKeyName, char* lpDefault,
		char* lpReturnedString, unsigned int  nSize, char* lpFileName );

//TCP与UDP线程控制结构
#define	SMTP_FILE_THREAD_NUM 	1

#define	SMTP_THREAD_NUM			2

#define	TCP_PARSER_THREAD		24
#define	UDP_PARSER_THREAD		12

THREAD_CONTROL	CreateDir_thread;
THREAD_CONTROL	tcp_thread[ TCP_PARSER_THREAD ];
THREAD_CONTROL	udp_thread[ UDP_PARSER_THREAD ];

//协议还原线程
THREAD_CONTROL	smtp_thread[ SMTP_THREAD_NUM ];
THREAD_CONTROL	http_thread[ 4 ];
THREAD_CONTROL	ftp_thread[ 4 ];
THREAD_CONTROL	msn_thread[ 4 ];
THREAD_CONTROL	telnet_thread[ 4 ];
THREAD_CONTROL	yahoo_thread[ 4 ];
THREAD_CONTROL	gtalk_thread[ 4 ];
THREAD_CONTROL	pp_thread[ 4 ];

//数据存盘线程
THREAD_CONTROL	smtp_save[ SMTP_FILE_THREAD_NUM ];
THREAD_CONTROL	http_save[ 4 ];
THREAD_CONTROL	ftp_save[ 4 ];
THREAD_CONTROL	msn_save[ 4 ];
THREAD_CONTROL	telnet_save[ 4 ];
THREAD_CONTROL	yahoo_save[ 4 ];
THREAD_CONTROL	gtalk_save[ 4 ];
THREAD_CONTROL	pp_save[ 4 ];
THREAD_CONTROL	Perambulate_thread;

int CtrlThread( void * arg )
{
	int i;
	PTHREAD_CONTROL	pControl = (PTHREAD_CONTROL)arg;

	//启动创建目录线程
	init_completion( &CreateDir_thread.thread_exited );
	CreateDir_thread.thread_pid = kernel_thread( CreateDir, 
		&CreateDir_thread, CLONE_KERNEL | SIGCHLD );
		
	//启动存盘线程
	for( i = 0; i < SMTP_FILE_THREAD_NUM; i ++ )
	{
		init_completion( &smtp_save[ i ].thread_exited );
		smtp_save[ i ].thread_pid = kernel_thread( OutputFile, 
			&smtp_save[ i ], CLONE_KERNEL | SIGCHLD );		
	}
	
	//启动smtp与pop3解析线程
	for( i = 0; i < SMTP_THREAD_NUM; i ++ )
	{
		init_completion( &smtp_thread[ i ].thread_exited );
		smtp_thread[ i ].thread_pid = kernel_thread( SmtpParser,
			&smtp_thread[ i ], CLONE_KERNEL | SIGCHLD );				
	}
	
	//启动TCP解析线程
	for( i = 0; i < TCP_PARSER_THREAD; i ++ )
	{
		init_completion( &tcp_thread[ i ].thread_exited );
		tcp_thread[ i ].thread_pid = kernel_thread( TCPAppParser, 
			&tcp_thread[ i ], CLONE_KERNEL | SIGCHLD );
	}

	init_completion( &Perambulate_thread.thread_exited );
	Perambulate_thread.thread_pid = kernel_thread( Perambulate, 
		&Perambulate_thread, CLONE_KERNEL | SIGCHLD );

	daemonize( "control" );
	allow_signal( SIGTERM );	
	while( !signal_pending( current ) )
	{
		set_current_state( TASK_INTERRUPTIBLE );
		schedule_timeout( 120000 );
	}
	
	//停止TCP线程
	for( i = 0; i < TCP_PARSER_THREAD; i ++ )
	{
		kill_proc( tcp_thread[ i ].thread_pid, SIGTERM, 1 );
		wait_for_completion( &tcp_thread[ i ].thread_exited );
	}
	
	//停止smtp与pop3解析线程
	for( i = 0; i < SMTP_THREAD_NUM; i ++ )
	{
		kill_proc( smtp_thread[ i ].thread_pid, SIGTERM, 1 );
		wait_for_completion( &smtp_thread[ i ].thread_exited );
	}
	
	//停止存盘线程
	for( i = 0; i < SMTP_FILE_THREAD_NUM; i ++ )
	{
		kill_proc( smtp_save[ i ].thread_pid, SIGTERM, 1 );
		wait_for_completion( &smtp_save[ i ].thread_exited );
	}


	kill_proc( Perambulate_thread.thread_pid, SIGTERM, 1 );
	wait_for_completion( &Perambulate_thread.thread_exited );


	//停止创建目录线程
	kill_proc( CreateDir_thread.thread_pid, SIGTERM, 1 );
	wait_for_completion( &CreateDir_thread.thread_exited );
	
	complete_and_exit( &(pControl->thread_exited), 1 );
}

void DriverConfig( void )
{
	SmtpPop3Config();
/*	WebMailConfig();
	MsnConfig();
	ImLogConfig();
	HttpUrlConfig();
	FtpConfig();	
	TelnetConfig();
	YahooConfig();	
	IcqConfig();*/
}

void SmtpPop3Config( void )
{
	char 	szOutPath[ _MAX_DIR_LENGTH ];
	char 	szCreateDirBuf[ _MAX_DIR_LENGTH ];
	char 	keyword[ _MAX_DIR_LENGTH ];
	
	int		count;
	int 	iOutPathSize;
	int 	i, k, fg=0;

	memset( szOutPath, 0, _MAX_DIR_LENGTH );
	memset( szCreateDirBuf, 0, _MAX_DIR_LENGTH );
	memset( keyword, 0, _MAX_DIR_LENGTH );
	
	//先读配置参数
	GetProfileString( "SmtpPop3Path", "count", "1", szOutPath, sizeof(szOutPath) - 1, CONFIGURE_FILE );
	
	sscanf( szOutPath, "%d", &count );
	if( count < 0 )
		count = 0;

	count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER : count;

	//填充相关数据
	gVar.Smtppop3PathNumber = count;
	gVar.iSmtppop3Path = 0;

	for( i = 0; i < count; i ++ )
	{
		sprintf( keyword, "outpath%d", i + 1 );
		GetProfileString( "SmtpPop3Path", keyword, "/mnt/data/", 
			gVar.Smtppop3Path[ i ],_MAX_DIR_LENGTH, CONFIGURE_FILE );
	}
	
	//再创建相关目录
	for( k = 0; k < count; k ++ )
	{
		fg = 0;
		sprintf( szOutPath, "%s", gVar.Smtppop3Path[ k ] );
		iOutPathSize = strlen( szOutPath );
		
		if( szOutPath[ iOutPathSize - 1 ] != '/' )
		{
			szOutPath[ iOutPathSize ] = '/';
			szOutPath[ iOutPathSize + 1 ] = '\0';
		}
		
		memset( szCreateDirBuf, 0, sizeof(szCreateDirBuf) );
		
		for( i = 0; i < iOutPathSize; i ++ )
		{
			if( szOutPath[ i ] == '/' )
			{
				if( fg )
				{
					memcpy( szCreateDirBuf, szOutPath, i );
					szCreateDirBuf[ i + 1 ] = '\0';

					mkdir( szCreateDirBuf, 755 );
				}
				else
				{
					fg = 1;
				}
			}
		}
	}
	
	return;
}

void WebMailConfig( void )
{
	char	szOutPath[_MAX_DIR_LENGTH];
	char	szCreateDirBuf[_MAX_DIR_LENGTH];
	char	configPath[_MAX_DIR_LENGTH];
	char	keyword[_MAX_DIR_LENGTH];
	int		k, count=0;
	int		iOutPathSize;
	int		i, fg=0;
	

	memset( configPath, 0, _MAX_DIR_LENGTH);
	memset( szOutPath, 0, sizeof(szOutPath) );	
	GetProfileString( "WebMailPath", "count", "1", szOutPath, 
		sizeof(szOutPath) - 1, CONFIGURE_FILE );

	sscanf( szOutPath, "%d", &count );

	if( count < 1 )
		count = 1;
	count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER : count;
	gVar.WebMailPathNumber = count;
	gVar.iWebMailPath = 0;
	for( k = 0; k < count; k ++ )
	{
		sprintf( keyword, "outpath%d", k + 1 );
		GetProfileString( "WebMailPath", keyword, "/mnt/data/webmail/", gVar.WebMailPath[ k ],
			_MAX_DIR_LENGTH, CONFIGURE_FILE );
	}
	
	for( k = 0; k < count; k ++ )
	{
		fg = 0;
		
		sprintf( szOutPath, "%s", gVar.WebMailPath[ k ] );
		iOutPathSize = strlen( szOutPath );
		
		if( szOutPath[ iOutPathSize - 1 ] != '/')
		{
			szOutPath[ iOutPathSize ] = '/';
			szOutPath[ iOutPathSize + 1 ] = '\0';
			iOutPathSize ++;
		}

		memset( szCreateDirBuf, 0, sizeof(szCreateDirBuf) );
		for( i = 0; i < iOutPathSize; i ++ )
		{
			if( szOutPath[ i ] == '/' )
			{
				if( fg )
				{
					//webmail
					memcpy( szCreateDirBuf, szOutPath, i );
					szCreateDirBuf[ i + 1 ] = '\0';
					mkdir( szCreateDirBuf, 755 );
					
					//login
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_LOGIN );
					mkdir( szCreateDirBuf, 755 );
	
					//WEB_MAIL_SEND_CON
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_SEND_CON );
					mkdir( szCreateDirBuf, 755 );

					//WEB_MAIL_RECEIVE_CON
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_RECEIVE_CON );
					mkdir( szCreateDirBuf, 755 );

					//WEB_MAIL_ATTACH
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_ATTACH );
					mkdir( szCreateDirBuf, 755 );
		
					//WEB_ADD_LIST
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "/%s", WEB_MAIL_ADD_LIST );
					mkdir( szCreateDirBuf, 755 );
			
					//BBS_SEND
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", BBS_SEND );
					mkdir( szCreateDirBuf, 755 );
		
					//BBS_RECEIVE
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", BBS_RECEIVE );
					mkdir( szCreateDirBuf, 755 );
	
					//WEB_POST
					memcpy( szCreateDirBuf, szOutPath, i );
					sprintf( szCreateDirBuf + 1, "//%s", WEB_POST );
					mkdir( szCreateDirBuf, 755 );						
				}
				else
				{
					fg=1;
				}
	
			}
		}
	}
}

void MsnConfig()
{
	char	szOutPath[_MAX_DIR_LENGTH];
	char 	szCreateDirBuf[_MAX_DIR_LENGTH];
	char 	configPath[_MAX_DIR_LENGTH];
	char 	keyword[_MAX_DIR_LENGTH];
	int		k,count=0;
	int 	iOutPathSize;
	int 	i,fg=0;
	

	memset( configPath, 0, _MAX_DIR_LENGTH );
	memset( szOutPath, 0, sizeof(szOutPath) );

	sprintf( configPath, "%s", CONFIGURE_FILE );
	
	GetProfileString( "MsnPath", "count", "1", szOutPath,
		sizeof(szOutPath) - 1, configPath );
	sscanf( szOutPath, "%d", &count );
	if( count < 1 )
		count = 1;
	count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER: count;
	gVar.MsnPathNumber = count;
	gVar.iMsnPathNumber= 0;
	for( k = 0; k < count; k ++ )
	{
		sprintf( keyword, "outpath%d", k + 1 );

		GetProfileString( "MsnPath", keyword, "\\??\\d:\\msn\\", gVar.MsnPath[ k ], 
			_MAX_DIR_LENGTH, configPath );
	}

	for( k = 0; k < count; k ++ )
	{
		fg = 0;
		sprintf( szOutPath, "%s", gVar.MsnPath[ k ] );
		iOutPathSize = strlen( szOutPath );

		if( szOutPath[ iOutPathSize - 1 ] != '/' )
		{
			szOutPath[ iOutPathSize ] = '/';
			szOutPath[ iOutPathSize + 1 ] = '\0';
			iOutPathSize ++;
		}

		memset( szCreateDirBuf, 0, sizeof(szCreateDirBuf) );
		for( i = 4; i < iOutPathSize; i ++ )
		{
			if( szOutPath[ i ] == '/' )
			{
				if( fg )
				{
					//msn
					memcpy( szCreateDirBuf, szOutPath, i );
					mkdir( szCreateDirBuf, 755 );
				}
				else
				{
					fg = 1;
				}
	
			}
		}
	}
}

void ImLogConfig()
{
	char 	szOutPath[_MAX_DIR_LENGTH];
	char 	szCreateDirBuf[_MAX_DIR_LENGTH];
	char 	configPath[_MAX_DIR_LENGTH];
	char 	keyword[_MAX_DIR_LENGTH];
	int		k,count=0;
	int 	iOutPathSize;
	int 	i,fg=0;
	

	memset( configPath, 0, _MAX_DIR_LENGTH);
	memset( szOutPath, 0, sizeof(szOutPath) );
	sprintf( configPath, "%s", CONFIGURE_FILE );

	GetProfileString( "ImLogPath", "count", "1", szOutPath,
		sizeof(szOutPath) - 1, configPath );
	sscanf( szOutPath, "%d", &count );

	if( count < 1 )
		count = 1;
	count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER : count;
	gVar.ImLogPathNumber = count;
	gVar.iImLogPathNumber= 0;
	for( k = 0; k < count; k ++ )
	{
		sprintf( keyword, "outpath%d", k + 1 );
		GetProfileString( "ImLogPath", keyword, "\\??\\d:\\ImLog\\",
			gVar.ImLogPath[ k ], _MAX_DIR_LENGTH, configPath );
	}
	
	for( k = 0; k < count; k ++ )

⌨️ 快捷键说明

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