著录项信息
专利名称 | 防御恶意软件的方法和装置 |
申请号 | CN201310685294.1 | 申请日期 | 2013-12-13 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2014-03-26 | 公开/公告号 | CN103679032A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/56 | IPC分类号 | G;0;6;F;2;1;/;5;6查看分类表>
|
申请人 | 北京奇虎科技有限公司;奇智软件(北京)有限公司 | 申请人地址 | 北京市西城区新街口外大街28号D座112室(德胜园区)
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京奇虎科技有限公司,奇智软件(北京)有限公司 | 当前权利人 | 北京奇虎科技有限公司,奇智软件(北京)有限公司 |
发明人 | 肖锐 |
代理机构 | 北京智汇东方知识产权代理事务所(普通合伙) | 代理人 | 康正德;薛峰 |
摘要
本发明提供了一种防御恶意软件的方法和装置。该方法包括:对用于修改内存的指定系统函数进行实时的检测,当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址,判断返回地址是否指向恶意软件对应的模块,当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址。本发明可以避免在浏览器进程中必需的挂钩点(例如主页锁定功能相关的挂钩点)被恶意软件或竞争对手破坏,避免被网页木马或其他类型的恶意软件绕过安全软件防护,保证主页锁定功能的正常使用,提高了浏览器的安全性,防止用户在浏览器中遭遇钓鱼网站或挂马网站。
1.一种防御恶意软件的方法,包括:
对仅用于在内存中修改数据的指定系统函数进行实时的检测;
当所述指定系统函数被调用时,读取与所述指定系统函数对应的栈中的参数,并判断所述指定系统函数对应的栈中的参数是否为预设参数,以读取与所述指定系统函数对应的栈中的返回地址;
判断所述返回地址是否指向恶意软件对应的模块;
当所述返回地址指向恶意软件对应的模块时,将所述返回地址修改为休眠函数的地址。
2.根据权利要求1所述的方法,其中,所述判断所述返回地址是否指向恶意软件对应的模块,包括:
当所述指定系统函数对应的栈中的参数为预设参数时,判断所述返回地址是否指向恶意软件对应的模块。
3.根据权利要求2所述的方法,其中,所述预设参数包括第一参数和/或第二参数;
所述第一参数为当前操作中被保护进程的进程标识;
所述第二参数为预设的挂钩过滤点的地址。
4.根据权利要求3所述的方法,其中,所述判断所述返回地址是否指向恶意软件对应的模块,包括:
枚举所述被保护进程所加载的所有模块的基址;
根据所述基址依次检测所述被保护进程所加载的所有模块中是否包含预设的恶意代码特征;
若包含预设的恶意代码特征,则所述返回地址指向恶意软件对应的模块;
若不包含预设的恶意代码特征,则所述返回地址未指向恶意软件对应的模块。
5.根据权利要求1至4任一项所述的方法,其中,所述读取与所述指定系统函数对应的栈中的返回地址,包括:
获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与所述指定系统函数对应的栈中的返回地址。
6.根据权利要求1至4任一项所述的方法,其中,所述将所述返回地址修改为预设地址,包括:
将当前的系统寄存器EIP中的地址设置为预设地址;
将所述返回地址弹栈到所述系统寄存器EIP中。
7.根据权利要求1至4任一项所述的方法,其中,在将所述返回地址修改为休眠函数的地址之后,还包括:
调用所述休眠函数。
8.根据权利要求1至4任一项所述的方法,其中,所述指定系统函数为kernel32!WriteProcessMemory。
9.一种防御恶意软件的装置,包括:
函数检测模块,配置为对仅用于在内存中修改数据的指定系统函数进行实时的检测;
地址读取模块,配置为当所述指定系统函数被调用时,读取与所述指定系统函数对应的栈中的返回地址;
第一判断模块,配置为判断所述返回地址是否指向恶意软件对应的模块;
地址修改模块,配置为当所述返回地址指向恶意软件对应的模块时,将所述返回地址修改为休眠函数的地址;
第二判断模块,配置为读取与所述指定系统函数对应的栈中的参数,并判断所述指定系统函数对应的栈中的参数是否为预设参数。
10.根据权利要求9所述的装置,其中,所述第一判断模块还配置为当所述指定系统函数对应的栈中的参数为预设参数时,判断所述返回地址是否指向恶意软件对应的模块。
11.根据权利要求10所述的装置,其中,所述预设参数包括第一参数和/或第二参数;所述第一参数为当前操作中被保护进程的进程标识;所述第二参数为预设的挂钩过滤点的地址。
12.根据权利要求11所述的装置,其中,所述第一判断模块配置为按照如下方式判断所述返回地址是否指向恶意软件对应的模块:枚举所述被保护进程所加载的所有模块的基址;根据所述基址依次检测所述被保护进程所加载的所有模块中是否包含预设的恶意代码特征;若包含预设的恶意代码特征,则所述返回地址指向恶意软件对应的模块;若不包含预设的恶意代码特征,则所述返回地址未指向恶意软件对应的模块。
13.根据权利要求9至12任一项所述的装置,其中,所述地址读取模块配置为获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与所述指定系统函数对应的栈中的返回地址。
14.根据权利要求9至12任一项所述的装置,其中,所述地址修改模块配置为按照如下方式将所述返回地址修改为预设地址:将当前的系统寄存器EIP中的地址设置为预设地址;
将所述返回地址弹栈到所述系统寄存器EIP中。
15.根据权利要求9至12任一项所述的装置,其中,所述装置还包括:函数调用模块,配置为调用所述休眠函数。
16.根据权利要求9至12任一项所述的装置,其中,所述指定系统函数为kernel32!WriteProcessMemory。
防御恶意软件的方法和装置\n技术领域\n[0001] 本发明涉及互联网技术领域,特别是涉及一种防御恶意软件的方法和装置。\n背景技术\n[0002] 浏览器首页一直是木马病毒、各大安全厂商的必争之地,主页锁定功能能保护用户的IE首页不被恶意软件、病毒木马篡改,能够提高用户体验感知。\n[0003] 目前的安全软件中,主页锁定功能主要是通过挂钩功能点函数来实现。例如网盾主要用于保护微软的IE浏览器,会在IE浏览器进程中挂钩某些功能点函数,做拦截过滤,根据特定的规则选择阻止或者放行,通过这种手段来保护IE的安全。其中,网盾产品中的“主页锁定”的功能,也是通过“挂钩系统API函数”来实现安全防护的。\n[0004] 然而很多恶意软件、流氓插件、第三方程序、竞争对手,会不择手段的干扰甚至破坏安全产品的功能点。其一般利用的技术手段为摘除安全产品对功能函数的挂钩点。\n[0005] 仍以网盾为例,恶意程序用到的技术手段是通过在IE浏览器进程中创建一个工作线程,在其中循环定时的检测XX网盾的“挂钩过滤点”,一旦发现就摘除掉,这样导致网盾不能正常接受不到系统事件,无法正常的工作,从而导致防护功能失效。\n[0006] 因此,目前的安全防护产品中存在的缺陷就是,对于功能函数的挂钩点容易被恶意软件获取并摘除,使得安全产品的监控失效,导致安全性失效。\n发明内容\n[0007] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的适于防御恶意软件的方法和相应地装置。\n[0008] 依据本发明的一个方面,提供一种防御恶意软件的方法,包括:\n[0009] 对用于在内存中修改数据的指定系统函数进行实时的检测;\n[0010] 当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址;\n[0011] 判断返回地址是否指向恶意软件对应的模块;\n[0012] 当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址。\n[0013] 可选地,在读取与指定系统函数对应的栈中的返回地址之前,还包括:\n[0014] 读取与指定系统函数对应的栈中的参数,并判断指定系统函数对应的栈中的参数是否为预设参数;\n[0015] 判断返回地址是否指向恶意软件对应的模块,包括:\n[0016] 枚举被保护进程所加载的所有模块的基址;\n[0017] 根据基址依次检测被保护进程所加载的所有模块中是否包含预设的恶意代码特征;\n[0018] 若包含预设的恶意代码特征,则返回地址指向恶意软件对应的模块;\n[0019] 若不包含预设的恶意代码特征,则返回地址未指向恶意软件对应的模块。\n[0020] 可选地,预设参数包括第一参数和/或第二参数;\n[0021] 第一参数为当前操作中被保护进程的进程标识;\n[0022] 第二参数为预设的挂钩过滤点的地址。\n[0023] 可选地,判断返回地址是否指向恶意软件对应的模块,包括:\n[0024] 枚举被保护进程所加载的所有模块的基址,依次判断返回地址所属的模块是否为恶意软件对应的模块。\n[0025] 可选地,读取与指定系统函数对应的栈中的返回地址,包括:\n[0026] 获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与指定系统函数对应的栈中的返回地址。\n[0027] 可选地,将返回地址修改为预设地址,包括:\n[0028] 将当前的系统寄存器EIP中的地址设置为预设地址;\n[0029] 将返回地址弹栈到系统寄存器EIP中。\n[0030] 可选地,在将返回地址修改为休眠函数的地址之后,还包括:\n[0031] 调用休眠函数。\n[0032] 可选地,指定系统函数为kernel32!WriteProcessMemory。\n[0033] 依据本发明的一个方面,还提供了一种防御恶意软件的装置,包括:\n[0034] 函数检测模块,配置为对用于在内存中修改数据的指定系统函数进行实时的检测;\n[0035] 地址读取模块,配置为当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址;\n[0036] 第一判断模块,配置为判断返回地址是否指向恶意软件对应的模块;\n[0037] 地址修改模块,配置为当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址。\n[0038] 可选地,该装置还包括:\n[0039] 第二判断模块,配置为读取与指定系统函数对应的栈中的参数,并判断指定系统函数对应的栈中的参数是否为预设参数;\n[0040] 第一判断模块还配置为当指定系统函数对应的栈中的参数为预设参数时,判断返回地址是否指向恶意软件对应的模块。\n[0041] 可选地,预设参数包括第一参数和/或第二参数;\n[0042] 第一参数为当前操作中被保护进程的进程标识;\n[0043] 第二参数为预设的挂钩过滤点的地址。\n[0044] 可选地,第一判断模块配置为按照如下方式判断所述返回地址是否指向恶意软件对应的模块:\n[0045] 枚举所述被保护进程所加载的所有模块的基址;\n[0046] 根据所述基址依次检测所述被保护进程所加载的所有模块中是否包含预设的恶意代码特征;\n[0047] 若包含预设的恶意代码特征,则所述返回地址指向恶意软件对应的模块;\n[0048] 若不包含预设的恶意代码特征,则所述返回地址未指向恶意软件对应的模块。\n[0049] 可选地,地址读取模块配置为获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与指定系统函数对应的栈中的返回地址。\n[0050] 可选地,地址修改模块配置为按照如下方式将返回地址修改为预设地址:\n[0051] 将当前的系统寄存器EIP中的地址设置为预设地址;\n[0052] 将返回地址弹栈到系统寄存器EIP中。\n[0053] 可选地,该装置还包括:\n[0054] 函数调用模块,配置为调用休眠函数。\n[0055] 可选地,指定系统函数为kernel32!WriteProcessMemory。\n[0056] 本发明提供了一种防御恶意软件的方法和装置,通过对用于修改内存的指定系统函数进行实时的检测,当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址,判断返回地址是否指向恶意软件对应的模块,当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址,可以避免在浏览器进程中必需的挂钩点(例如主页锁定功能相关的挂钩点)被恶意软件或竞争对手破坏,避免被网页木马或其他类型的恶意软件绕过安全软件防护,保证主页锁定功能的正常使用,提高了浏览器的安全性,防止用户在浏览器中遭遇钓鱼网站或挂马网站。\n[0057] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。\n[0058] 根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述以及其他目的、优点和特征。\n附图说明\n[0059] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:\n[0060] 图1是根据本发明一个实施例的一种防御恶意软件的方法流程图;\n[0061] 图2是根据本发明一个实施例的一种防御恶意软件的具体方法流程图;\n[0062] 图3是根据本发明一个实施例的系统栈与过程调用的示意图;\n[0063] 图4是根据本发明一个实施例的恶意程序调用kernel32!WriteProcessMemory函数时,对应的栈的结构示意图;\n[0064] 图5是根据本发明一个实施例的将返回地址中的地址修改为指定的地址B后的示意图;\n[0065] 图6是根据本发明一个实施例的一种防御恶意软件的装置结构框图。\n具体实施方式\n[0066] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应该被这里阐述的实施例所限制。相反,提供这些实施例是为了能够透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。\n[0067] 实施例一\n[0068] 为了使本发明的方法更便于理解,本申请首先对病毒和恶意软件篡改浏览器首页的过程做简要介绍。本发明中的浏览器包括:windows的IE(Internet Explorer)浏览器、\n360安全浏览器、火狐浏览器等。本申请以windows的IE (Internet Explorer)浏览器为例进行介绍。\n[0069] IE的配置(如:IE首页地址、安全级别、缓存文件存放路径等)是存储在Windows的注册表中的。在程序开发过程中,病毒、恶意软件、还有网络安全软件容易通过修改Windows的注册表来实现修改IE的首页。通常使用Windows的注册表应用程序接口函数(例如:\nRegSetValue)来指定注册表的主键、子键、修改的项以及值等信息。当检测到客户端启动IE或者点击IE工具栏的“首页”按钮时,浏览器的进程(如iexplore.exe)会调用系统的API去查询注册表中浏览器首页对应的键值,然后连接得到的键值对应的网站页面,并显示该页面。此时跳转到的网站页面可能是病毒或者恶意软件篡改后的页面。\n[0070] 但是如果不能有效的锁定首页,就有可能被恶意网页劫持,使得用户进入虚假或恶意网站,造成用户被钓鱼网站或挂马网站盗取密码、隐私信息或损失财产等。\n[0071] 本发明实施例提供了一种防御恶意软件的方法。该方法对防御恶意软件的装置进行了改进。本实施例中防御恶意软件的装置可以安装在用户客户端上,例如,客户端可以为PC(Personal Computer,个人计算机),手机,手持电脑等用户终端,防御恶意软件的装置可以是安全卫士,或其他任何类型的安全软件。\n[0072] 图1是根据本发明一个实施例的一种防御恶意软件的方法流程图,该方法包括步骤S102至S108。\n[0073] S102,对用于在内存中修改数据的指定系统函数进行实时的检测。\n[0074] S104,当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回[0075] 地址。\n[0076] S106,判断返回地址是否指向恶意软件对应的模块。\n[0077] S108,当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址。\n[0078] 本发明实施例提供了一种防御恶意软件的方法,通过对用于修改内存的指定系统函数进行实时的检测,当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址,判断返回地址是否指向恶意软件对应的模块,当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址,可以避免在浏览器进程中必需的挂钩点(例如主页锁定功能相关的挂钩点)被恶意软件或竞争对手破坏,避免被网页木马或其他类型的恶意软件绕过安全软件防护,保证主页锁定功能的正常使用,提高了浏览器的安全性,防止用户在浏览器中遭遇钓鱼网站或挂马网站。\n[0079] 实施例二\n[0080] 本实施例为上述实施例一的一种具体应用场景,通过本实施例,能够更加清楚、具体地阐述本发明所提供的方法。\n[0081] 图2是根据本发明一个实施例的一种防御恶意软件的具体方法流程图。该方法包括步骤S201至S206。\n[0082] 在本实施例中,以windows为例,以安全产品保护的程序为浏览器,对应的进程为hProcess,安全产品挂钩的功能点地址为lpBaseAddress为例。\n[0083] 而恶意程序xx.dll通过在它创建的线程中调用系统函数kernel32!\nWriteProcessMemory来摘除安全产品挂钩的功能点地址为lpBaseAddress为例进行说明。\n[0084] 在执行本实施例提供的方法时,首先通过步骤S201对用于在内存中修改数据的指定系统函数进行监测,并当指定函数被调用时,执行步骤S202。\n[0085] 具体地,该指定函数可以为kernel32!WriteProcessMemory函数。\n[0086] 需要说明的是,kernel32!WriteProcessMemory函数具有修改内存中数据的作用,恶意程序若摘除安全产品在系统中的挂钩点,则必须通过该函数对系统内存进行数据修改,因此,我们选择对该函数进行监测,可确定是否有恶意程序对安全产品的挂钩点进行摘除操作。\n[0087] S202,读取与指定系统函数对应的栈中的参数。\n[0088] 一般而言,一个由C/C++编译的程序占用的内存分为以下几个部分:\n[0089] (1)栈区(stack)——由编译器自动分配释放,存放函数的参数值,局部变量的值等。\n[0090] (2)堆区(heap)——由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。\n[0091] (3)全局区(静态区)(static)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。\n[0092] (4)文字常量区——常量字符串就是放在这里的。程序结束后由系统释放。\n[0093] (5)程序代码区——存放函数体的二进制代码。\n[0094] 而在本发明中,通过对上述“栈”进行劫持来消除恶意软件对挂钩点的摘除行为,也即对上述“栈”进行监测和修改,使其恢复到可支持安全产品正常的运行。\n[0095] “栈”在Windows下是向低地址扩展的数据结构,是一块连续的内存的区域,由系统自动分配。在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。\n[0096] 为了更加清楚地描述上述“栈”,本实施例还提供了图3,展示了系统栈与过程调用的示意图。其中,图3左侧为可执行代码,右侧为与该代码对应的栈。\n[0097] 在图3中,func_B、func_A和main函数的参数被分别存在与其对应的栈帧中,而在每个函数的参数的底部均包括有返回地址,以使得编译器在读取参数后,能够正确的返回到代码的正确位置,以正确的执行下去。\n[0098] 在本实施例中,需要获取的与指定函数对应的栈中的参数包括第一参数和第二参数。\n[0099] 在读取了与指定系统函数对应的栈中的参数之后,继续执行步骤S203,判断指定系统函数对应的栈中的参数是否为预设参数。若是,执行步骤S204,若不是,则返回步骤S201。\n[0100] 其中,在本实施例中预设参数包括第一参数和第二参数;\n[0101] 第一参数为当前操作中被保护进程的进程标识;\n[0102] 例如,在本实施例中为欲保护的程序为浏览器,则第一参数为进程hProcess。\n[0103] 第二参数为预设的挂钩过滤点的地址;\n[0104] 例如,在本实施例中,安全产品在保护浏览器时挂钩点的地址为lpBaseAddress。\n[0105] S204,读取与指定系统函数对应的栈中的返回地址。\n[0106] 可选地,步骤S204读取与指定系统函数对应的栈中的返回地址的方式包括:获取当前的EBP(Extended Base Pointer,扩展基址指针寄存器)中保存的地址,并将该地址加四得到与所述指定系统函数对应的栈中的返回地址。\n[0107] 其中,EBP中用于存放一个指针,该指针指向系统栈最上面一个栈帧的栈顶,即整个系统栈的栈顶。\n[0108] 需要说明的是,该“返回地址”指明了上层调用者,本发明可通过判断这个地址是否位于该恶意插件对应模块的内部,来判断是否有恶意软件对安全产品的挂钩点进行摘除。\n[0109] 为了更加清楚地描述栈结构,本实施例还提供了图4,展示了恶意程序调用kernel32!WriteProcessMemory函数时,对应的栈的结构示意图。\n[0110] 其中,若恶意软件摘除安全软件的挂钩点,则会在返回地址写入恶意模块的地址,使安全软件的处理过程被劫持到恶意程序。\n[0111] 在读取了与指定系统函数对应的栈中的返回地址之后,继续执行步骤S205,判断上述返回地址是否指向恶意软件对应的模块。若是,则执行步骤S206,若不是,则返回步骤S201。\n[0112] 其中,判断上述返回地址是否指向恶意软件对应的模块,具体可以采用如下方式:\n[0113] 枚举被保护进程所加载的所有模块的基址,依次判断返回地址所属的模块是否为恶意软件对应的模块。\n[0114] 例如,在本实施例中,则枚举浏览器进程所加载的全部模块,并判断返回地址所指向的模块是否为恶意软件xx.dll的地址。\n[0115] S206,将返回地址修改为休眠函数的地址。\n[0116] 在本实施例中,当发现返回地址被修改为指向恶意软件的模块时,则将返回地址修改为正确的休眠函数的地址,具体可以为:\n[0117] 将当前的EIP(Extended Instructions Pointer,指令寄存器)中的地址设置为休眠函数的地址(例如地址B);\n[0118] 将返回地址弹栈到EIP中。\n[0119] 其中,EIP中用于存放指针,指向下一条等待执行的指令地址。\n[0120] 本实施例还提供了图5,展示了将返回地址中的地址修改为指定的地址B后的示意图。\n[0121] 在本实施例中,作为一种优选的实施方式,地址B可以为kernel32!Sleep函数。\n[0122] 通过将返回地址指向休眠函数,可以使恶意软件进入休眠的状态,避免其再次对挂钩点进行摘除。\n[0123] 本发明实施例提供了一种防御恶意软件的方法,通过对用于修改内存的指定系统函数进行实时的检测,当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址,判断返回地址是否指向恶意软件对应的模块,当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址,可以避免在浏览器进程中必需的挂钩点(例如主页锁定功能相关的挂钩点)被恶意软件或竞争对手破坏,避免被网页木马或其他类型的恶意软件绕过安全软件防护,保证主页锁定功能的正常使用,提高了浏览器的安全性,防止用户在浏览器中遭遇钓鱼网站或挂马网站。\n[0124] 实施例三\n[0125] 图6是本发明一个实施例的一种防御恶意软件的装置结构框图,该装置600包括:\n[0126] 函数检测模块610,配置为对用于在内存中修改数据的指定系统函数进行实时的检测;\n[0127] 地址读取模块620,配置为当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址;\n[0128] 第一判断模块630,配置为判断返回地址是否指向恶意软件对应的模块;\n[0129] 地址修改模块640,配置为当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址。\n[0130] 可选地,该装置600还包括:\n[0131] 第二判断模块650,配置为读取与指定系统函数对应的栈中的参数,并判断指定系统函数对应的栈中的参数是否为预设参数;\n[0132] 第一判断模块630还配置为当指定系统函数对应的栈中的参数为预设参数时,判断返回地址是否指向恶意软件对应的模块。\n[0133] 可选地,预设参数包括第一参数和/或第二参数;\n[0134] 第一参数为当前操作中被保护进程的进程标识;\n[0135] 第二参数为预设的挂钩过滤点的地址。\n[0136] 可选地,第一判断模块630配置为按照如下方式判断返回地址是否指向恶意软件对应的模块:\n[0137] 枚举被保护进程所加载的所有模块的基址;\n[0138] 根据基址依次检测被保护进程所加载的所有模块中是否包含预设的恶意代码特征;\n[0139] 若包含预设的恶意代码特征,则返回地址指向恶意软件对应的模块;\n[0140] 若不包含预设的恶意代码特征,则返回地址未指向恶意软件对应的模块。\n[0141] 可选地,地址读取模块620配置为获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与指定系统函数对应的栈中的返回地址。\n[0142] 可选地,地址修改模块640配置为按照如下方式将返回地址修改为预设地址:\n[0143] 将当前的系统寄存器EIP中的地址设置为预设地址;\n[0144] 将返回地址弹栈到系统寄存器EIP中。\n[0145] 可选地,该装置600还包括:\n[0146] 函数调用模块660,配置为调用休眠函数。\n[0147] 可选地,指定系统函数为kernel32!WriteProcessMemory。\n[0148] 本发明实施例提供了一种防御恶意软件的装置,通过对用于修改内存的指定系统函数进行实时的检测,当指定系统函数被调用时,读取与指定系统函数对应的栈中的返回地址,判断返回地址是否指向恶意软件对应的模块,当返回地址指向恶意软件对应的模块时,将返回地址修改为休眠函数的地址,可以避免在浏览器进程中必需的挂钩点(例如主页锁定功能相关的挂钩点)被恶意软件或竞争对手破坏,避免被网页木马或其他类型的恶意软件绕过安全软件防护,保证主页锁定功能的正常使用,提高了浏览器的安全性,防止用户在浏览器中遭遇钓鱼网站或挂马网站。\n[0149] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。\n[0150] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。\n[0151] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。\n[0152] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。\n[0153] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的防御恶意软件的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。\n这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。\n[0154] 应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。\n[0155] 至此,本领域技术人员应认识到,虽然本文已详尽示出和描述了本发明的多个示例性实施例,但是,在不脱离本发明精神和范围的情况下,仍可根据本发明公开的内容直接确定或推导出符合本发明原理的许多其他变型或修改。因此,本发明的范围应被理解和认定为覆盖了所有这些其他变型或修改。\n[0156] 本实施例还披露了A1.一种防御恶意软件的方法,包括:对用于在内存中修改数据的指定系统函数进行实时的检测;当所述指定系统函数被调用时,读取与所述指定系统函数对应的栈中的返回地址;判断所述返回地址是否指向恶意软件对应的模块;当所述返回地址指向恶意软件对应的模块时,将所述返回地址修改为休眠函数的地址。\n[0157] A2.根据A1所述的方法,其中,在所述读取与所述指定系统函数对应的栈中的返回地址之前,还包括:读取与所述指定系统函数对应的栈中的参数,并判断所述指定系统函数对应的栈中的参数是否为预设参数;所述判断所述返回地址是否指向恶意软件对应的模块,包括:当所述指定系统函数对应的栈中的参数为预设参数时,判断所述返回地址是否指向恶意软件对应的模块。\n[0158] A3.根据A2所述的方法,其中,所述预设参数包括第一参数和/或第二参数;所述第一参数为当前操作中被保护进程的进程标识;所述第二参数为预设的挂钩过滤点的地址。\n[0159] A4.根据A3所述的方法,其中,所述判断所述返回地址是否指向恶意软件对应的模块,包括:枚举所述被保护进程所加载的所有模块的基址;根据所述基址依次检测所述被保护进程所加载的所有模块中是否包含预设的恶意代码特征;若包含预设的恶意代码特征,则所述返回地址指向恶意软件对应的模块;若不包含预设的恶意代码特征,则所述返回地址未指向恶意软件对应的模块。\n[0160] A5.根据A1至A4任一项所述的方法,其中,所述读取与所述指定系统函数对应的栈中的返回地址,包括:获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与所述指定系统函数对应的栈中的返回地址。\n[0161] A6.根据A1至A5任一项所述的方法,其中,所述将所述返回地址修改为预设地址,包括:将当前的系统寄存器EIP中的地址设置为预设地址;将所述返回地址弹栈到所述系统寄存器EIP中。\n[0162] A7.根据A1至A6任一项所述的方法,其中,在将所述返回地址修改为休眠函数的地址之后,还包括:调用所述休眠函数。\n[0163] A8.根据A1至A7任一项所述的方法,其中,所述指定系统函数为kernel32!WriteProcessMemory。\n[0164] 本实施例还披露了B9.一种防御恶意软件的装置,包括:函数检测模块,配置为对用于在内存中修改数据的指定系统函数进行实时的检测;地址读取模块,配置为当所述指定系统函数被调用时,读取与所述指定系统函数对应的栈中的返回地址;第一判断模块,配置为判断所述返回地址是否指向恶意软件对应的模块;地址修改模块,配置为当所述返回地址指向恶意软件对应的模块时,将所述返回地址修改为休眠函数的地址。\n[0165] B10.根据B9所述的装置,其中,所述装置还包括:第二判断模块,配置为读取与所述指定系统函数对应的栈中的参数,并判断所述指定系统函数对应的栈中的参数是否为预设参数;所述第一判断模块还配置为当所述指定系统函数对应的栈中的参数为预设参数时,判断所述返回地址是否指向恶意软件对应的模块。\n[0166] B11.根据B10所述的装置,其中,所述预设参数包括第一参数和/或第二参数;所述第一参数为当前操作中被保护进程的进程标识;所述第二参数为预设的挂钩过滤点的地址。\n[0167] B12.根据B11所述的装置,其中,所述第一判断模块配置为按照如下方式判断所述返回地址是否指向恶意软件对应的模块:枚举所述被保护进程所加载的所有模块的基址;\n根据所述基址依次检测所述被保护进程所加载的所有模块中是否包含预设的恶意代码特征;若包含预设的恶意代码特征,则所述返回地址指向恶意软件对应的模块;若不包含预设的恶意代码特征,则所述返回地址未指向恶意软件对应的模块。\n[0168] B13.根据B9至B12任一项所述的装置,其中,所述地址读取模块配置为获取当前的扩展基址指针寄存器EBP中保存的地址,并将该地址增加预设数值后得到与所述指定系统函数对应的栈中的返回地址。\n[0169] B14.根据B9至B13任一项所述的装置,其中,所述地址修改模块配置为按照如下方式将所述返回地址修改为预设地址:将当前的系统寄存器EIP中的地址设置为预设地址;将所述返回地址弹栈到所述系统寄存器EIP中。\n[0170] B15.根据B9至B14任一项所述的装置,其中,所述装置还包括:函数调用模块,配置为调用所述休眠函数。\n[0171] B16.根据B9至B15任一项所述的装置,其中,所述指定系统函数为kernel32!WriteProcessMemory。
法律信息
- 2022-07-26
专利权的转移
登记生效日: 2022.07.14
专利权人由北京奇虎科技有限公司变更为北京奇虎科技有限公司
地址由100088 北京市西城区新街口外大街28号D座112室(德胜园区)变更为100015 北京市朝阳区酒仙桥路6号院2号楼1至19层104号内8层801
专利权人由奇智软件(北京)有限公司 变更为空
- 2017-05-17
- 2014-04-23
实质审查的生效
IPC(主分类): G06F 21/56
专利申请号: 201310685294.1
申请日: 2013.12.13
- 2014-03-26
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2009-04-15
|
2008-10-22
| | |
2
| |
2012-10-17
|
2012-06-27
| | |
3
| |
2007-06-20
|
2006-07-21
| | |
4
| |
2013-02-13
|
2012-10-14
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |