一种防止程序被修改的方法及其装置、系统与流程

文档序号:11920254阅读:377来源:国知局
一种防止程序被修改的方法及其装置、系统与流程

本发明涉及信息处理技术,尤其涉及一种防止程序被修改的方法及其装置、系统。



背景技术:

钩子(HOOK)是一种特殊的消息处理机制,HOOK可以监视系统或进程中的各种事件,并截获发往目标窗口的消息进行处理。在实际应用中,可以在系统中安装自定义的钩子,以此来监视系统中特定事件的发生,完成特定的功能,比如截获键盘,鼠标的输入,屏幕取词,日志监视等等。目前HOOK技术也已广泛应用在客户端产品中,但是,如何防止恶意程序通过HOOK技术更改正常的程序的执行流程,保护自身程序的执行流程不被修改,是客户端软件尤其是安全类软件一直致力于解决的问题。



技术实现要素:

为解决现有存在的技术问题,本发明实施例提供了一种防止程序被修改的方法及其装置、系统,能至少解决现有技术中存在的上述问题。

本发明实施例的技术方案是这样实现的:

本发明实施例第一方面提供了一种防止程序被修改的方法,所述方法包括:

获取终端加载的可执行程序,并获取所述可执行程序的加载位置;所述加载位置能够表征基于所述可执行程序加载于终端内存中的加载起始地址与加载终止地址所形成的加载地址区间;

检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程;

从所述目标进程中读取所述加载地址区间对应的第一字节码,并检测出所述第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,以防止所述可执行程序的原始字节码被修改。

本发明实施例第二方面提供了一种防止程序被修改的装置,所述装置包括:

第一获取单元,用于获取终端加载的可执行程序,并获取所述可执行程序的加载位置;所述加载位置能够表征基于所述可执行程序加载于终端内存中的加载起始地址与加载终止地址所形成的加载地址区间;

第二获取单元,用于检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程;

处理单元,用于从所述目标进程中读取所述加载地址区间对应的第一字节码,并检测出所述第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,以防止所述可执行程序的原始字节码被修改。

本发明实施例第三方面提供了一种防止程序被修改的系统,所述系统包括终端和服务器;其中,

所述终端,用于加载可执行程序,并在终端内存中运行所述可执行程序;检测得到所述可执行程序的加载位置;所述加载位置能够表征基于所述可执行程序加载于终端内存中的加载起始地址与加载终止地址所形成的加载地址区间;还用于检测到所述加载地址区间对应的终端内存的内存属性修改为第一属性时,获取所述可执行程序所处的目标进程,从所述目标进程中读取所述加载地址区间对应的第一字节码,并发送所述第一字节码;

所述服务器,用于检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取到所述第一字节码,并检测出所述第一字节码与所述可执行程序的原始字节码不相同时,控制所述终端将所述第一字节码替换为所述原始字节码,以防止所述可执行程序的原始字节码被修改。

本发明实施例所述的防止程序被修改的方法及其装置、系统,通过获取终端加载的可执行程序,并获取所述可执行程序的加载地址区间,检测到加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程,从所述目标进程中读取所述加载地址区间对应的第一字节码,进而将所述第一字节码与原始字节码进行比对,在比对出第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,还原可执行程序,实现防止所述可执行程序的原始字节码被HOOK的目的,有效拦截了恶意软件对可执行程序进行修改的行为,如恶意软件通过注入浏览器HOOK关键函数抢夺主页的行为,因此,利用本发明实施例所述的方法能够大幅提升浏览器主页的锁定对抗率,同时,提升了用户体验,避免了应用程序由于被HOOK而定向到其他应用的问题。

附图说明

图1为本发明实施例一防止程序被修改的方法的实现流程示意图;

图2为本发明实施例一防止程序被修改的方法的具体应用的实现流程示意图一;

图3为本发明实施例一防止程序被修改的方法的具体应用的实现流程示意图二;

图4为本发明实施例防止程序被修改的装置的组成结构示意图;

图5为本发明实施例防止程序被修改的装置的硬件组成结构示意图;

图6为本发明实施例防止程序被修改的系统的组成结构示意图;

