著录项信息
专利名称 | 一种Linux平台下的恶意代码分析方法及系统 |
申请号 | CN201310123502.9 | 申请日期 | 2013-04-10 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2014-10-15 | 公开/公告号 | CN104102878A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/56 | IPC分类号 | G;0;6;F;2;1;/;5;6查看分类表>
|
申请人 | 中国科学院计算技术研究所 | 申请人地址 | 北京市海淀区中关村科学院南路6号
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 中国科学院计算技术研究所 | 当前权利人 | 中国科学院计算技术研究所 |
发明人 | 何振学;田昕晖;孙毓忠 |
代理机构 | 北京律诚同业知识产权代理有限公司 | 代理人 | 祁建国;梁挥 |
摘要
本发明提供一种Linux平台下的恶意代码分析方法及系统,利用LKM技术可实现动态加载,截获系统调用的位置位于VFS层和具体文件系统之间,以获取更多与文件操作相关的信息,提供更加准确有用的监控信息;系统调用的截获不需要修改系统调用表,以避免传统修改系统调用表方法所带来的安全隐患;采用共享内存机制以提高内核模块和用户进程的通信速度,以及通信传输的数据量;由用户选定需要监控的关键文件以及进程,以提高系统的易用性、灵活性和高效性,更好的满足用户对恶意代码分析的要求;选取恶意代码进程和多个重要的关键文件进行监控,以避免系统较大的性能损失,提高分析系统运行的速度。
1.一种Linux平台下的恶意代码分析方法,其特征在于,包括:
步骤1,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID、文件访问权限;
步骤2,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;
步骤3,将所述关键文件信息和被监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述被监控进程信息同步生成关键文件列表和监控进程信息列表;
步骤4,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;
步骤5,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;
步骤6,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示;
其中所述步骤6包括:
步骤61,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;
步骤62,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。
2.如权利要求1所述的Linux平台下的恶意代码分析方法,其特征在于,所述步骤2包括:
步骤21,依次进入/proc文件系统以数字命名的目录,分别对所述目录中status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;
步骤22,将所述进程信息存放在struct process_info结构中,并将其链接 到链表中;
步骤23,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;
步骤24,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。
3.如权利要求1所述的Linux平台下的恶意代码分析方法,其特征在于,所述步骤4包括:
步骤41,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;
步骤42,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,执行步骤43,如果比对不成功,不做任何处理,继续执行下层具体文件系统处理函数;filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,执行步骤43,否则,不做任何处理,继续执行下层具体文件系统处理函数;
步骤43,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。
4.如权利要求1所述的Linux平台下的恶意代码分析方法,其特征在于,所述步骤6中:
所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件文件名,文件所属用户UID,用户组GID,和操作命令。
5.一种Linux平台下的恶意代码分析系统,其特征在于,包括:
预处理模块,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID、文件访问权限;
恶意代码加载模块,加载并执行需要分析的恶意代码,同时根据界面展示 的内容设置需要被监控进程;
同步生成模块,将所述关键文件信息和所述监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和监控进程信息列表;
监控处理模块,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;
记录保存模块,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;
传递展示模块,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示;
其中所述传递展示模块包括:
写入处理模块,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;
异步处理模块,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。
6.如权利要求5所述的Linux平台下的恶意代码分析系统,其特征在于,所述恶意代码加载模块包括:
操作处理模块,依次进入/proc文件系统以数字命名的目录,分别对所述目录中status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;
链接处理模块,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;
获取展示模块,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;
指定处理模块,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。
7.如权利要求5所述的Linux平台下的恶意代码分析系统,其特征在于,所述监控处理模块包括:
截获处理模块,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;
比对处理模块,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,进入执行模块,如果比对不成功,不做任何处理,继续执行下层具体文件系统处理函数;filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件信息的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,进入执行模块,否则,不做任何处理,继续执行下层具体文件系统处理函数;
执行模块,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。
8.如权利要求5所述的Linux平台下的恶意代码分析系统,其特征在于,所述传递展示模块中:
所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。
一种Linux平台下的恶意代码分析方法及系统\n技术领域\n[0001] 本发明涉及Linux平台下的恶意代码分析领域,尤其涉及一种Linux平台下的恶意代码分析方法及系统。\n背景技术\n[0002] 互联网在给人们的生活带来便利和高效的同时,安全威胁事件逐年上升。网络上大量的病毒和木马对人们的财产,社会生产安全和国家信息安全造成了严重的危害。在各种危害之中,其中可执行恶意代码造成的损失和危害尤为突出。恶意代码的盛行,唤醒了人们的安全意识,促使人们从各个方面对恶意代码进行研究。随着恶意代码的不断发展进步,各种各样的恶意代码呈出不穷、变幻莫测,传统的恶意代码调试器调试检测方法和样本分析技术早已不能适应新型恶意代码的分析。由此可知,开发有针对性和高效性的恶意代码分析平台已迫在眉睫。\n[0003] 恶意代码分析是恶意代码应急响应和计算机取证的基础,通过对恶意代码行为,功能分析,可以为损失评估和系统恢复提供有用的信息。其中基于系统调用行为监控的恶意代码分析认为:不管攻击者来自何方,用何种行为,对目标系统所实施的入侵、控制或破坏,最终都要借助于目标系统的系统调用来执行。Linux和UNIX系统设计的哲学之一是“一切皆是文件”,恶意代码对目标系统进行的各种恶意行为操作最终都可以归结为对文件的操作。恶意代码执行过程中所调用的系统调用和最终所要操作的文件与恶意代码攻击行为和功能有着直接的联系。因此,对恶意代码所调用的系统调用进行截获,监控恶意代码进程对文件的操作,就可以达到恶意代码分析的目的。\n[0004] 现有的基于Linux的恶意代码分析方法中,所涉及的系统调用截获技术,传统上都是利用中断向量表获得中断处理例程的地址,再在中断服务例程的内存地址中搜索特征指令获取系统调用表的地址。或是通过读取dev/kmem,System.map,kallsyms来得到系统调用表的地址。然后将系统调用表中需要截获的系统调用服务例程入口地址保存,再将原来系统调用服务例程入口地址修改成自定义处理函数的地址,使其跳转到监控程序。基于传统系统调用截获技术的恶意代码分析方法存在以下一些问题:\n[0005] (1)Linux2.6以后版本的内核,基于安全考虑,系统调用表不再作为符号导出,需通过查找特征指令的方式来获得。此方法的前提是应用程序请求需通过INT 0x80指令陷入内核,但对于SYSENTER或SYSCALL指令,该方法就会失效。\n[0006] (2)对于通过读/dev/kmem设备文件得到系统调用表的地址,来实现系统调用截获的方法,存在着潜在的安全隐患。\n[0007] (3)传统的恶意代码分析方法所涉及的系统调用的截获是处于系统调用层,位于VFS层之上,不能得到更多更具体的与恶意代码相关的信息。\n[0008] (4)修改系统调用表会造成安全隐患,在多线程的环境下健壮性不好。\n发明内容\n[0009] 为解决上述问题,本发明提供了一种Linux平台下的恶意代码分析方法及系统,以避免传统修改系统调用表方法所带来的安全隐患,避免系统较大的性能损失,提供更加准确有用的监控信息,提高通信传输的数据量以及系统的易用性、灵活性和高效性,更好的满足用户对恶意代码分析的要求。\n[0010] 为实现上述发明目的,本发明提供了一种Linux平台下的恶意代码分析方法,该方法包括:\n[0011] 步骤1,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户、用户组,文件访问权限;\n[0012] 步骤2,加载并执行需要分析的恶意代码,同时根据界面展示的进程信息设置需要被监控进程;\n[0013] 步骤3,将所述关键文件信息和被监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和被监控进程信息列表;\n[0014] 步骤4,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;\n[0015] 步骤5,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;\n[0016] 步骤6,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。\n[0017] 进一步的,所述步骤2包括:\n[0018] 步骤21,依次进入/proc文件系统以数字命名的目录,分别对所述目录中的status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;\n[0019] 步骤22,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;\n[0020] 步骤23,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;\n[0021] 步骤24,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。\n[0022] 进一步的,所述步骤4包括:\n[0023] 步骤41,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;\n[0024] 步骤42,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,执行步骤43,如果比对不成功,则不做任何处理,继续执行下层具体文件系统处理函数;\n[0025] filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,执行步骤43,否则不做任何处理,继续执行下层具体文件系统处理函数;\n[0026] 步骤43,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。\n[0027] 进一步的,所述步骤6包括:\n[0028] 步骤61,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;\n[0029] 步骤62,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。\n[0030] 其中,所述步骤6中:\n[0031] 所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。\n[0032] 为实现上述发明目的,本发明还提供一种Linux平台下的恶意代码分析处理系统,该系统包括:\n[0033] 预处理模块,设置需要监控的关键文件信息及访问权限,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID,文件访问权限;\n[0034] 恶意代码加载模块,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;\n[0035] 同步生成模块,将所述关键文件信息和监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和被监控进程信息列表;\n[0036] 监控处理模块,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;\n[0037] 记录保存模块,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;\n[0038] 传递展示模块,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。\n[0039] 进一步的,所述恶意代码加载模块包括:\n[0040] 操作处理模块,依次进入/proc文件系统以数字命名的目录,分别对所述目录中的status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;\n[0041] 链接处理模块,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;\n[0042] 获取展示模块,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;\n[0043] 指定处理模块,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。\n[0044] 进一步的,所述监控处理模块包括:\n[0045] 截获处理模块,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;\n[0046] 比对处理模块,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,进入执行模块,如果比对不成功,则不做任何处理,继续执行下层具体文件系统处理函数;\n[0047] filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,进入执行模块,否则不做任何处理,继续执行下层具体文件系统处理函数;\n[0048] 执行模块,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。\n[0049] 进一步的,所述传递展示模块包括:\n[0050] 写入处理模块,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;\n[0051] 异步处理模块,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。\n[0052] 其中,所述传递展示模块中:\n[0053] 所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。\n[0054] 本发明的有益功效在于:\n[0055] (1)利用LKM技术可实现动态加载,截获系统调用的位置位于VFS层和具体文件系统之间,可以获取更多与文件操作相关的信息,提供更加准确有用的监控信息。\n[0056] (2)系统调用截获不需要修改系统调用表,由此可以避免传统修改系统调用表方法所带来的安全隐患。\n[0057] (3)通过在内核中申请一块共享内存,将监控模块获得的日志信息传递给用户空间。采用共享内存机制既提高了内核模块和用户进程的通信速度,又提高了通信传输的数据量。\n[0058] (4)由用户选定需要监控的关键文件以及进程,大大提高了系统的易用性、灵活性和高效性,更好的满足用户对恶意代码分析的要求。\n[0059] (5)选取恶意代码进程和多个重要的关键文件进行监控,避免了系统较大的性能损失,提高了分析系统运行的速度。\n[0060] 以下结合附图和具体实施例对本发明进行详细描述,但不作为对本发明的限定。\n附图说明\n[0061] 图1是本发明的Linux平台下的恶意代码分析方法流程图;\n[0062] 图2是本发明的Linux平台下的恶意代码分析系统示意图;\n[0063] 图3是本发明的一实施例的Linux平台下的恶意代码分析系统架构图。\n具体实施方式\n[0064] 图1是本发明的Linux平台下的恶意代码分析方法流程图。如图1所示,该方法包括:\n[0065] 步骤1,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID,文件访问权限;\n[0066] 步骤2,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;\n[0067] 步骤3,将所述关键文件信息和监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和监控进程信息列表;\n[0068] 步骤4,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;\n[0069] 步骤5,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;\n[0070] 步骤6,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。\n[0071] 进一步的,所述步骤2包括:\n[0072] 步骤21,依次进入/proc文件系统以数字命名的目录,分别对所述目录中status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;\n[0073] 步骤22,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;\n[0074] 步骤23,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;\n[0075] 步骤24,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。\n[0076] 进一步的,所述步骤4包括:\n[0077] 步骤41,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;\n[0078] 步骤42,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,执行步骤43,如果比对不成功,则返回,即如果比对不成功,则不对该系统调用做任何处理,使其继续执行下层具体文件系统处理函数;\n[0079] filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,执行步骤43,否则,则返回,即如果比对不成功的话,则说明所要操作的文件不是用户设置的关键文件,则不对该系统调用做任何处理,使其继续去执行下层具体文件系统处理函数;\n[0080] 步骤43,对所述被监控进程和所述关键文件进行权限比对,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。\n[0081] 进一步的,所述步骤6包括:\n[0082] 步骤61,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;\n[0083] 步骤62,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。\n[0084] 其中,所述步骤6中:\n[0085] 所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。\n[0086] 图2是本发明的Linux平台下的恶意代码分析系统示意图。如图2所示,该系统包括:\n[0087] 预处理模块100,设置需要监控的关键文件信息,并将其以界面形式展示,其中所述关键文件信息包括:文件名、文件所属用户UID、用户组GID,文件访问权限;\n[0088] 恶意代码加载模块200,加载并执行需要分析的恶意代码,同时根据界面展示的内容设置需要被监控进程;\n[0089] 同步生成模块300,将所述关键文件信息和监控进程信息传递给内核空间的监控模块,所述监控模块根据所述关键文件信息和所述监控进程信息同步生成关键文件列表和监控进程信息列表;\n[0090] 监控处理模块400,所述监控模块实时监控所述被监控进程对关键文件的访问,并依据所述关键文件和所述被监控进程的访问权限,拒绝或允许所述被监控进程对关键文件的操作;\n[0091] 记录保存模块500,所述监控模块记录所述被监控进程对关键文件的操作,并将被监控进程对关键文件的操作信息保存到日志队列中;\n[0092] 传递展示模块600,将所述日志队列中的日志信息传递给用户模块的日志处理例程,并以界面的形式将所述日志信息展示。\n[0093] 进一步的,所述恶意代码加载模块200包括:\n[0094] 操作处理模块,依次进入/proc文件系统以数字命名的目录,分别对各目录中status文件执行read()操作,获取进程信息,该进程信息包括:可执行文件名、进程号、父进程号、有效用户EUID、有效组EGID和内存映象;\n[0095] 链接处理模块,将所述进程信息存放在struct process_info结构中,并将其链接到链表中;\n[0096] 获取展示模块,依次从所述链表中获取所述进程信息,并以界面方式展示给用户;\n[0097] 指定处理模块,所述用户根据展示的进程信息指定恶意代码进程为被监控进程。\n[0098] 进一步的,所述监控处理模块400包括:\n[0099] 截获处理模块,所述监控模块截获从VFS层传递下来的系统调用,通过修改VFS函数跳转表指向自定义的截获函数,获得上层系统调用所要操作的文件对象;\n[0100] 比对处理模块,filter_process_hash()函数获取该系统调用所属进程的进程号和父进程号,以所述进程号为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,则说明当前进程是被监控进程;如果比对不成功,以父进程号作为关键字,在所述监控进程信息列表中依次进行比对,如果比对成功,说明当前进程是被监控进程,进入执行模块,如果比对不成功,则返回,即如果比对不成功,则不对该系统调用做任何处理,使其继续执行下层具体文件系统处理函数;\n[0101] filter_file_hash()函数截获将要被操作的文件对象,通过文件对象获得关键文件的文件名和文件所属用户UID,并以所述文件名和文件所属用户UID为关键字,在所述关键文件列表中依次进行比对,如果两者都比对成功,则说明当前文件是被监控的关键文件,进入执行模块,否则,则返回,即如果比对不成功的话,则说明所要操作的文件不是用户设置的关键文件,则不对该系统调用做任何处理,使其继续去执行下层具体文件系统处理函数;\n[0102] 执行模块,对所述被监控进程和所述关键文件进行权限对比,并根据比对结果拒绝或允许所述被监控进程对关键文件的操作。\n[0103] 进一步的,所述传递展示模块600包括:\n[0104] 写入处理模块,从所述日志队列中获取日志信息,并将获取的日志信息写入到所述监控模块创建的共享内存中;\n[0105] 异步处理模块,异步通知所述日志处理例程,所述日志处理例程读取日志信息,经过处理之后,将其存放在日志缓冲区,并以界面的形式将所述日志缓冲区中的日志信息展示给用户。\n[0106] 其中,所述传递展示模块600中:\n[0107] 所述日志信息包括被监控进程的可执行文件名,进程号,父进程号,有效用户EUID,有效组EGID,以及操作的关键文件的文件名,文件所属用户UID,用户组GID,和操作命令。\n[0108] 图3是本发明的一实施例的Linux平台下的恶意代码分析系统架构图。结合图3列举本发明的Linux平台下的恶意代码分析方法一实施例。该实施例的Linux平台下的恶意代码处理方法包括:\n[0109] 步骤1,用户通过用户模块设置关键文件信息;\n[0110] 步骤2,用户模块提交执行代码例程加载并执行需要分析的恶意代码,同时用户通过用户模块设置需要被监控的进程;\n[0111] 步骤3,通信模块的proc通信例程将用户模块设置的关键文件信息和被监控进程信息传递给监控模块;\n[0112] 步骤4,监控模块实时监控进程对关键文件的访问,并依据访问该关键文件进程的有效用户EUID、有效组EGID以及该关键文件所属用户UID,用户组GID,和关键文件所属用户、用户组访问权限的设定,来拒绝或允许被监控进程对关键文件的操作;\n[0113] 步骤5,监控模块记录被监控进程对关键文件的访问操作,并将被监控进程信息,关键文件信息及其操作信息通过write_log_info()记录到日志中;\n[0114] 步骤6,将监控模块得到的日志信息通过通信模块的mmap通信例程传递给用户模块。\n[0115] 进一步,所述步骤1包括:\n[0116] A1.用户提供需要监控的关键文件信息,包括文件名filename,文件所属用户UID、用户组GID,文件访问权限等属性,并针对系统中的不同用户设置不同的访问权限;\n[0117] A2.用户通过用户模块提供的两个接口函数add_keyfile()和del_keyfile()来增加和删除关键文件信息;\n[0118] A3.用户模块的关键文件设置例程通过show_keyfile()函数把关键文件信息以界面方式展示给用户。\n[0119] 进一步,所述步骤2包括:\n[0120] B1.用户模块的提交执行代码例程调用load_execute()函数从指定路径下加载并执行需要分析的恶意代码,同时,用户模块的进程信息设置例程调用get_process_info()函数依次进入/proc文件系统以数字命名的目录;\n[0121] B2.进程信息设置例程进入每个进程目录后,分别对status文件执行read()操作,获取可执行文件名name、进程号pid、父进程号ppid、有效用户EUID、有效用户组EGID和内存映象mmaps等进程信息;\n[0122] B3.将每个进程的信息存放在struct process_info结构中,并链接到链表processes_info中;\n[0123] B4.进程信息设置例程调用read_process_info()函数依次从processes_info中获取每个进程的信息,并通过show_process_info()以界面形式展示给用户;\n[0124] B5.用户通过用户模块提供的两个接口函数add_process_info()和del_process_info()增加和删除进程信息;\n[0125] B6.用户根据用户模块展示的进程信息,指定恶意代码进程为被监控进程。\n[0126] 进一步,所述步骤3包括:\n[0127] C1.用户模块通过通信模块的接口send_config_info()函数向监控模块发送关键文件信息和被监控进程信息;\n[0128] C2.监控模块的关键文件控制例程调用proc_mkdir()和create_proc_entry(),分别在/proc文件系统建立目录key_file和其所属文件config_file;\n[0129] C3.监控模块的进程信息控制例程调用proc_mkdir()和create_proc_entry(),分别在/proc文件系统建立目录process_info和其所属文件config_process;\n[0130] C4.通信模块的proc通信例程,通过send_config_info()把关键文件配置信息和进程配置信息,写入到监控模块通过create_proc_entry()在/proc创建的文件中;\n[0131] C5.监控模块的关键文件控制例程通过系统调用sys_open()和sys_read(),从/proc文件系统中获取由用户模块写入的关键文件设置命令及其文件信息;\n[0132] C6.关键文件控制例程调用create_file_list()函数同步生成关键文件列表,利用update_file_list()函数更新关键文件列表;\n[0133] C7.监控模块进程信息控制例程通过系统调用sys_open()和sys_read(),从/proc文件系统获取由用户模块写入的进程设置命令及其进程信息;\n[0134] C8.进程信息控制例程调用create_process_list()函数同步生成进程信息列表,利用update_process_list()函数更新进程信息列表。\n[0135] 进一步,所述步骤4包括:\n[0136] D1.监控模块的系统调用截获过滤例程,通过修改进程打开文件的file结构中f_op对象指针,使其不指向索引节点inode文件操作方法,而使跳转到系统调用截获过滤例程的my_operation(struct file*fp,void*buf,filldir_t filldir)函数;\n[0137] D2.由my_operation()函数得到进程欲要操作文件的文件对象,并通过打印fp->f_uid和fp->f_dentry->d_name.name得到该文件的所属用户UID和文件名filename;\n[0138] D3.由filter_process_list(current->pid,ppid)函数得到该系统调用所属进程的进程号pid和父进程号ppid,先以进程号pid为关键字,在进程信息列表中进行比对,如果进程信息列表中存在与之匹配的进程信息,则说明当前进程是被监视进程;如果比对不成功,再以父进程号ppid为关键字在进程信息列表中进行比对,如果比对成功,则说明该进程是用户开始设置被监控进程创建的子进程,也需要对其监控,如果比对不成功,则返回;\n[0139] D4.由filter_file_list(UID,filename)函数以当前获得的文件对象所属用户UID和文件名filename为关键字,在关键文件列表中进行比对,如果关键文件列表中存在与两者匹配的关键文件,则说明当前文件是用户设置的关键文件,否则,则返回;\n[0140] D5.由cmp_authority()函数对进程的有效用户EUID,有效组EGID和关键文件所属用户UID,用户组GID进行权限比对,并依据关键文件所属用户、用户组的访问权限设置,来决定对其进行拒绝或允许操作。\n[0141] 进一步,所述步骤5包括:\n[0142] E1.如果被监控的恶意代码进程有访问关键文件的权限,则允许其访问,并将该进程信息,关键文件信息和访问操作信息通过write_log_info()函数记录在日志队列struct log_queue中;\n[0143] E2.如果被监控的恶意代码进程没有访问关键文件的权限,则拒绝其访问,并将该进程信息和关键文件信息及其操作信息通过write_log_info()函数也一块记录在日志队列struct log_queue中;\n[0144] E3.write_log_info()函数记录的信息包括被监控进程可执行文件名name,进程号pid,父进程ppid,有效用户EUID,有效组EGID和被操作关键文件的文件名filename,所属用户UID,用户组GID,执行命令如文件I/O操作(read,write),更改文件指针(lseek),打开/关闭/创建文件(open,close,create),等等;\n[0145] E4.监控模块调用get_share_memory()在内核中获取一块共享内存,然后将该共享内存的属性,即起始地址sharememory_addr和长度sharememory_size通过proc文件系统传递给用户模块;\n[0146] E5.用户模块通过读取proc文件系统获取共享内存的起始地址和长度,并通过调用mmap()映射到这块共享内存中;\n[0147] E6.监控模块将日志写入该共享内存,用户模块使用read()函数从这块共享内存中读取日志信息。\n[0148] 进一步,所述步骤6包括:\n[0149] F1.通信模块调用get_log_info()从监控模块的日志队列struct log_queue中获取日志信息;\n[0150] F2.mmap通信例程将获取的日志信息通过send_log_info(),写入到监控模块通过get_share_memory()创建的共享内存中;\n[0151] F3.mmap通信例程异步通知用户模块的日志处理例程来读取日志信息;\n[0152] F4.日志处理例程调用read_log()从监控模块创建的共享内存中读取日志信息,经过处理后,再调用write_log()存放在日志缓冲区中;\n[0153] F5.日志处理例程调用get_log()从日志缓冲区中提取日志,并通过show_log()把日志信息以界面的形式展示出来。\n[0154] 进一步,所述步骤6中:\n[0155] G1.提供给用户进行分析的日志信息包括被监控进程的可执行文件名name,进程号pid,父进程号ppid,有效用户EUID,用户组EGID,所访问的关键文件名filename,所属用户UID,用户组GID,操作命令(read/write/create/close等命令);\n[0156] G2.用户根据被监控进程对关键文件的操作记录来对恶意代码进行分析。\n[0157] 当然,本发明还可有其它多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
法律信息
- 2017-02-08
- 2014-11-12
实质审查的生效
IPC(主分类): G06F 21/56
专利申请号: 201310123502.9
申请日: 2013.04.10
- 2014-10-15
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2013-03-20
|
2012-11-21
| | |
2
| |
2011-08-03
|
2011-02-28
| | |
3
| |
2012-06-27
|
2011-11-24
| | |
4
| |
2012-07-04
|
2011-12-26
| | |
5
| |
2011-03-30
|
2010-10-27
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |