保护进程的方法和装置制造方法

文档序号:6488034阅读:138来源:国知局
保护进程的方法和装置制造方法
【专利摘要】本发明公开了一种保护进程的方法和装置,属于信息安全领域。所述方法包括:启动被保护进程,获取所述被保护进程的第一初始化代码;根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。
【专利说明】保护进程的方法和装置
【技术领域】
[0001]本发明涉及信息安全领域,特别涉及一种保护进程的方法和装置。
【背景技术】
[0002]随着信息技术的发展,信息安全越来越受到用户的重视。现有的一种侵犯用户信息安全的方法是,在用户的应用中注入远程线程,通过注入的远程线程执行恶意代码或是盗取用户的密码。
[0003]现有技术中一种阻止远程线程注入的方法是,将被保护程序与驱动程序相绑定,在被保护进行启动后,通过驱动程序,使用预设的代码Hook SSDT (System ServiceDescription Table,系统服务描述表)中的系统服务,防止被保护进程被远程线程注入。具体的,在有远程线程创建时,会调用NtOpenProcess和NtWriteProcessMemory等系统服务函数,当检测到有这些函数被调用时,拦截这些被调用的函数,使这些函数调用不成功,这样远程线程就不会被创建,从而达到被保护进程不被远程线程注入的目的。
[0004]在实现本发明的过程中,发明人发现现有技术至少存在以下问题:现有的技术方案需要被保护程序必须与驱动程序捆绑发布,增加了被保护程序的复杂性,降低了被保护程序的稳定性。

【发明内容】

[0005]为了降低被保护程序的复杂性,本发明实施例提供了一种保护进程的方法和装置。所述技术方案如下:
[0006]一方面,提供了一种保护进程的方法,所述方法包括:
[0007]启动被保护进程,获取所述被保护进程的第一初始化代码;
[0008]根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;
[0009]当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;
[0010]根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。
[0011]所述获取所述被保护进程的第一初始化代码之后,还包括:
[0012]将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,并将跳转指令添加到所述拷贝后的预设指令之后,所述跳转指令用于指示执行的线程跳转到所述第一初始化代码中的所述预设指令对应的下一个内存地址。
[0013]所述将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,包括:
[0014]获取所述被保护进程的第一初始化代码的起始内存地址;
[0015]根据预设的代码所占内存的大小,计算出需要拷贝的所述第一初始化代码中的指令条数,得到所述第一初始化代码中需要拷贝的预设指令;[0016]从所述起始内存地址对应的指令开始拷贝所述预设指令,并将拷贝得到的所述预设指令从第二指定的内存地址开始顺序存放。
[0017]所述方法还包括:
[0018]如果所述预设线程是所述被保护进程的线程,则跳转到第二指定的内存地址,执行所述拷贝后的第一初始化代码中的预设指令。
[0019]所述根据所述第一指定的内存地址对应的指令判断所述预设线程是否是被保护进程的线程,包括:
[0020]获取所述第一指定的内存地址对应的指定指令;
[0021]根据所述指定指令获取所述预设线程的线程函数地址;
[0022]将所述预设线程的线程函数地址与所述被保护进程的线程函数表中的地址进行比较,如果所述预设线程的线程函数地址能够与所述被保护进程的线程函数表中的地址匹配,则确认所述预设线程是所述被保护进程中的线程,否则,确认所述预设线程不是所述被保护进程中的线程。
[0023]另一方面,提供了一种保护进程的装置,所述装置包括:
[0024]获取模块,用于启动被保护进程,获取所述被保护进程的第一初始化代码;
[0025]初始化模块,用于根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;
[0026]跳转模块,用于当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;
[0027]执行模块,用于根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。
[0028]所述装置还包括:
[0029]备份模块,用于在所述获取模块获取所述被保护进程的第一初始化代码之后,将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,并将跳转指令添加到所述拷贝后的预设指令之后,所述跳转指令用于指示执行的线程跳转到所述第一初始化代码中的所述预设指令对应的下一个内存地址。
[0030]所述备份模块包括:
[0031]第一获取单元,用于获取所述被保护进程的第一初始化代码的起始内存地址;
[0032]计算单元,用于根据预设的代码所占内存的大小,计算出需要拷贝的所述第一初始化代码中的指令条数,得到所述第一初始化代码中需要拷贝的预设指令;
[0033]拷贝单元,用于从所述起始内存地址对应的指令开始拷贝所述预设指令,并将拷贝得到的所述预设指令从第二指定的内存地址开始顺序存放。
[0034]所述执行模块还用于:
[0035]如果所述预设线程是所述被保护进程的线程,则跳转到第二指定的内存地址,执行所述拷贝后的第一初始化代码中的预设指令。
[0036]所述执行模块,包括:
[0037]第二获取单元,用于获取所述第一指定的内存地址对应的指定指令;
[0038]第三获取单元,用于根据所述指定指令获取所述预设线程的线程函数地址;
[0039]匹配单元,用于将所述预设线程的线程函数地址与所述被保护进程的线程函数表中的地址进行比较,如果所述预设线程的线程函数地址能够与所述被保护进程的线程函数表中的地址匹配,则确认所述预设线程是所述被保护进程中的线程,否则,确认所述预设线程不是所述被保护进程中的线程。
[0040]本发明实施例提供的技术方案带来的有益效果是:启动被保护进程,获取所述被保护进程的第一初始化代码;根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。在被保护程序中加入预设的代码,在被保护进程启动时,用预设的代码Hook掉第一初始化代码,使预设线程按照第二初始化代码的指令跳转到第一指定的内存地址,执行指定指令,判断所述预设线程是否是被保护进程的线程,一旦发现该线程不是被保护进程的线程,则终止该线程的执行,其中不需要将驱动程序与被保护程序相绑定,降低了被保护程序的复杂度,提高了被保护程序的稳定性。
【专利附图】