图7为本发明实施例防止程序被修改的系统的应用场景示意图;

图8为本发明实施例防止程序被修改的方法中服务器与终端的交互示意图;

图9为本发明实施例防止程序被修改的方法中服务器与终端在具体应用中的交互示意图一;

图10为本发明实施例防止程序被修改的方法中服务器与终端在具体应用中的交互示意图二。

具体实施方式

目前防止HOOK主流的方案有两种,第一种,基于函数完整性校验代码来防HOOK的方法;例如,针对导出函数的代码进行代码的校验值记录,随后,对导出函数进行扫描,并进行校验值的匹配,进而在检测到校验值发生变化时,回写,以此保护自身程序的执行流程不被修改。第二种,基于关键代码位置的代码防篡改方法,例如,在进程初始化早期通过挂钩系统函数或者使用内核异步过程调用(APC,asynchronous procedure call)的方法对指定位置的代码进行校验,进而基于校验结果确定是否进行代码恢复,以此保护自身程序的执行流程不被修改。

但是,现有上述两种方法中均存在缺点,具体地,基于函数完整性校验代码来防HOOK的方法,虽然可以防止部分函数被HOOK,但是有一定的局限性,如,该方法只能针对导出函数进行保护,对未导出函数的HOOK无能为力;而且,该方法需要记录导出函数的整体代码和校验值,并不停的去校验,对程序的执行效率消耗较大。而基于关键代码位置的代码防篡改方法,虽然执行效率较高,但是由于时机较早,对于后续的函数挂钩操作不能起到保护作用;同时由于是基于关键代码校验的方式,对于除关键代码以外的部分也不能起到保护作用。

为解决上述问题,本发明实施例提供了一种在windows操作系统上防止代码被HOOK的方法,涉及所有的PC客户端应用程序。具体地,本发明实施例在内核层部署代码修改监控例程和模块加载监控例程;在应用层收集需要保护的进程和动态链接库(DLL,Dynamic Link Library)文件列表,并将需要保护的保护DLL文件列表通知驱动层,进而使驱动层利用LoadImage机制,记录需保护的程序的内存地址空间范围,并存放到指定链表ProtectList;NtProtectVirtualMemory处理例程中对需要保护的,也即易被挂钩的内存地址及对应的原始字节码进行记录,并与原始字节码运行的进程信息一同保存到ByteList;进而启动守护线程,定时遍历ByteList中各节点的内容,将各节点对应的内存地址处的代码与原始字节码进行比对,以便于基于比对结果确定是否回写,进而确保保护的代码不被修改。为了能够更加详尽地了解本发明的特点与技术内容,下面结合附图对本发明的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本发明。

实施例一

本实施例提供了一种防止程序被修改的方法;这里,在实际应用中,安全类的客户端软件,经常会受到恶意程序和竞品的技术对抗,其常用的攻防技术就是针对应用程序编程接口(API,Application Programming Interface)的HOOK,简称APIHOOK,如何有效的防止正常程序的代码被HOOK就是技术攻防中极其重要的一道防线;而在防止代码被HOOK的技术里面,通过驱动层对代码是否被HOOK进行监控,进而基于监控对被HOOK的代码进行恢复,这样,不仅可以精确的执行代码保护操作,还可以对竞品和恶意软件启动有效的防范,鉴于此,本实施例具体提供了一种基于驱动层对防止代码被HOOK的方法。进一步地,本实施例所述的方法应用于防止程序被修改的装置,本实施例所述的防止程序被修改的装置,在实际应用中,所述装置可以集成于终端上,此时,本实施例所述的防止程序被修改的方法即可通过终端自身实现;或者,集成于服务器中,此时,本实施例所述的防止程序被修改的方法即可通过服务器实现,即利用服务器来防止终端运行的可执行程序(如应用软件对应的应用程序等)被修改。

具体地,图1为本发明实施例一防止程序被修改的方法的实现流程示意图;如图1所示,所述方法包括:

步骤101:获取终端加载的可执行程序,并获取所述可执行程序的加载位置;所述加载位置能够表征基于所述可执行程序加载于终端内存中的加载起始地址与加载终止地址所形成的加载地址区间;

