著录项信息
专利名称 | 用于防止非法程序窃取用户信息的方法及装置 |
申请号 | CN200610105978.X | 申请日期 | 2006-07-21 |
法律状态 | 暂无 | 申报国家 | 暂无 |
公开/公告日 | 2007-06-20 | 公开/公告号 | CN1983296 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/00 | IPC分类号 | G;0;6;F;2;1;/;0;0;;;G;0;6;F;9;/;4;6查看分类表>
|
申请人 | 北京瑞星国际软件有限公司 | 申请人地址 | 北京市海淀区中关村大街22号中科大厦1301室
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京瑞星网安技术股份有限公司 | 当前权利人 | 北京瑞星网安技术股份有限公司 |
发明人 | 马劲松 |
代理机构 | 永新专利商标代理有限公司 | 代理人 | 覃鸣燕 |
摘要
本发明提出一种用于防止非法程序窃取用户信息(如用户帐户和密码)的方法,该方法包括:拦截一个可能被非法程序利用以窃取用户信息的系统调用;根据该系统调用的参数和/或调用所述系统调用的进程数据,判断运行所述系统调用是否安全;若判断不安全,则执行相应的处理使得所述系统调用失效。需要拦截的所述系统调用至少包括用于向一个进程中加载钩子(Hook)动态链接库(dll)的系统调用,或者用于打开一个目标进程的系统调用中的一个。
1.一种用于防止非法程序窃取用户信息的方法,包括:
a)操作系统内核中拦截一个可能被非法程序利用以窃取用户信息的系统调用;
b)根据该系统调用的参数识别出该系统调用将要操作的动态链接库或目标进程;
c)根据所述动态链接库或目标进程的属性判断所述动态链接库或目标进程是否是可信的,和/或根据调用所述系统调用的当前进程和/或目标进程的属性判断调用所述系统调用的当前进程和/或目标进程是否是可信的或受保护的;
d)根据判断结果,确定运行所述系统调用是否安全;
e)若确定运行所述系统调用是不安全,则执行相应的处理使得所述系统调用失效。
2.如权利要求1所述的方法,其中需要拦截的所述系统调用用于向一个进程中加载钩子动态链接库,所述动态链接库为钩子动态链接库。
3.如权利要求2所述的方法,其中所述步骤b)包括:
根据所述系统调用的参数,获得所述将要加载的所述钩子动态链接库的路径信息;
且所述步骤c)包括
将获得的所述钩子动态链接库的路径信息与一个信任库中可信动态链接库的路径信息进行比较,以判断所述钩子动态链接库是否可信。
4.如权利要求3所述的方法,其中,所述步骤e)包括:
修改所述系统调用的参数,使得所述钩子动态链接库的路径信息为空。
5.如权利要求2所述的方法,其中所述步骤a)包括:
通过修改操作系统的驱动文件的引入表中与所述系统调用相关的信息,拦截所述系统调用。
6.如权利要求2所述的方法,其中所述系统调用为内核用户模式回调函数,且所述步骤a)还包括
根据所述内核用户模式回调函数的参数中用于标识其调用功能的标识符,判断所述系统调用是否为所要拦截的系统调用。
7.如权利要求2所述的方法,其中,所述步骤d)还包括当所述当前进程为不受信息保护的进程时,判断执行所述系统调用是安全的。
8.如权利要求1所述的方法,其中需要拦截的所述系统调用用于从目标进程的窗口中获得文本消息。
9.如权利要求8所述的方法,其中所述步骤e)包括设置所述系统调用中的参数,使得向所述目标进程发送的消息为空。
10.如权利要求8所述的方法,其中所述步骤d)包括:
如果所述当前进程可信,则判断执行所述系统调用是安全的。
11.如利要求8所述的方法,其中,所述步骤c中判断所述当前进程是否可信的步骤包括:
根据所述当前进程的标识,获得所述当前进程的路径信息;
将获得的所述当前进程的路径信息与一个信任库中可信进程的路径信息进行比较,以判断所述当前进程是否可信。
12.如权利要求11所述的方法,其中,所述步骤b)还包括:
当所述当前进程不可信时,根据所述系统调用的参数,获得目标进程的标识;
且所述步骤d)还包括:
将所述当前进程的标识与获得的所述目标进程的标识进行比较,如果二者不同,则判断执行所述系统调用是不安全的。
13.如权利要求12所述的方法,其中当所述目标进程为不受信息保护的进程时,所述步骤d)判断执行所述系统调用是安全的。
14.如权利要求8所述的方法,其中所述系统调用为用于向目标窗口发送消息的函数,且在所述步骤a中:
根据所述函数的发送消息参数是否为获得窗口中的文本消息,判断所述系统调用是否为所要拦截的系统调用。
15.如权利要求8所述的方法,其中所述步骤a)包括:
通过修改操作系统的驱动文件的函数表中与所述系统调用相关的信息,拦截所述系统调用。
16.如权利要求1所述的方法,其中,需要拦截的所述系统调用用于打开一个目标进程。
17.如权利要求16所述的方法,其中当所述当前进程为可信进程时,所述步骤d)判断执行所述系统调用是安全的。
18.如权利要求17所述的方法,其中所述步骤b)还包括:
根据所述系统调用的参数,获得目标进程的标识;且
所述步骤d)包括:
当所述目标进程为受信息保护的进程时,判断执行所述系统调用是不安全的,否则判断为安全的。
19.如权利要求16所述的方法,其中所述步骤e)包括屏蔽所述系统调用的访问标志参数,以不允许对打开的进程进行读写操作。
20.如权利要求16所述的方法,其中所述步骤a)包括:
通过修改操作系统的驱动文件的系统服务描述表中与所述系统调用相关的信息,拦截所述系统调用。
21.如权利要求3或11所述的方法,其中所述比较步骤包括计算并比较路径信息的循环冗余校验码(CRC)。
22.如权利要求1、2、8或16中任一所述的方法,还包括:在任一进程创建时判断进程属性,并将可信和受保护的进程记录在信任库中。
23.如权利要求1、2、8或16中任一所述的方法,还包括在执行该方法时禁止其他进程终止该方法执行,或者在受保护进程启动后禁止没有签名的驱动加载,或者通过修改启动组尽早启动运行所述方法。
24.一种用于防止非法程序窃取用户信息的装置,包括:
拦截单元,用于拦截一个可能被非法程序利用以窃取用户信息的系统调用;
识别单元,用于根据该系统调用的参数识别出该系统调用将要操作的动态链接库或目标进程;
判断单元,根据所述动态链接库或目标进程的属性判断所述动态链接库或目标进程是否是可信的,和/或根据调用所述系统调用的当前进程和/或目标进程的属性判断调用所述系统调用的当前进程和/或目标进程是否是可信的或受保护的;
确定单元,用于根据所述判断单元的判断结果,确定执行所述系统调用是否安全;
处理单元,用于当确定单元的确定结果为不安全时,执行相应的处理使得所述系统调用失效。
25.如权利要求24所述的装置,其中需要拦截的所述系统调用至少包括用于向一个进程中加载钩子(Hook)动态链接库(dll)的系统调用,用于从目标进程的窗口中获得文本消息的系统调用,或者用于打开一个目标进程的系统调用中的至少一个。
26.一个计算机系统,包括如权利要求24或25所述的用于防止非法程序窃取用户信息的装置。
技术领域\n本发明涉及一种用于防止非法程序窃取用户信息的方法及装置,尤其涉及一种用于防止用户向计算机系统输入的帐户或密码等信息被窃取的方法及装置。\n背景技术\n随着信息产业的发展,安全问题也日益突出。各种形形色色的“网络窃贼”不仅让广大电脑用户防不胜防,同时也极大地制约着包含电子商务在内的互联网相关产业的发展。因而,个人信息的客户端安全问题,已经成为包括网上身份认证、网上支付在内的,整个电子商务产业的发展瓶颈,而网络游戏、即时通信等领域,也面临着同样的问题。\n目前,常见的一种密码盗取方法是通过嵌入木马程序来截获用户的帐户和密码。针对这种情况,现有的密码防盗、隐私保护产品需要用户事先将要保护的对象,如:姓名、银行卡号、密码等信息录入到软件的数据库中。然后,此类产品会对用户计算机向外发送的数据包进行过滤。如果木马以明文形式(即没有加密)向外发送含有用户事先录入信息的数据包,那么就会被隐私保护过滤器阻拦。\n但是,此种隐式保护存在严重的缺陷。首先,目前绝大多数的盗号木马、间谍软件等都会将盗取的数据进行加密、变形再向外发送。这些经过处理的信息在经过过滤器时是无法识别的乱码,隐私保护程序不会进行拦截。其次,这些信息由用户事先录入,直接储存在用户的计算机中。如果黑客破解了此类隐私保护程序的数据库,他们就可以直接从中提取所需的信息。\n由此可见,现有技术仅仅是在系统的应用层采取各种手段来防止用户个人信息被盗,并不能从根本上解决帐号被盗、隐私泄漏问题。为此,需要提出一种新的用于防止非法程序窃取用户信息的方法,使用户能够彻底摆脱木马的侵袭。\n发明内容\n本发明的目的在于提供一种用于防止非法程序窃取用户秘密信息的方法,采用该方法可以深入到操作系统的内核,在木马程序试图获得用户个人信息之前将其拦截,从而从根本上解决隐私泄漏问题。\n为了实现上述目的,本发明提出的用于防止非法程序窃取用户信息的方法,包括:拦截一个可能被非法程序利用以窃取用户信息的系统调用;根据该系统调用的参数和/或调用所述系统调用的进程属性,判断运行所述系统调用是否安全;若判断不安全,则执行相应的处理使得所述系统调用失效。\n本发明还提出了用于实现上述方法的装置,包括该装置的计算机系统,以及包括实现上述方法的计算机代码的计算机程序产品。\n附图说明:\n图1是根据本发明一个实施例的阻止钩子动态库加载的流程图。\n图2是根据本发明一个实施例的阻止木马程序通过调用系统的发送消息函数来窃取信息的具体流程图。\n图3是根据本发明一个实施例的阻止木马程序通过跨进程读写操作来窃取信息的具体流程图;\n图4是根据本发明一个实施例的用于防止非法程序窃取用户信息的装置的结构框图。\n具体实施方式\n下面结合附图详细描述本发明。\n为了能够有效地防止木马程序窃取用户的个人信息,首先要分析木马程序行窃通常采用的几种手段。\n1、钩子(Hook)注入\n木马程序可以通过钩子注入方式将自身的模块加载到正常进程中。在这种情况下,由于木马程序的模块运行的上下文是当前进程空间,因而只要当前进程是可信的,木马程序的任何动作也都是可信的。这样,木马程序就可以在可信的正常进程庇护下窃取用户的信息。\n具体而言,木马程序通常安装一个钩子来监测系统或进程的各种事件消息。这个钩子通常为全局钩子,可选地,该钩子也可以是针对某一个线程的钩子,但一般是全局钩子。当钩子所监测的事件发生时,系统首先判断当前进程是否装载了包含这个钩子的处理函数的模块。若有,则调用其中的处理函数,若没有,则调用KeUserModeCallback(内核用户模式回调)这个应用程序接口(API)函数加载该模块,从而执行相应的处理,如截获消息(例如,通过键盘输入的密码)等。木马程序安装的钩子的类型可以是键盘、鼠标、消息、窗口等,但一般是键盘、鼠标和消息钩子。\n为了能够监视系统中的所有线程的事件消息,木马程序通常安装全局钩子。由此,钩子的回调处理函数必须放在一个有共享节的模块中,一般为独立的动态链接库(dll)。(此处,将包含钩子的回调处理函数的dll称为钩子dll。)因此,采用钩子注入方式的木马程序的一个共性是在窃取用户信息的过程中系统都需要调用KeUserModeCallback这个API函数来加载相应的钩子dll。\n2、调用SendMessage API函数\n木马程序还可通过调用 SendMessage(hwnd,WM_GETTEXT,..,..),把消息WM_GETTEXT(获取窗口内的文本信息)发送给窗口句柄为hwnd的目标窗口的进程,以获得该进程中用户在该目标窗口中输入的信息。其中,该SendMessage函数的第二个参数表示要发送的消息。\n具体而言,木马程序可以通过FindWindows(发现窗口)函数、鼠标钩子等方法得到当前输入焦点的窗口的hwnd,进而可以得到运行该窗口的进程标识(PID)。然后,通过判断路径等办法可以确认该目标进程是否为想要侵入的进程。若是想要侵入的进程,则对于普通编辑(edit)窗口,发WM_GETTEXT消息就能得到窗口中输入的内容;而对于具有PASSWORD(口令)属性的edit窗口,先用SendMessage函数发送EM_SETPASSWORDCHAR,修改其显示属性,然后发SendMessage(hwnd,WM_GETTEXT,...)即可得到该窗口的内容。\n因此,针对调用SendMessage的木马程序,拦截WM_GETTEXT消息是必须的和充分的。\n3、读进程空间\n木马程序还可以通过反编译事先知道或者能计算得到帐户、密码的存贮位置。然后在目标进程运行后通过调用读进程空间ReadProcessMemory()来得到帐户密码的内容。\n4、写进程空间\n木马程序还可通过启动远程线程来实现。此时首先需要调用写进程空间函数——WriteProcessMemory()来对目标进程写入部分代码,然后再调用创建远程线程函数——CreateRemoteThread()。若目标进程是可信的,新启动的这个线程的任何动作都是可信的,同时,这个线程可以任意访问、修改目标进程内的任何内容,包括数据、指令等。\n木马程序还可以通过WriteProcessMemory修改指令、数据,改变已有指令流程,或者加载、运行窃取密码的代码等等。\n这里,无论是读进程空间,还是写进程空间,木马程序都需要首先调用打开进程函数——OpenProcess打开目标进程。由此,针对这种木马程序,拦截OpenProcess是可靠的。\n以上罗列了四种木马程序常用的实现手段。由以上描述不难看出,四种方法的实现均要调用系统的API函数(或称为系统调用),因而可以针对各个类型的木马程序的特点,通过加载驱动,在木马程序起作用之前分别拦截其必然调用的系统调用,进而执行本发明提出的处理函数,以便判别执行这个系统调用是否安全合法,且如果不安全则阻断相应的操作,从而可防范木马的侵袭。\n基于上述思想,本发明提出在系统启动后运行一个用于防止非法程序窃取用户信息的保护程序。这个保护程序可以阻止以上四种类型木马程序中的任一窃取信息。下面将结合附图1-3详细描述本发明提出的保护程序针对各种类型木马程序的具体解决方案。\n1、阻止钩子注入\n根据以上对钩子注入式木马程序特点的描述,本发明提出在系统加载钩子dll时对其进行拦截。然后,判断拦截的dll是否可信,如果不可信,则拒绝加载这个dll,同时报告用户,以防止不能识别但确实是有用的dll被拒绝。用户看到被拒绝的dll时,由用户判定该dll是否可疑,若可信任,则放到信任库中,下次就可以加载这个dll。一般而言,只要经过充分的测试,建立起来的信任库可以涵盖用户常用的dll。\n前已述及,系统加载dll时需要调用KeUserModeCallBack这个API。KeUserModeCallBack是由操作系统内核可执行文件ntoskrnl.exe导出的, 由一个驱动文件win32k.sys使用的。为了拦截KeUserModeCallBack,可以直接修改win32k.sys的引入表,让操作系统发生调用时先跳到根据本发明设计的处理函数中,当处理完毕后再跳回到原来的处理函数。\n具体修改win32k.sys引入表的过程如下:\n由于win32k.sys在编译时做了处理,导致在内核中分析已经加载的win32k.sys的引入表十分困难。因此,本发明提出可在本发明提出的保护程序的主程序中针对磁盘上存储的win32k.sys文件进行分析。然后把分析后的结果,就是win32k.sys中引用KeUserModeCallBack的地址告诉驱动。驱动在做必要的参数检查后直接读取该引用地址的内容,读出的就是原来的KeUserModeCallBack的地址,也就是ntoskrnl.exe导出的地址,然后驱动记住这个地址。根据本发明的处理函数最终还要调用这个地址来回调原来的处理函数。然后,把win32k.sys的引入地址设置到根据本发明的处理函数中。\n在经过上述修改后,当系统调用KeUserModeCallBack时就直接跳转到本发明的处理函数,具体流程在图1中示出。\n如图1所示,当进入到本发明的处理函数后,首先分析堆栈。分析堆栈的目的在于提取与所要加载dll相关的特征信息。为了使dll的判别更为简便快捷,这里只需分析KeUserModeCallBack()的两个参数:\n第一个参数是KeUserModeCallBack()当前功能的功能标识(ID)。KeUserModeCallBack()可以实现多种功能,每种功能具有一个功能ID。这里只关心用于加载钩子dll的功能ID,这个ID在同一个系统上是固定的,不随service pack(补丁包)而改变。\n第二个参数是一个结构的指针(其具体结构无需清楚了解)。通过分析可以在这个结构指针中找到一个指向unicode_string(通用编码字符串)的指针,这个指针所指向的字符串的内容就是将要加载的钩子dll的全路径。\n当进入本发明的处理函数后,首先判断KeUserModeCallBack()的功能ID是否是加载钩子dll这个功能的ID,如果不是,直接返回到原来的处理函数(步骤S110)。\n如果经过判别为加载钩子dll的ID,则根据从上层主程序得到的进程属性列表,判断当前进程(即,发生KeUserModeCallBack()调用的进程)是否是受保护的(步骤S120)。例如,与网上银行等相关的进程可设定为受保护进程。若判断当前进程并未受到保护,则直接退回。这样做是为了节省资源和处理时间,而仅对需要信息保护的进程进行检查。\n若经确认,当前进程为受保护进程,则在步骤S130中根据KeUserModeCallBack()的第二个参数中的unicode_string指针,获得所要加载的钩子dll的全路径,以便与信任库中可信dll的全路径信息进行比较。这里,为了简化处理,计算获得的该全路径的循环冗余校验码CRC。这个CRC是忽略大小写、直接对宽字符计算的CRC。计算CRC主要是出于速度的考虑,当然也可以把unicode_string转到ansicode_string(ANSI编码字符串)、统一大小写,再进行全路径信息比较。但是这样做会比较复杂,而比较CRC就简便了许多。一般全路径的CRC在NT平台上是忽略大小写的unicode_string的CRC,在Windows9x下是忽略大小写的ansicode_string的CRC。\n然后,将计算出的要加载的钩子dll的全路径CRC与一个信任库中的各个可信dll的全路径CRC进行比较,以判断钩子dll是否可信(步骤S140)。这个信任库中包含了所有事先测试的可信任的dll的全路径CRC。每次经用户确认信任的dll也被加入这个信任库中。若钩子dll的全路径CRC在信任库中,则认为它是可信的,直接返回,调用原来的处理函数。若钩子dll不在信任库中,就把这个不可信的dll的信息写入一个链表中,然后激活一个共享事件,这时界面部分会读取这个信息,以备显示或者记录日志。\n最后,如果要加载的钩子dll不可信,则阻止系统加载这个dll,也就是说使这个KeUserModeCallBack()调用无效(步骤S150)。一种方法是破坏unicode_string指针所指的数据,让unicode_string指针所指的存储区的首字(WORD)为0。也就是说,让要加载的钩子dll的全路径为空,导致系统拒绝加载(步骤S150)。最后返回,调用原来的处理函数(步骤S160)。当然此时,也可不调用原来的函数而直接返回,但这种方法需要充分了解KeUserModeCallBack()的出口参数和返回值该如何修改。\n经过以上如图1所示的处理,就可以阻止未知的、不信任的钩子dll的加载,同时,确保系统运行所必须的、其他可信任的钩子dll得以放行,以使系统、应用程序可以正常运行。\n当然测试所有的dll是不可能的,所以对于不可信的dll,本发明提供了上报机制,使用户有机会添加其认为可信的dll。对于系统的dll,比如shell32.dll、msctf.dll等等,可以预先添加好,对于个别不知道的,但可能还是必须的dll,采用这种上报机制就可以保证只在第一次加载时被拒绝。\n2、阻止SendMessage\n通过分析两个动态链接库user32.dll、kernel32.dll,可以发现,系统调用SendMessage最终是要进入Ring 0(0环),即系统内核的,实际是进入win32k.sys的一个功能调用。这个功能调用具有自己的ID号,不同系统是不同的,但对于同一系统而言,该ID号是不随servicepack变化的。为此,根据本发明的思想,首先要拦截这个功能调用。继续分析win32k.sys、ntoskrnl.exe,最终可以找到包含这个功能调用的函数表的位置就在KeServiceDescriptorTable(系统服务描述表)的附近。然后修改这个函数表的表项内容,使之在调用时首先指到本发明的处理函数中,然后在本发明的处理函数中进行判断和处理,具体过程由图2示出。当然,也可以编写一段函数,通过搜索准确定位这个函数表在内核中的位置,然后修改相应的表项。\n如图2所示,根据前面对调用SendMessage的描述可知,当前进程是发起SendMessage这个调用的进程,而且拦截WM_GETTEXT是必须的。因而首先,查看SendMessage的消息参数是否是WM_GETTEXT,若不是表明此消息并不会窃取信息,因而直接返回,调用原来的处理函数(步骤S210)。\n若消息是WM_GETTEXT消息,则继续查看当前进程是否是受信任的进程(步骤S220),比如系统进程、查毒进程或其他已知的信任进程。这里例举了两种判断方法:其一是由当前进程的PID解析出当前进程的全路径,并计算CRC,查信任库的信任进程表,从而判断当前进程是否可信;其二是在系统创建进程时,就在一个表中记下这个进程的属性,比如是否是受信任的、是否是受保护以及父进程的属性等等。在本实施例中采用的是第二种方法。为了弥补本发明的驱动可能后启动的不足,当本发明的驱动运行后,会扫描记录系统已有的进程,并查表得到其属性信息。\n继而,当调用SendMessage的进程是受信任的进程时,则认为执行该系统调用是安全的,放行这个操作。若当前进程不是受信任的进程,则要进一步查看目标窗口(即由参数hwnd确定的窗口)是由哪个进程创建的。在Ring 3(3环)中调用GetWindowThreadProcessId()(获取窗口线程进程ID),可以根据hwnd解析出创建窗口的目标进程标识(PID)。通过对这个函数的分析,不难发现其同样是通过一个win32k.sys的功能调用实现的。为此只要跟踪并记录下这个功能号,并在本发明的驱动中也发出类似的调用,就可以得到创建目标窗口的目标进程的PID(步骤S230)。\n接着,首先查看当前进程的PID是否与目标进程的PID相同,即该SendMessage是否为当前进程自己发给自己的(步骤S240)。这是因为正常的进程是可以从自己创建的窗口中获取内容。若是当前进程自己发给自己,则认为是安全的,放行;若不是,则查看目标进程的PID是否是受保护的(判断方法与阻止钩子注入中的相同)(步骤S250)。若不受保护则放行,若是则修改SendMessage在堆栈里的参数,使该函数调用无效。例如,把第二个参数改为WM_NULL(步骤S260),即,使得向目标窗口发送的消息为空,目标窗口忽略该消息发送,然后返回原来的处理函数(步骤S270)。\n3、阻止跨进程读写\n前已描述木马程序还会通过读取或写入进程的方式窃取信息。根据本发明的思想可拦截对进程空间的读写调用。然而,直接拦截函数读写进程空间——ReadProcessMemory/WritePrcessMemory可能会导致系统异常,因此本发明提出的做法是拦截OpenProcess()(打开进程)的调用。由于以上两个读写进程的调用的第一个参数都是进程的句柄,也就是OpenProcess()的返回值,因而只要修改调用OpenProcess()时的属性位就可实现阻止调用的目的。换言之,对于被认为可疑的打开操作,只需屏蔽掉PROCESS_VM_WRITE(进程写)、PROCESS_VM_READ(进程读)以及PROCESS_VM_OPERATION(进程操作)3个属性位,打开者就不能进行进程读写操作了。既然不能继续写操操作,修改指令、创建远程线程也就不能实现了。\n拦截OpenProcess的方法比较简单,直接修改win32k.sys中的KeServiceDescriptorTable中的表项就可以使之在调用时首先指到本发明的处理函数中,然后在本发明的处理函数中进行判断、处理,具体过程由图3示出。\n如图3所示,当进入本发明的处理函数后,首先判断调用OpenProcess的当前进程是否是可信的进程(步骤S310),其判断方法与图2中相同。若判断为是,则放行。否则,继续判断OpenProcess()所要打开的目标进程是否是受保护的,其判断方法也与图2所示相同(步骤S320)。如果判断为未保护的进程则放行,否则屏蔽打开参数的以下掩位码:PROCESS_VM_WRITE、PROCESS_VM_READ和PROCESS_VM_OPERATION(步骤S330)。最后跳回原来的处理函数(步骤S340)。\n以上分别结合附图详细描述了本发明提出的用于防止用户个人信息被窃取的具体方法。以上这些方法都是针对WindowsNT、Windows2000,以及WindowsXP而设计的。当上述方法应用到Windows9x中时,需要针对Windows9x的系统特点做出适当的修改。其中在拦截调用之后的处理,即本发明的处理函数的操作是相同的,不同之处仅在于拦截方法。\n在Windows9x中需要修改3环指令的代码,使之跳转到本发明的处理函数中。首先,由调用本发明驱动的主程序加载一个能加载到高端的、有共享读写运行节的dll到0x80000000-0xc0000000地址空间中,然后,在驱动中修改kernel32、user32中的函数地址使之跳转到本发明的dll中,在那里进行类似nt的处理就没有问题了。\n对于拦截进程的创建、结束,我们采取了在驱动拦截的方法,主要是回避上层拦截CreateProcess()后对参数的处理。\n为了使用方便,本发明把一些共享数据,如信任库、受保护进程库的信息放到了加载到高端的那个dll中;同时,对于要上报的信息,如可疑dll的信息,也放在这个dll中,通过一个有名字的全局事件通知本发明的主程序有对应的事件发生(如,要加载钩子dll、读写进程、SendMessage)。\n除了以上描述的本发明实施例以外,本发明还做了如下考虑:\n在进程刚一个创建,第一条指令没有运行时,就可以判断该进程的属性。对这个的拦截有固定的API可以使用。\n在判断进程属性时可以采用如下方式:\n(1)若父进程是受保护的,则它创建的子进程也是受保护的。\n(2)通过查表,确定本进程是否是受保护的,是否是受信任的。\n(3)若本进程是受保护的,认为其也是是受信任的。\n(4)特殊进程的处理,如rundll32.exe,应该以命令行代替exe路径,或者直接解析出命令行中dll;svchost.exe,也应该用对应服务的dll的路径代替exe的路径。\n判断进程属性后,将其属性存入本发明的一个进程属性表中,该表记录有当前系统存在的进程表,以及每个进程的属性(受信任,或受保护)。\n此外,在本发明中还包括按照前述方法获得的受保护的模块表、受信任的模块表(实际是受信任的模块(进程)和受信任的钩子模块),其存储内容均为全路径的CRC。\n需要说明的是,对于NT/9X平台,都是长短路径混用的,但默认是长路径,为此考虑到长短路径问题,特别在NT以上平台,在内核中作长短路径的转换是很不划算的,所以信任库和受保护库内的表中一律存储3个值,长路径、短路经、加入时的路径(这个路径不定,可能长,也可能短,也可能混合)。此外,因为拦截的函数都是系统调用频度很高的函数,应该尽快处理完成,所以表的内容实际是一组DWORD,可以排序、去重,以便查找时使用2分算法。\n反拦截的处理\n本发明提出的方法是基于拦截的思想,当然也有可能被其他程序拦截或屏蔽掉从而失去作用。对此本发明还提出了反拦截的处理:\n(1)防止主程序被杀,加入进程守护或者在被人打开本发明的主程序时,屏蔽掉进程终止——PROCESS_TERMINATE属性位。\n(2)启动一个计时器timer,在受保护进程启动后不停地检查根据本发明的修改是否有效。\n(3)在受保护的进程启动后,禁止任何没有签名的驱动加载。由于驱动加载都要调用zwloaddriver和zwsetsysteminformation来实现,因而只要拦截这两个调用就可以了。\n(4)窃取秘密的程序若使用驱动,并在本发明的驱动启动前已经加载运行,那么本发明提出的方法所能做的就很有限了,因此,需要使本发明的驱动能够尽可能早的启动,这一点可通过修改启动组来实现。\n以上结合附图详细描述了本发明提出的方法,这些方法可以用软件来实现,也可采用硬件来实现。图4给出了实现本发明的一种结构框图。\n如图所示4所述本发明提出的一种用于防止非法程序窃取用户信息的装置400,包括:拦截单元410,用于拦截一个可能被非法程序利用以窃取用户信息的系统调用;判断单元420,用于根据拦截单元所拦截的该系统调用的参数和/或调用所述系统调用的进程属性,判断执行所述系统调用是否安全;处理单元430,用于当判断单元判断为不安全时,执行相应的处理使得所述系统调用失效。其中拦截单元410需要拦截的所述系统调用至少包括用于向一个进程中加载钩子(Hook)动态链接库(dll)的系统调用,用于从目标进程的窗口中获得文本消息的系统调用,或者用于打开一个目标进程的系统调用中的一个。此外,根据所要拦截的系统调用的不同,判断单元420和处理单元430分别按照图1-3中所示内容执行相应的处理。\n以上结合附图详细描述了本发明提出的用于防止非法程序窃取用户信息的方法在Windows操作系统中的应用,但本发明并不限于此,还可以应用到其他的操作系统中。\n有益效果:\n以上结合附图和具体实施例详细描述了本发明提出的方法。本发明提出的方法是根据木马程序的行为特点,在操作系统内核中拦截系统调用,并判断执行所拦截的系统调用是否安全,如果不安全则使得该系统调用无效。因此,采用本发明提出的方法可以在木马程序试图获得用户个人信息之前将其拦截,并且可以发现已知或未知的木马程序,从而从根本上解决隐私泄漏问题。
法律信息
- 2018-03-23
专利权人的姓名或者名称、地址的变更
专利权人由北京瑞星信息技术股份有限公司变更为北京瑞星网安技术股份有限公司
地址由100190 北京市海淀区中关村大街22号中科大厦1301室变更为100190 北京市海淀区中关村大街22号中科大厦1301室
- 2016-05-25
专利权人的姓名或者名称、地址的变更
专利权人由北京瑞星信息技术有限公司变更为北京瑞星信息技术股份有限公司
地址由100190 北京市海淀区中关村大街22号中科大厦1301室变更为100190 北京市海淀区中关村大街22号中科大厦1301室
- 2010-09-08
- 2010-05-19
专利申请权的转移
登记生效日: 2010.04.13
申请人由北京瑞星国际软件有限公司变更为北京瑞星信息技术有限公司
地址由100080 北京市中关村大街22号中科大厦1302号变更为100190 北京市海淀区中关村大街22号中科大厦1301室
- 2007-08-15
- 2007-06-20
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2005-04-13
|
2004-11-15
| | |
2
| | 暂无 |
1995-10-03
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 1 | | 2012-04-26 | 2012-04-26 | | |
2 | | 2012-04-26 | 2012-04-26 | | |