【附图说明】
[0041]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0042]图1是本发明实施例一提供的一种保护进程的方法流程图;
[0043]图2是本发明实施例二提供的一种保护进程的方法流程图;
[0044]图3是本发明实施例三提供的一种保护进程的装置结构示意图;
[0045]图4是本发明实施例三提供的另一种保护进程的装置结构示意图。
【具体实施方式】
[0046]为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
[0047]实施例一
[0048]参见图1,本实施例中提供了一种保护进程的方法,包括:
[0049]101、启动被保护进程,获取所述被保护进程的第一初始化代码;
[0050]102、根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;
[0051]103、当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;
[0052]104、根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。
[0053]进一步地,所述获取所述被保护进程的第一初始化代码之后,还包括:
[0054]将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,并将跳转指令添加到所述拷贝后的预设指令之后,所述跳转指令用于指示执行的线程跳转到所述第一初始化代码中的所述预设指令对应的下一个内存地址。
[0055]其中,所述将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,包括:
[0056]获取所述被保护进程的第一初始化代码的起始内存地址;
[0057]根据预设的代码所占内存的大小,计算出需要拷贝的所述第一初始化代码中的指令条数,得到所述第一初始化代码中需要拷贝的预设指令;
[0058]从所述起始内存地址对应的指令开始拷贝所述预设指令,并将拷贝得到的所述预设指令从第二指定的内存地址开始顺序存放。
[0059]进一步地,所述方法还包括:
[0060]如果所述预设线程是所述被保护进程的线程,则跳转到第二指定的内存地址,执行所述拷贝后的第一初始化代码中的预设指令。
[0061]本实施例中,所述根据所述第一指定的内存地址对应的指令判断所述预设线程是否是被保护进程的线程,包括:
[0062]获取所述第一指定的内存地址对应的指定指令;
[0063]根据所述指定指令获取所述预设线程的线程函数地址;
[0064]将所述预设线程的线程函数地址与所述被保护进程的线程函数表中的地址进行比较,如果所述预设线程的线程函数地址能够与所述被保护进程的线程函数表中的地址匹配,则确认所述预设线程是所述被保护进程中的线程,否则,确认所述预设线程不是所述被保护进程中的线程。
[0065]本实施例的有益效果是:启动被保护进程,获取所述被保护进程的第一初始化代码;根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。在被保护程序中加入预设的代码,在被保护进程启动时,用预设的代码Hook掉第一初始化代码,使预设线程按照第二初始化代码的指令跳转到第一指定的内存地址,执行指定指令,判断所述预设线程是否是被保护进程的线程,一旦发现该线程不是被保护进程的线程,则终止该线程的执行,其中不需要将驱动程序与被保护程序相绑定,降低了被保护程序的复杂度,提高了被保护程序的稳定性。
[0066]实施例二
[0067]本发明实施例提供了一种保护进程的方法,本实施例中,不需要将驱动程序和被保护程序进行绑定,即允许远程线程在被保护进程中创建,但是不允许远程线程的执行。由于每个线程执行时,操作系统都需要执行一些线程的初始化代码(BaseThreadInitThunk),然后再去执行启动的线程,所以本实施例中,在被保护进程中编写预设的代码,该预设的代码用于指示执行的线程跳转到第一指定的内存地址执行指定的指令。当被保护程序启动时,用预设的代码Hook掉被保护程序中的原有的初始化代码,使线程按预设的代码指令执行,从而达到阻止远程线程执行的目的。参见图2,具体的,方法流程包括:
[0068]201、启动被保护进程,获取所述被保护进程的第一初始化代码,根据预设的代码Hook所述第一初始化代码中的预设指令,得到预设的初始化代码。[0069]本实施例中,在被保护进程中编写了预设的代码,当被保护进程启动时,查找该被保护进程的第一初始化代码,即该被保护程序的原始代码,一方面,将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,并将跳转指令添加到所述拷贝后的预设指令之后,所述跳转指令用于指示执行的线程跳转到所述第一初始化代码中的所述预设指令对应的下一个内存地址。另一方面,将预设的代码用行内补丁(Inline Patch)的方式Hook掉第一初始化代码中的预设指令。
[0070]其中,将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,包括:获取所述被保护进程的第一初始化代码的起始内存地址;根据预设的代码所占内存的大小,计算出需要拷贝的所述第一初始化代码中的指令条数,得到所述第一初始化代码中需要拷贝的预设指令;从所述起始内存地址对应的指令开始拷贝所述预设指令,并将拷贝得到的所述预设指令从第二指定的内存地址开始顺序存放。
[0071]本实施例中,用预设的代码Hook掉第一初始代码中的预设指令,其中预设指令是根据预设代码所占的内存大小计算得来的,即如果预设的代码所占的内存大小需要占用三条第一初始化代码中的指令,则预设指令就是从第一初始化代码的起始地址开始往下顺序执行的三条指令,如表1所示的初始化代码。
[0072]表1
[0073]
【权利要求】
1.一种保护进程的方法,其特征在于,所述方法包括:启动被保护进程,获取所述被保护进程的第一初始化代码;根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。
2.根据权利要求1所述的方法,其特征在于,所述获取所述被保护进程的第一初始化代码之后,还包括:将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,并将跳转指令添加到所述拷贝后的预设指令之后,所述跳转指令用于指示执行的线程跳转到所述第一初始化代码中的所述预设指令对应的下一个内存地址。
3.根据权利要求2所述的方法,其特征在于,所述将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,包括:获取所述被保护进程的第一初始化代码的起始内存地址;根据预设的代码所占内存的大小,计算出需要拷贝的所述第一初始化代码中的指令条数,得到所述第一初始化代码中需要拷贝的预设指令;从所述起始内存地址对应的指令开始拷贝所述预设指令,并将拷贝得到的所述预设指令从第二指定的内存地址开始顺序存`放。
4.根据权利要求2所述的方法,其特征在于,所述方法还包括:如果所述预设线程是所述被保护进程的线程,则跳转到第二指定的内存地址,执行所述拷贝后的第一初始化代码中的预设指令。
5.根据权利要求1所述的方法,其特征在于,所述根据所述第一指定的内存地址对应的指令判断所述预设线程是否是被保护进程的线程,包括:获取所述第一指定的内存地址对应的指定指令;根据所述指定指令获取所述预设线程的线程函数地址;将所述预设线程的线程函数地址与所述被保护进程的线程函数表中的地址进行比较,如果所述预设线程的线程函数地址能够与所述被保护进程的线程函数表中的地址匹配,则确认所述预设线程是所述被保护进程中的线程,否则,确认所述预设线程不是所述被保护进程中的线程。
6.一种保护进程的装置,其特征在于,所述装置包括:获取模块,用于启动被保护进程,获取所述被保护进程的第一初始化代码;初始化模块,用于根据预设的代码Hook所述第一初始化代码中的预设指令,得到第二初始化代码,所述预设的代码用于指示执行的线程跳转到第一指定的内存地址;跳转模块,用于当预设线程被启动时,执行所述第二初始化代码,并根据所述第二初始化代码跳转到第一指定的内存地址;执行模块,用于根据所述第一指定的内存地址对应的指定指令判断所述预设线程是否是被保护进程的线程,如果否,则终止执行所述预设线程。
7.根据权利要求6所述的装置,其特征在于,所述装置还包括:备份模块,用于在所述获取模块获取所述被保护进程的第一初始化代码之后,将所述第一初始化代码中的预设指令拷贝到第二指令的内存地址,并将跳转指令添加到所述拷贝后的预设指令之后,所述跳转指令用于指示执行的线程跳转到所述第一初始化代码中的所述预设指令对应的下一个内存地址。
8.根据权利要求7所述的装置,其特征在于,所述备份模块包括:第一获取单元,用于获取所述被保护进程的第一初始化代码的起始内存地址;计算单元,用于根据预设的代码所占内存的大小,计算出需要拷贝的所述第一初始化代码中的指令条数,得到所述第一初始化代码中需要拷贝的预设指令;拷贝单元,用于从所述起始内存地址对应的指令开始拷贝所述预设指令,并将拷贝得到的所述预设指令从第二指定的内存地址开始顺序存放。
9.根据权利要求7所述的装置,其特征在于,所述执行模块还用于:如果所述预设线程是所述被保护进程的线程,则跳转到第二指定的内存地址,执行所述拷贝后的第一初始化代码中的预设指令。
10.根据权利要求6所述的装置,其特征在于,所述执行模块,包括:第二获取单元,用于获取所述第一指定的内存地址对应的指定指令;第三获取单元,用于根据所述指定指令获取所述预设线程的线程函数地址;匹配单元,用于将所述预设线程的线程函数地址与所述被保护进程的线程函数表中的地址进行比较,如果所述预设线程的线程函数地址能够与所述被保护进程的线程函数表中的地址匹配,则确认所述预设线程是所述被保护进程中的线程,否则,确认所述预设线程不是所述被保护进程中的线程。
【文档编号】G06F21/51GK103632087SQ201210299085
【公开日】2014年3月12日 申请日期:2012年8月21日 优先权日:2012年8月21日
【发明者】曹亮 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1