本实施例中,在获取所述可执行程序的加载位置之前,所述装置还需要判断可执行程序是否为保护程序;具体地,判断所述可执行程序是否满足预设规则;其中,所述预设规则表征所述可执行程序运行的目标进程存在于预设进程列表中,或者,所述可执行程序所属的第一文件存在于预设文件列表中;进而在判断出所述可执行程序满足所述预设规则时,获取所述可执行程序的加载位置。

例如,在一具体实施例中,如图2所示,所述装置首先获取终端加载的可执行程序,进而检测所述可执行程序运行的目标进程是否存在于预设进程列表中;当存在于预设进程列表中时,认为所述可执行程序为保护程序,启动对所述可执行程序的保护机制,即获取所述可执行程序的加载地址区间,检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码;从终端的所述目标进程中去读取所述加载地址区间对应的第一字节码,并将所述第一字节码与所述可执行程序的原始字节码进行比对,以基于比对结果确定所述可执行程序是否被修改;例如,当比对不相同时,认为可执行程序被修改,此时,将所述第一字节码替换为所述原始字节码,以还原所述可执行程序;相反地,当比对成功时,认为可执行程序未被修改,继续监控直至所述可执行程序运行结束为止。

又例如,在另一具体实施例中,如图3所示,所述装置首先获取终端加载的可执行程序,然后,获取所述可执行程序对应的第一文件,如DLL文件,进而检测所述可执行程序对应的DLL文件是否存在于DLL文件列表中;具体地,当存在于所述DLL文件列表中时,认为所述可执行程序为保护程序,启动对所述可执行程序的保护机制,即获取所述可执行程序的加载地址区间,检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码;从终端的所述目标进程中去读取所述加载地址区间对应的第一字节码,并将所述第一字节码与所述可执行程序的原始字节码进行比对,以基于比对结果确定所述可执行程序是否被修改;例如,当比对不相同时,认为可执行程序被修改,此时,将所述第一字节码替换为所述原始字节码,以还原所述可执行程序;相反地,当比对相同时,认为可执行程序未被修改,继续监控直至所述可执行程序运行结束为止。

在实际应用中,可以在驱动层设置监控设施,例如在驱动层设置模块监控例程和代码修改监控例程;具体地,通过PsSetLoadImageNonifyRoutine注册一个驱动层的映像加载回调,以实现在驱动层设置模块监控例程的目的,这里,所述模块监控例程在终端加载模块的时候判断加载的模块是否为保护模块,且在确定为保护模块时,记录加载的模块的加载地址区间,以便于对记录的加载地址区间中的代码进行监控;进一步地,通过挂钩SSDT(System Services Descriptor Table)函数NtProtectVirtualMemory在驱动层设置代码修改监控例程,这里,所述代码修改监控例程在有程序修改内存属性时,判断修改位置是否在记录的加载地址区间,以判断出该修改是否为针对保护程序的,进而便于有针对性地对需要保护的程序进行防止被HOOK的保护过程。

这里,在实际应用中,所述装置需要预先预设规则,以此来判断加载的程序是否为需要保护的程序,即预先设置预设进程列表或预设文件列表中;具体地,收集需要保护的进程以及对应的DLL文件,得到管家进程和DLL文件列表,以便于基于管家进程和DLL文件列表去判断加载的程序是否为需要保护的程序。这里,DLL文件包括:重要的系统DLL文件ntdll.dll、kernel32.dll等,以及特定进程的关键DLL文件,比如iexplore.exe的ieframe.dll,或者一些第三方的DLL文件。在实际应用中,通过DLL文件即可确定出对应代码运行的进程。

步骤102:检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程;

