发明内容
为解决上述问题,本发明提供了一种Linux平台下的恶意代码分析方法及系统,以避免传统修改系统调用表方法所带来的安全隐患,避免系统较大的性能损失,提供更加准确有用的监控信息,提高通信传输的数据量以及系统的易用性、灵活性和高效性,更好的满足用户对恶意代码分析的要求。
为实现上述发明目的,本发明提供了一种Linux平台下的恶意代码分析方法,该方法包括:
步骤1,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户、用户组,文件访问权限;
步骤2,加载并执行需要分析的恶意代码,同时根据界面展示的进程信息设置需要被监控进程;
步骤3,将所述关键文件信息和被监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和被监控进程信息列表;
步骤4,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;
步骤5,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;
步骤6,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。
进一步的,所述步骤2包括:
步骤21,依次进入/proc文件系统以数字命名的目录,分别对所述目录中的status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;
步骤22,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;
步骤23,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;
步骤24,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。
进一步的,所述步骤4包括:
步骤41,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;
步骤42,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,执行步骤43,如果比对不成功,则不做任何处理,继续执行下层具体文件系统处理函数;
filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,执行步骤43,否则不做任何处理,继续执行下层具体文件系统处理函数;
步骤43,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。
进一步的,所述步骤6包括:
步骤61,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;
步骤62,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。
其中,所述步骤6中:
所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。
为实现上述发明目的,本发明还提供一种Linux平台下的恶意代码分析处理系统,该系统包括:
预处理模块,设置需要监控的关键文件信息及访问权限,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID,文件访问权限;
恶意代码加载模块,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;
同步生成模块,将所述关键文件信息和监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和被监控进程信息列表;
监控处理模块,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;
记录保存模块,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;
传递展示模块,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。
进一步的,所述恶意代码加载模块包括:
操作处理模块,依次进入/proc文件系统以数字命名的目录,分别对所述目录中的status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;
链接处理模块,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;
获取展示模块,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;
指定处理模块,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。
进一步的,所述监控处理模块包括:
截获处理模块,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;
比对处理模块,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,进入执行模块,如果比对不成功,则不做任何处理,继续执行下层具体文件系统处理函数;
filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,进入执行模块,否则不做任何处理,继续执行下层具体文件系统处理函数;
执行模块,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。
进一步的,所述传递展示模块包括:
写入处理模块,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;
异步处理模块,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。
其中,所述传递展示模块中:
所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。
本发明的有益功效在于:
(1)利用LKM技术可实现动态加载,截获系统调用的位置位于VFS层和具体文件系统之间,可以获取更多与文件操作相关的信息,提供更加准确有用的监控信息。
(2)系统调用截获不需要修改系统调用表,由此可以避免传统修改系统调用表方法所带来的安全隐患。
(3)通过在内核中申请一块共享内存,将监控模块获得的日志信息传递给用户空间。采用共享内存机制既提高了内核模块和用户进程的通信速度,又提高了通信传输的数据量。
(4)由用户选定需要监控的关键文件以及进程,大大提高了系统的易用性、灵活性和高效性,更好的满足用户对恶意代码分析的要求。
(5)选取恶意代码进程和多个重要的关键文件进行监控,避免了系统较大的性能损失,提高了分析系统运行的速度。
以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的限定。
具体实施方式
图1是本发明的Linux平台下的恶意代码分析方法流程图。如图1所示,该方法包括:
步骤1,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID,文件访问权限;
步骤2,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;
步骤3,将所述关键文件信息和监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和监控进程信息列表;
步骤4,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;
步骤5,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;
步骤6,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。
进一步的,所述步骤2包括:
步骤21,依次进入/proc文件系统以数字命名的目录,分别对所述目录中status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;
步骤22,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;
步骤23,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;
步骤24,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。
进一步的,所述步骤4包括:
步骤41,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;
步骤42,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,执行步骤43,如果比对不成功,则返回,即如果比对不成功,则不对该系统调用做任何处理,使其继续执行下层具体文件系统处理函数;
filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,执行步骤43,否则,则返回,即如果比对不成功的话,则说明所要操作的文件不是用户设置的关键文件,则不对该系统调用做任何处理,使其继续去执行下层具体文件系统处理函数;
步骤43,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。
进一步的,所述步骤6包括:
步骤61,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;
步骤62,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。
其中,所述步骤6中:
所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。
图2是本发明的Linux平台下的恶意代码分析系统示意图。如图2所示,该系统包括:
预处理模块100,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID,文件访问权限;
恶意代码加载模块200,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;
同步生成模块300,将所述关键文件信息和监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和监控进程信息列表;
监控处理模块400,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;
记录保存模块500,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;
传递展示模块600,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。
进一步的,所述恶意代码加载模块200包括:
操作处理模块,依次进入/proc文件系统以数字命名的目录,分别对各目录中status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;
链接处理模块,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;
获取展示模块,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;
指定处理模块,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。
进一步的,所述监控处理模块400包括:
截获处理模块,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;
比对处理模块,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,进入执行模块,如果比对不成功,则返回,即如果比对不成功,则不对该系统调用做任何处理,使其继续执行下层具体文件系统处理函数;
filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,进入执行模块,否则,则返回,即如果比对不成功的话,则说明所要操作的文件不是用户设置的关键文件,则不对该系统调用做任何处理,使其继续去执行下层具体文件系统处理函数;
执行模块,对所述被监控进程和所述关键文件进行权限对比,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。
进一步的,所述传递展示模块600包括:
写入处理模块,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;
异步处理模块,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。
其中,所述传递展示模块600中:
所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。
图3是本发明的一实施例的Linux平台下的恶意代码分析系统架构图。结合图3列举本发明的Linux平台下的恶意代码分析方法一实施例。该实施例的Linux平台下的恶意代码处理方法包括:
步骤1,用户通过用户模块设置关键文件信息;
步骤2,用户模块提交执行代码例程加载并执行需要分析的恶意代码,同时用户通过用户模块设置需要被监控的进程;
步骤3,通信模块的proc通信例程将用户模块设置的关键文件信息和被监控进程信息传递给监控模块;
步骤4,监控模块实时监控进程对关键文件的访问,并依据访问该关键文件进程的有效用户EUID、有效组EGID以及该关键文件所属用户UID,用户组GID,和关键文件所属用户、用户组访问权限的设定,来拒绝或允许被监控进程对关键文件的操作;
步骤5,监控模块记录被监控进程对关键文件的访问操作,并将被监控进程信息,关键文件信息及其操作信息通过write_log_info()记录到日志中;
步骤6,将监控模块得到的日志信息通过通信模块的mmap通信例程传递给用户模块。
进一步,所述步骤1包括:
A1.用户提供需要监控的关键文件信息,包括文件名filename,文件所属用户UID、用户组GID,文件访问权限等属性,并针对系统中的不同用户设置不同的访问权限;
A2.用户通过用户模块提供的两个接口函数add_keyfile()和del_keyfile()来增加和删除关键文件信息;
A3.用户模块的关键文件设置例程通过show_keyfile()函数把关键文件信息以界面方式展示给用户。
进一步,所述步骤2包括:
B1.用户模块的提交执行代码例程调用load_execute()函数从指定路径下加载并执行需要分析的恶意代码,同时,用户模块的进程信息设置例程调用get_process_info()函数依次进入/proc文件系统以数字命名的目录;
B2.进程信息设置例程进入每个进程目录后,分别对status文件执行read()操作,获取可执行文件名name、进程号pid、父进程号ppid、有效用户EUID、有效用户组EGID和内存映象mmaps等进程信息;
B3.将每个进程的信息存放在struct process_info结构中,并链接到链表processes_info中;
B4.进程信息设置例程调用read_process_info()函数依次从processes_info中获取每个进程的信息,并通过show_process_info()以界面形式展示给用户;
B5.用户通过用户模块提供的两个接口函数add_process_info()和del_process_info()增加和删除进程信息;
B6.用户根据用户模块展示的进程信息,指定恶意代码进程为被监控进程。
进一步,所述步骤3包括:
C1.用户模块通过通信模块的接口send_config_info()函数向监控模块发送关键文件信息和被监控进程信息;
C2.监控模块的关键文件控制例程调用proc_mkdir()和create_proc_entry(),分别在/proc文件系统建立目录key_file和其所属文件config_file;
C3.监控模块的进程信息控制例程调用proc_mkdir()和create_proc_entry(),分别在/proc文件系统建立目录process_info和其所属文件config_process;
C4.通信模块的proc通信例程,通过send_config_info()把关键文件配置信息和进程配置信息,写入到监控模块通过create_proc_entry()在/proc创建的文件中;
C5.监控模块的关键文件控制例程通过系统调用sys_open()和sys_read(),从/proc文件系统中获取由用户模块写入的关键文件设置命令及其文件信息;
C6.关键文件控制例程调用create_file_list()函数同步生成关键文件列表,利用update_file_list()函数更新关键文件列表;
C7.监控模块进程信息控制例程通过系统调用sys_open()和sys_read(),从/proc文件系统获取由用户模块写入的进程设置命令及其进程信息;
C8.进程信息控制例程调用create_process_list()函数同步生成进程信息列表,利用update_process_list()函数更新进程信息列表。
进一步,所述步骤4包括:
D1.监控模块的系统调用截获过滤例程,通过修改进程打开文件的file结构中f_op对象指针,使其不指向索引节点inode文件操作方法,而使跳转到系统调用截获过滤例程的my_operation(struct file*fp,void*buf,filldir_t filldir)函数;
D2.由my_operation()函数得到进程欲要操作文件的文件对象,并通过打印fp->f_uid和fp->f_dentry->d_name.name得到该文件的所属用户UID和文件名filename;
D3.由filter_process_list(current->pid,ppid)函数得到该系统调用所属进程的进程号pid和父进程号ppid,先以进程号pid为关键字,在进程信息列表中进行比对,如果进程信息列表中存在与之匹配的进程信息,则说明当前进程是被监视进程;如果比对不成功,再以父进程号ppid为关键字在进程信息列表中进行比对,如果比对成功,则说明该进程是用户开始设置被监控进程创建的子进程,也需要对其监控,如果比对不成功,则返回;
D4.由filter_file_list(UID,filename)函数以当前获得的文件对象所属用户UID和文件名filename为关键字,在关键文件列表中进行比对,如果关键文件列表中存在与两者匹配的关键文件,则说明当前文件是用户设置的关键文件,否则,则返回;
D5.由cmp_authority()函数对进程的有效用户EUID,有效组EGID和关键文件所属用户UID,用户组GID进行权限比对,并依据关键文件所属用户、用户组的访问权限设置,来决定对其进行拒绝或允许操作。
进一步,所述步骤5包括:
E1.如果被监控的恶意代码进程有访问关键文件的权限,则允许其访问,并将该进程信息,关键文件信息和访问操作信息通过write_log_info()函数记录在日志队列structlog_queue中;
E2.如果被监控的恶意代码进程没有访问关键文件的权限,则拒绝其访问,并将该进程信息和关键文件信息及其操作信息通过write_log_info()函数也一块记录在日志队列struct log_queue中;
E3.write_log_info()函数记录的信息包括被监控进程可执行文件名name,进程号pid,父进程ppid,有效用户EUID,有效组EGID和被操作关键文件的文件名filename,所属用户UID,用户组GID,执行命令如文件I/O操作(read,write),更改文件指针(lseek),打开/关闭/创建文件(open,close,create),等等;
E4.监控模块调用get_share_memory()在内核中获取一块共享内存,然后将该共享内存的属性,即起始地址sharememory_addr和长度sharememory_size通过proc文件系统传递给用户模块;
E5.用户模块通过读取proc文件系统获取共享内存的起始地址和长度,并通过调用mmap()映射到这块共享内存中;
E6.监控模块将日志写入该共享内存,用户模块使用read()函数从这块共享内存中读取日志信息。
进一步,所述步骤6包括:
F1.通信模块调用get_log_info()从监控模块的日志队列struct log_queue中获取日志信息;
F2.mmap通信例程将获取的日志信息通过send_log_info(),写入到监控模块通过get_share_memory()创建的共享内存中;
F3.mmap通信例程异步通知用户模块的日志处理例程来读取日志信息;
F4.日志处理例程调用read_log()从监控模块创建的共享内存中读取日志信息,经过处理后,再调用write_log()存放在日志缓冲区中;
F5.日志处理例程调用get_log()从日志缓冲区中提取日志,并通过show_log()把日志信息以界面的形式展示出来。
进一步,所述步骤6中:
G1.提供给用户进行分析的日志信息包括被监控进程的可执行文件名name,进程号pid,父进程号ppid,有效用户EUID,用户组EGID,所访问的关键文件名filename,所属用户UID,用户组GID,操作命令(read/write/create/close等命令);
G2.用户根据被监控进程对关键文件的操作记录来对恶意代码进行分析。
当然,本发明还可有其它多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。