本实施例中,所述装置还会基于所述原始字节码、以及与所述原始字节码对应的加载地址区间和目标进程之间的对应关系,建立检测列表;进而所述装置通过便于所述检测列表来确定需要保护的程序;具体地,遍历所述检测列表,并从所述检测列表中提取出所述目标进程、原始字节码、以及所述原始字节码对应的加载地址区间;从所述终端运行的所述目标进程中读取所述加载地址区间对应的第一字节码,并判断所述第一字节码与所述可执行程序的原始字节码是否相同,以便于基于判断结果确定是否替换所述第一字节码以还原所述可执行程序。具体地,在一应用场景中,当判断结果表征所述第一字节码与所述可执行程序的原始字节码相同时,认为该可执行程序未被HOOK,此时,重新遍历所述检测列表,以从所述检测列表中提取出的新的目标进程、新的原始字节码以及新的加载地址区间,进而基于新的目标进程、新的原始字节码以及新的地址信息去判断新的可执行程序的原始字节码是否被修改;在另一应用场景中,当判断结果表征所述第一字节码与所述可执行程序的原始字节码不相同,认为该可执行程序被HOOK,此时,将所述第一字节码替换为所述原始字节码,以还原所述可执行程序。

步骤103:从所述目标进程中读取所述加载地址区间对应的第一字节码,并检测出所述第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,以防止所述可执行程序的原始字节码被修改。

这里,在实际应用中,由于对代码的HOOK操作的第一步需要先修改代码所在内存的内存属性,并修改为PAGE_EXECUTE_READWRITE,所以,本实施例基于该特征,先检测出需要保护的代码的内存属性修改为PAGE_EXECUTE_READWRITE时,才去启动保护机制。当然,在实际应用中,所述装置可以检测到将内存属性修改为第一属性的修改操作,例如,检测到将内存属性修改为PAGE_EXECUTE_READWRITE的修改操作后,获取修改操作所对应的修改地址;判断所述修改地址是否处于所述加载地址区间内,进而基于判断结果来确定所述加载地址区间对应的内存属性是否被修改为所述第一属性,也就是说,基于判断结果来判断内存属性发生修改的程序是否为需要保护的程序。具体地,在实际应用中,可以在NtProtectVirtualMemory处理例程中对上述修改内存属性的修改操作进行检测,并检测该修改操作后,获取修改操作的修改地址,基于修改地址来判断该修改操作针对的程序是否为保护程序,即将修改地址与预设的需要保护的程序的保护进程和加载地址区间进行匹配,进而在匹配成功后,认为该修改操作为针对需要保护的程序的行为,进而将修改地址对应的程序的原始字节码,以及运行的目标进程和对应的加载地址区域一并记录到ByteList。相应地,守护线程定时遍历ByteList,该ByteList不为空的情况下,根据每个节点中记录的目标进程,加载地址区域,原始字节码等信息去读取对应进程对应地址中的内容,将读取到的内容与链表节点中存放的原始字节码进行比较,若不同则认为该内容已被修改,此时,将该内容改成节点中记录的原始字节码,以还原代码。

这样,本发明实施例所述的方法,通过获取终端加载的可执行程序,并获取所述可执行程序的加载地址区间,进而检测到加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程,从所述目标进程中读取所述加载地址区间对应的第一字节码,进而将所述第一字节码与原始字节码进行比对,在比对出第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,还原可执行程序,实现防止所述可执行程序的原始字节码被HOOK的目的,有效拦截了恶意软件对可执行程序进行修改的行为,如恶意软件通过注入浏览器HOOK关键函数抢夺主页的行为,进而能够大幅提升浏览器主页的锁定对抗率,同时,提升了用户体验,避免了应用程序由于被HOOK而定向到其他应用的问题。

而且,本发明实施例所述的方法是在内存属性被修改时,进行代码的检测和恢复操作的,所以,与现有未被HOOK的情况下不停的去做检测的方式相比,本发明实施例所述的方法提高了检测的有效性,提高了检测效率。

实施例二

本实施例提供了一种防止程序被修改的装置,如图4所示,所述装置包括:

第一获取单元41,用于获取终端加载的可执行程序,并获取所述可执行程序的加载位置;所述加载位置能够表征基于所述可执行程序加载于终端内存中的加载起始地址与加载终止地址所形成的加载地址区间;

第二获取单元42,用于检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程;

处理单元43,用于从所述目标进程中读取所述加载地址区间对应的第一字节码,并检测出所述第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,以防止所述可执行程序的原始字节码被修改。

在一实施例中,所述第一获取单元41,还用于判断所述可执行程序是否满足预设规则;其中,所述预设规则表征所述可执行程序运行的目标进程存在于预设进程列表中,或者,所述可执行程序所属的第一文件存在于预设文件列表中;判断出所述可执行程序满足所述预设规则时,获取所述可执行程序的加载位置。

在另一实施例中,所述处理单元43,还用于基于所述原始字节码、以及与所述原始字节码对应的加载地址区间和目标进程之间的对应关系,建立检测列表;遍历所述检测列表,并从所述检测列表中提取出所述目标进程、原始字节码、以及所述原始字节码对应的加载地址区间;从所述终端运行的所述目标进程中读取所述加载地址区间对应的第一字节码,并判断所述第一字节码与所述可执行程序的原始字节码是否相同,以便于基于判断结果确定是否替换所述第一字节码以还原所述可执行程序。

在另一实施例中,所述处理单元43,还用于当判断结果表征所述第一字节码与所述可执行程序的原始字节码相同时,重新遍历所述检测列表,以从所述检测列表中提取出的新的目标进程、新的原始字节码以及新的加载地址区间,进而基于新的目标进程、新的原始字节码以及新的地址信息去判断新的可执行程序的原始字节码是否被修改;当判断结果表征所述第一字节码与所述可执行程序的原始字节码不相同,将所述第一字节码替换为所述原始字节码,以还原所述可执行程序。

在另一实施例中,所述第二获取单元42,还用于检测到将内存属性修改为第一属性的修改操作;获取修改操作所对应的修改地址;判断所述修改地址是否处于所述加载地址区间内;基于判断结果来确定所述加载地址区间对应的内存属性是否被修改为所述第一属性。

这里需要指出的是:以上装置实施例项的描述,与上述方法描述是类似的,具有同方法实施例相同的有益效果,因此不做赘述。对于本发明装置实施例中未披露的技术细节,本领域的技术人员请参照本发明方法实施例的描述而理解,为节约篇幅,这里不再赘述。

本实施例基于上述装置实施例提供了一个具体的硬件,如图5所示,所述装置包括处理器51、存储器52以及至少一个外部通信接口(图5中未示出);在实际应用中,为便于所述装置收发信息,所述装置还包括接收器53和发射器54,或者还包括输入设备55,或者还包括显示设备56;这里,所述处理器51、存储器52、接收器53、发射器54、输入设备55以及显示设备56均通过总线57连接。进一步地,所述处理器51可为微处理器、中央处理器、数字信号处理器或可编程逻辑阵列等具有处理功能的电子元器件。所述存储器52中存储有计算机可执行代码,所述计算机可执行代码用于运行以上实施例一所述的方法。其中,所述第一获取单元41、第二获取单元42以及处理单元43均可以通过所述处理器51实现。

实施例三

本实施例还提供了一种防止程序被修改的系统;如图6所示,所述系统包括终端61和服务器62;也就是说,所述装置的功能可以分散于终端和服务器中去运行。在实际应用中,所述可执行程序可以具体为应用程序,此时,本发明实施例所述的系统即可实现避免应用程序由于被HOOK而定向到其他应用的问题,进而在提升应用程序的安全性的基础上,提升了用户体验。如图7所示,所述服务器可以具体与多个终端进行通信,以此来避免多个终端中的应用程序由于被HOOK而定向到其他应用的问题,如,所述服务器与终端1、终端2、终端3、终端4至终端n(n为大于等于2的正整数)连接,这样,控制n终端中的应用程序,进而避免应用程序被HOOK。具体地,

所述终端61,用于加载可执行程序,并在终端内存中运行所述可执行程序;检测得到所述可执行程序的加载位置;所述加载位置能够表征基于所述可执行程序加载于终端内存中的加载起始地址与加载终止地址所形成的加载地址区间;还用于检测到所述加载地址区间对应的终端内存的内存属性修改为第一属性时,获取所述可执行程序所处的目标进程,从所述目标进程中读取所述加载地址区间对应的第一字节码,并发送所述第一字节码;

所述服务器62,用于检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取到所述第一字节码,并检测出所述第一字节码与所述可执行程序的原始字节码不相同时,控制所述终端将所述第一字节码替换为所述原始字节码,以防止所述可执行程序的原始字节码被修改。

本实施例中,在获取所述可执行程序的加载位置之前,所述服务器还需要判断可执行程序是否为保护程序;具体地,所述服务器获取终端加载的所述可执行程序,并判断所述可执行程序是否满足预设规则;其中,所述预设规则表征所述可执行程序运行的目标进程存在于预设进程列表中,或者,所述可执行程序所属的第一文件存在于预设文件列表中;进而在判断出所述可执行程序满足所述预设规则时,获取所述可执行程序的加载位置。

例如,在一具体实施例中,如图9所示,所述服务器首先检测到终端加载可执行程序,进而检测所述可执行程序运行的目标进程是否存在于预设进程列表中;当存在于预设进程列表中时,认为所述可执行程序为保护程序,启动对所述可执行程序的保护机制,即所述服务器控制所述终端去获取所述可执行程序的加载地址区间,并获取到所述可执行程序的加载地址区间,进而在检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码;所述服务器从终端的所述目标进程中去读取所述加载地址区间对应的第一字节码,并将所述第一字节码与所述可执行程序的原始字节码进行比对,以基于比对结果确定所述可执行程序是否被修改;例如,当比对不相同时,认为可执行程序被修改,此时,所述服务器控制所述终端将所述第一字节码替换为所述原始字节码,以还原所述可执行程序;相反地,当比对成功时,认为可执行程序未被修改,继续监控直至所述可执行程序运行结束为止。

又例如,在另一具体实施例中,如图10所示,所述服务器首先检测到终端加载可执行程序,然后,通过所述终端去获取所述可执行程序对应的第一文件,如DLL文件,进而检测所述可执行程序对应的DLL文件是否存在于DLL文件列表中;具体地,当存在于所述DLL文件列表中时,认为所述可执行程序为保护程序,所述服务器启动对所述可执行程序的保护机制,即所述服务器通过终端去获取所述可执行程序的加载地址区间,检测到所述加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码;进而所述服务器通过终端的所述目标进程中去读取所述加载地址区间对应的第一字节码,并将所述第一字节码与所述可执行程序的原始字节码进行比对,以基于比对结果确定所述可执行程序是否被修改;例如,当比对不相同时,认为可执行程序被修改,此时,所述服务器控制所述终端将所述第一字节码替换为所述原始字节码,以还原所述可执行程序;相反地,当比对相同时,认为可执行程序未被修改,继续监控直至所述可执行程序运行结束为止。

在实际应用中,可以在驱动层设置监控设施,例如在驱动层设置模块监控例程和代码修改监控例程;具体地,通过PsSetLoadImageNonifyRoutine注册一个驱动层的映像加载回调,以实现在驱动层设置模块监控例程的目的,这里,所述模块监控例程在终端加载模块的时候判断加载的模块是否为保护模块,且在确定为保护模块时,记录加载的模块的加载地址区间,以便于对记录的加载地址区间中的代码进行监控;进一步地,通过SSDT函数NtProtectVirtualMemory在驱动层设置代码修改监控例程,这里,所述代码修改监控例程在有程序修改内存属性时,判断修改位置是否在记录的加载地址区间,以判断出该修改是否为针对保护程序的,进而便于有针对性地对需要保护的程序进行防止被HOOK的保护过程。

这里,在实际应用中,所述服务器需要预先预设规则,以此来判断加载的程序是否为需要保护的程序,即预先设置预设进程列表或预设文件列表中;具体地,收集需要保护的进程以及对应的DLL文件,得到管家进程和DLL文件列表,以便于基于管家进程和DLL文件列表去判断加载的程序是否为需要保护的程序。这里,DLL文件包括:重要的系统DLL文件ntdll.dll、kernel32.dll等,以及特定进程的关键DLL文件,比如iexplore.exe的ieframe.dll,或者一些第三方的DLL文件。在实际应用中,通过DLL文件即可确定出对应代码运行的进程。

本实施例中,所述服务器还会基于所述原始字节码、以及与所述原始字节码对应的加载地址区间和目标进程之间的对应关系,建立检测列表,进而通过便于所述检测列表来确定需要保护的程序;具体地,所述服务器遍历所述检测列表,并从所述检测列表中提取出所述目标进程、原始字节码、以及所述原始字节码对应的加载地址区间;所述服务器通过所述终端运行的所述目标进程去读取所述加载地址区间对应的第一字节码,并判断所述第一字节码与所述可执行程序的原始字节码是否相同,以便于基于判断结果确定是否替换所述第一字节码以还原所述可执行程序。具体地,在一应用场景中,当判断结果表征所述第一字节码与所述可执行程序的原始字节码相同时,认为该可执行程序未被HOOK,此时,重新遍历所述检测列表,以从所述检测列表中提取出的新的目标进程、新的原始字节码以及新的加载地址区间,进而基于新的目标进程、新的原始字节码以及新的地址信息去判断新的可执行程序的原始字节码是否被修改;在另一应用场景中,当判断结果表征所述第一字节码与所述可执行程序的原始字节码不相同,认为该可执行程序被HOOK,此时,将所述第一字节码替换为所述原始字节码,以还原所述可执行程序。

这里,在实际应用中,由于对代码的HOOK操作的第一步需要先修改代码所在内存的内存属性,并修改为PAGE_EXECUTE_READWRITE,所以,本实施例基于该特征,先检测出需要保护的代码的内存属性修改为PAGE_EXECUTE_READWRITE时,才去启动保护机制。当然,在实际应用中,所述服务器可以通过终端去检测到将内存属性修改为第一属性的修改操作,例如,检测到将内存属性修改为PAGE_EXECUTE_READWRITE的修改操作后,获取修改操作所对应的修改地址;判断所述修改地址是否处于所述加载地址区间内,进而基于判断结果来确定所述加载地址区间对应的内存属性是否被修改为所述第一属性,也就是说,基于判断结果来判断内存属性发生修改的程序是否为需要保护的程序。具体地,在实际应用中,可以在NtProtectVirtualMemory处理例程中对上述修改内存属性的修改操作进行检测,并检测该修改操作后,获取修改操作的修改地址,基于修改地址来判断该修改操作针对的程序是否为保护程序,即将修改地址与预设的需要保护的程序的保护进程和加载地址区间进行匹配,进而在匹配成功后,认为该修改操作为针对需要保护的程序的行为,进而将修改地址对应的程序的原始字节码,以及运行的目标进程和对应的加载地址区域一并记录到ByteList。相应地,守护线程定时遍历ByteList,该ByteList不为空的情况下,根据每个节点中记录的目标进程,加载地址区域,原始字节码等信息去读取对应进程对应地址中的内容,将读取到的内容与链表节点中存放的原始字节码进行比较,若不同则认为该内容已被修改,此时,将该内容改成节点中记录的原始字节码,以还原代码。

这样,本发明实施例所述的方法,通过获取终端加载的可执行程序,并获取所述可执行程序的加载地址区间,进而检测到加载地址区间对应的内存属性修改为第一属性时,获取所述可执行程序的原始字节码,以及获取所述可执行程序所处的目标进程,从所述目标进程中读取所述加载地址区间对应的第一字节码,进而将所述第一字节码与原始字节码进行比对,在比对出第一字节码与所述可执行程序的原始字节码不相同时,将所述第一字节码替换为所述原始字节码,还原可执行程序,实现防止所述可执行程序的原始字节码被HOOK的目的,有效拦截了恶意软件对可执行程序进行修改的行为,如恶意软件通过注入浏览器HOOK关键函数抢夺主页的行为,进而能够大幅提升浏览器主页的锁定对抗率,同时,提升了用户体验,避免了应用程序由于被HOOK而定向到其他应用的问题。

而且,本发明实施例所述的方法是在内存属性被修改时,进行代码的检测和恢复操作的,所以,与现有未被HOOK的情况下不停的去做检测的方式相比,本发明实施例所述的方法提高了检测的有效性,提高了检测效率。

在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。

上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元,即可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。

另外,在本发明各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

或者,本发明上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本发明各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1