一种操作注册表的方法及装置制造方法

文档序号:6518516阅读:180来源:国知局
一种操作注册表的方法及装置制造方法
【专利摘要】本发明公开了一种操作注册表的方法及其装置。该方法包括:启动注册表编辑器;获取所述注册表编辑器的窗口句柄;根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。本发明通过调用界面函数启动注册表编辑器,并调用界面函数对注册表进行操作,能够实现操作注册表功能的合法性,能够保证对注册表的进行安全操作,同时也确保了系统的安全性。
【专利说明】一种操作注册表的方法及装置
【技术领域】
[0001]本发明涉及计算机领域,尤其涉及一种操作注册表的方法及装置。
【背景技术】
[0002]注册表在Windows系统的配置和控制方面扮演了一个非常关键的角色,其是系统全局设置和用户设置形象的存储仓库,也是Windows执行体和内核所维护的各种内存中数据结构的一个窗口,所有的软件信息和硬件信息都是通过注册表来管理的。如果注册表由于某种原因受到破坏,轻者使Windows的启动过程出现异常,重者可能会导致整个Windows系统的完全瘫痪。为了保护注册表,Windows提供两种常规的操作方法:一种是注册表编辑器Regedit.exe,即通过用户界面来操作;另一种是提供大量的API供用户访问和修改注册表中的数据。用户通过注册表编辑器看到的注册表结构是经过注册表编辑器读取之后呈现给用户的,其磁盘形式并不是一个简单的大文件,而是一组HIVE文件形式。
[0003]从Inte 180386开始,出于安全性和稳定性的考虑,该系列的CPU可以运行于ringO?ring3从高到低四个不同的权限级,对数据也提供相应的四个保护级别。其中ringO优先级最高,用于操作内核;ringl和ring2都用于操作系统服务;ring3优先级最低,用于应用程序。运行于较低级别的代码不能随意调用高级别的代码和访问较高级别的数据,而且也只有运行在ringO层的代码可以直接对物理硬件进行访问。
[0004]图1示出了 Windows操作系统利用CPU运行级别的图形化示意图。如图1所示,Windows只利用了 CPU的两个运行级别。一个被称为内核模式,即对应80 X 86的ringO层,是操作系统的核心部分,设备驱动程序就是运行在该模式下;另一个被称为用户模式,即对应80X86的ring3层,操作系统的用户接口部分(Win API)以及所有的用户应用程序都运打在该级别。
[0005]Windows对运行在内核模式组件的空间并不提供读/写保护,但是在装有杀毒软件等安全软件的机器上,如果调用内核模式下的注册表API对注册表进行危险操作,杀毒软件等防护软件就会对相应的注册表API调用进行拦截,更有可能直接拦截调用此类API的应用程序,以防止其破坏系统的安全。
[0006]注册表是系统的关键部位,病毒和恶意软件常常会在注册表的启动项里面写入自己的启动键值来达到自启动的目的,有些病毒还会修改注册表内容来映像劫持杀毒软件。通常杀毒软件会对注册表进行监控,或者对注册表保护项进行保护,防止恶意程序或者病毒篡改注册表,从而破坏系统。调用系统API的程序,在运行的过程中对注册表的操作也处于杀毒软件监控之下。第三方软件的运行方式是通过主动调用系统API函数进行注册表操作,但这种方式在大多数情况下都会触碰到安全软件的防护策略,导致第三方软件被直接拦截执行,这样就无法实现自动化程序去模拟一些真实的测试环境,进行有效测试工作。
[0007]现有技术中,第三方软件操作注册表通常是采用Windows API中提供的函数来实现,比如 RegCreateKey, RegCreateKeyEx, RegSetValueEx, RegDeleteValue 等,通过这些函数可以对注册表进行读取,写入,删除,以及打开操作。[0008]这种通过Windows API访问和修改注册表中的数据,需要层层调用转移,由内核的注册表API再调用文件系统的驱动等,去访问磁盘上的HIVE文件,并最终返回请求的数据结果。如果程序运行在有保护机制的环境(比如安装杀毒软件)中,很可能会被拦截,不能正确执行。并且这些API并不是所有平台都适用,如NT和Windows98都是32位操作系统,但是有些API函数中并不支持Windows98。
[0009]现有技术中第三方软件操作注册表使用的常规方法存在以下的主要缺点:
[0010]I)可移植性低。
[0011]2)执行有效性低。
[0012]3)运行环境受限。
[0013]4)在存在防护软件的环境下有各种被误报的风险。
[0014]而现有技术中也有通过技术手段hook API或者对杀毒软件进行攻防操作的行为,但是其过程较为繁琐同时不具备通用性以及合法性。
[0015]因此提供一种合理并且通用的方式,在与各种杀毒软件或者防护软件并存的情况下,能够通过调用内核模式下的注册表API对注册表进行操作,同时能防止杀毒软件等防护软件的拦截,是非常必要的。

【发明内容】

[0016]为解决现有技术中存在的上述问题,本发明提供了一种操作注册表的方法及其装置。
[0017]根据本发明的一个方面,其提供了一种操作注册表的方法,包括:
[0018]启动注册表编辑器;
[0019]获取所述注册表编辑器的窗口句柄;
[0020]根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。
[0021]可选地,所述通过调用界面函数对注册表进行操作包括:获取注册表编辑器的菜单项,模拟鼠标和/或键盘对所述菜单项进行操作。
[0022]可选地,获取注册表编辑器的菜单项包括:
[0023]获取系统所有顶级窗口句柄,形成第一窗口句柄列表;
[0024]在预定位置模拟鼠标点击操作;
[0025]在预定时间间隔内,再次获取系统所有顶级窗口句柄,形成第二窗口句柄列表;
[0026]获取第一窗口句柄列表和第二窗口句柄列表的差集;
[0027]从所述差集中获取菜单的窗口句柄;
[0028]根据所述菜单的窗口句柄获取菜单项。
[0029]可选地,所述通过调用界面函数对注册表进行操作包括:获取展开键坐标和/或键值项坐标,并模拟鼠标进行操作。
[0030]可选地,获取展开键坐标包括:
[0031]获取注册表编辑器中根键的界面句柄;
[0032]根据根键的界面句柄,调用界面函数从树根逐层查找,获取展开键的坐标。
[0033]可选地,获取键值项坐标包括:
[0034]模拟鼠标操作,在获取到的展开键的坐标位置执行点击操作;[0035]查找键值项所在界面的界面句柄;
[0036]根据所述键值项所在的界面句柄,从该界面列表中遍历查找,并获取所述键值项的坐标。
[0037]可选地,所述预定位置包括键值项的坐标和/或注册表编辑器的菜单栏。
[0038]根据本发明提供的另一方面,其提供了一种操作注册表的装置,包括:
[0039]启动模块,其用于启动注册表编辑器;
[0040]获取模块,其用于获取所述注册表编辑器的窗口句柄;
[0041]操作模块,其用于根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。
[0042]可选地,所述操作模块包括:
[0043]菜单项操作模块,其用于获取注册表编辑器的菜单项,模拟鼠标和/或键盘对所述菜单项进行操作。
[0044]可选地,所述菜单项操作模块如下获取注册表上的菜单项:
[0045]获取系统所有顶级窗口句柄列表;
[0046]在预定位置模拟鼠标点击操作;
[0047]在预定时间间隔内,获得系统所有顶级窗口句柄列表;
[0048]比较第一次和第二次分别获得的所有顶级窗口句柄列表的差集;
[0049]从所述差集找到弹出菜单的窗口句柄;
[0050]根据所述菜单的窗口句柄获得相应的菜单项。
[0051 ] 可选地,所述操作模块包括:
[0052]坐标获取模块,其用于获取展开键坐标和/或展开键值项坐标,并模拟鼠标进行操作。
[0053]可选地,所述坐标获取模块如下获取展开键坐标:
[0054]获取注册表编辑器中根键的界面句柄;
[0055]根据根键的界面句柄,调用界面函数从树根逐层查找,获取展开键的坐标。
[0056]可选地,坐标获取模块如下获取展开键值项坐标:
[0057]模拟鼠标操作,在获取到的展开键的坐标位置执行点击操作;
[0058]查找键值项所在界面的界面句柄;
[0059]根据所述键值项所在的界面句柄,从该界面列表中遍历查找,并获取所述键值项的坐标。
[0060]可选地,所述预定位置包括展开键值项的坐标和/或注册表编辑器的菜单栏。
[0061]本发明提出的上述方案适用于任何平台,其通过模仿用户的鼠标及键盘动作,在系统自带的注册表编辑器界面上对注册表进行操作。该方案在与各种杀毒软件或者防护软件并存的情况下,能够实现模拟真实用户进行注册表操作的行为,同时可以忽略平台的差异性,适用于各种图形化操作系统中对注册表进行操作的场景。本发明能够实现操作注册表功能的合法性,能够保证对注册表的进行安全操作,同时也确保了系统安全性。
[0062]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】加以说明。【专利附图】

【附图说明】
[0063]图1是Windows操作系统利用CPU运行级别的图形化示意图;
[0064]图2是本发明中操作注册表的方法流程图;
[0065]图3是在Windows系统下模拟用户手动操作打开注册表编辑器的其中一种方法流程图;
[0066]图4是本发明中获取注册表编辑器菜单项的方法流程图;
[0067]图5是本发明中新建展开键的方法流程图;
[0068]图6是本发明中获取展开键坐标的方法流程图;
[0069]图7是本发明中获取键值项坐标的方法流程图;
[0070]图8是利用本发明在Windows系统下在注册表编辑器中修改键值项的实施方式流程图;
[0071]图9是利用本发明在Windows系统下获取注册表编辑器中展开键坐标的实施方式流程图;
[0072]图10是利用本发明在Windows系统下获取注册表编辑器中键值项坐标的实施方式流程图;
[0073]图11示出了利用本发明在Windows系统下注册表编辑器中修改键值项的另一种实施方式流程图;
[0074]图12是本发明中操作注册表的装置的模块化结构图。
【具体实施方式】
[0075]为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
[0076]图2示出了本发明提供的一种操作注册表的方法流程图。如图2所示,该方法包括:
[0077]步骤201:启动注册表编辑器;
[0078]步骤202:获取所述注册表编辑器的窗口句柄;
[0079]步骤203:根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。
[0080]步骤201:启动注册表编辑器。
[0081]在Windows系统中,启动注册表编辑器的方式可以有多种,如通过系统提供的API接口模拟用户手动操作打开注册表编辑器,或者调用系统提供的API接口直接启动注册表编辑器等。
[0082]可选地,如果模拟用户手动操作来打开注册表编辑器,可以通过模拟Win+R的系统热键调起“运行”窗口,并在打开路径中输入Register, exe,然后模拟用户鼠标点击该“运行”窗口上的“确定”,启动注册表编辑器。
[0083]本领域的技术人员可以理解,本文所称界面函数是指系统或开发平台提供的对计算机系统的图形用户界面进行操作的函数。
[0084]图3示出了在Windows系统下模拟用户手动操作打开注册表编辑器的其中一种方法流程图。如图3所示,该方法包括:[0085]步骤301:通过调用系统API接口 “keybd_event”输入键盘虚拟码“VK_LWIN+R”调出“运行”窗口 ;
[0086]步骤302:调用系统 API 接口 “FindWindow&EnumChiIdWindows” 查找窗口“ClaSSName=Eidt”的输入框的句柄“hedit”,即获得“运行”窗口上的输入框句柄,然后调用系统API接口 “SendMessage”向此句柄“hedit”发送消息号“WM_SETTEXT”,其参数为“Register, exe”,即模拟手工操作向所述输入框输入“Register, exe” ;
[0087]步骤303:调用系统 API 接 P “FindWindow&EnumChildWindows” 查找窗口"WindowsName= ‘确定’ ”的按钮句柄“hbtn”,即获得“运行”窗口上的确定按钮句柄,并调用系统API接口 “PostMessage”向句柄“hbtn”发送BN_CLICKED消息,即模拟手工点击确定按钮,打开注册表编辑器。
[0088]当然上述方式中,也可以通过快捷键等键盘模拟方式进行操作。另外,每种操作系统中注册表编辑器的打开路径不尽相同,可以根据实际情况模拟用户操作来启动注册表编辑器。
[0089]步骤202:获取所述注册表编辑器的窗口句柄。在Windows系统中,每个打开的窗口都具有特定的句柄,通过获得该句柄即可对其进行操作。
[0090]依据上面所举的例子,通过模拟用户手动操作打开注册表编辑器后,可以在一个超时时间5s内,轮询调用系统API接口 “FindWindow”,查找窗口“ClassName=RegisterWindowClass”的句柄,即查找获得Register, exe注册表编辑器的窗口句柄。
[0091]步骤203:根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。具体地,对注册表的操作包括导入或导出注册文件,新建、删除或重命名键或键值项,修改键值项等。对于上述这些对注册表的操作,都可以通过调用界面函数来实现。
[0092]可选地,所述通过调用界面函数对注册表进行操作包括:获取注册表编辑器的菜单项,模拟鼠标和/或键盘对所述菜单项进行操作。
[0093]图4示出了本发明中获取注册表编辑器的菜单项的方法流程图。如图4所示,获取注册表编辑器菜单项的方法包括如下步骤:
[0094]步骤401:获取系统所有顶级窗口句柄,形成第一窗口句柄列表;
[0095]步骤402:在预定位置模拟鼠标点击操作;
[0096]步骤403:在预定时间间隔内,再次获取系统所有顶级窗口句柄,形成第二窗口句柄列表;
[0097]步骤404:获取第一窗口句柄列表和第二窗口句柄列表的差集;
[0098]步骤405:从所述差集中获取菜单的窗口句柄;
[0099]步骤406:根据所述菜单的窗口句柄获取菜单项。
[0100]可选地,所述预定位置包括键值项的坐标和/或注册表编辑器的菜单栏。对于不同的操作,可以选择直接在相应键值项上模拟鼠标右键选择对应的菜单进行操作,也可以直接在注册表编辑器的菜单栏上进行操作。例如,对于导入、导出、新建和重命名操作,可以选择利用注册表编辑器的菜单栏进行操作,而其他操作可以选择在相应键值项上模拟鼠标右键选择对应的菜单进行操作,当然如导出、新建和重命名等操作两种方式皆可。
[0101]下面以新建键和/或键值项为例来详细说明获取注册表编辑器中菜单项的具体流程。图5示出了本发明中新建展开键的方法流程图。如图5所示,该具体流程包括:
[0102]步骤501:通过系统API接口 EnumChildWindows获取系统的所有顶级窗口句柄列表,记为第一窗口句柄列表hwndlistl ;
[0103]步骤502:在预定的位置处,通过操作系统提供的API接口 mouse_event传递参数MOUSEEVENTF_RIGHTDOWN&MOUSEEVENTF_RIGHTUP,以模拟鼠标右键操作。
[0104]步骤503:在一个超时时间内(默认5s),循环调用系统API接口EnumChildffindows获得一份系统中当前所有的顶级窗口句柄,记为第二窗口句柄列表hwndlist2 ;
[0105]步骤504:计算第二窗口句柄列表hwndlist2与第一窗口句柄列表hwndlistl的
差集;
[0106]步骤505:在所述差集中查找ClassName=#32768的句柄,即弹出菜单项的窗口句柄 hwnd ;
[0107]步骤506:通过系统API接口 GetMenu将所述弹出菜单项的窗口句柄hwnd转换为菜单句柄hmenu ;
[0108]步骤507:根据所述菜单句柄hmenu调用系统API接口 GetMenuItemCount获取此菜单中所有菜单项个数,并调用系统API接口 GetMenuItemInfo遍历每一个菜单项,获取其文字信息为“新建”的菜单项,并返回该菜单项所在的位置坐标(x,y),模拟用户将鼠标光标放置在该位置坐标(X,y),并根据上面介绍的步骤查找弹出菜单,如此递归继续查找到文字信息为“项”的菜单项所对应的位置坐标;
[0109]步骤508:在所找到的“项”菜单项对应的位置坐标处,模拟用户鼠标点击操作,并模拟用户的键盘操作,输入新建键的名称,并模拟回车操作,完成键的新建操作。
[0110]键值项的新建操作与上述键的新建操作类似,所不同的是最后查找的是文字信息为“字符串值”、“二进制值”、“DWORD值”、“多字符串值”或“可扩充字符串值”等。
[0111]所述步骤502中预定的位置可以是注册表编辑器窗口中左边界面上要新建的键的父键坐标,也可以是所述父键对应的右边界面上任意位置的坐标。
[0112]另外,所述新建操作还可以通过获取注册表编辑器上的系统菜单来完成,具体为:获取注册表编辑器的窗口句柄,并根据所述窗口句柄获取其菜单句柄,根据所述菜单句柄找到“编辑”菜单项的位置坐标后,模拟将鼠标光标置于该位置坐标处,并查找弹出菜单,如此递归继续查找到文字信息为“项”的菜单项所对应的位置坐标,并进行相应的新建操作。
[0113]可选地,所述通过调用界面函数对注册表进行操作还包括:获取展开键坐标和/或键值项坐标,并模拟鼠标进行操作。
[0114]图6示出了本发明中获取展开键坐标的方法流程图。如图5所示,获取展开键坐标的方法包括:
[0115]步骤601:获取注册表编辑器中根键的界面句柄;
[0116]步骤602:根据根键的界面句柄,调用界面函数从树根逐层查找,获取展开键的坐标。
[0117]图7示出了本发明中获取键值项坐标的方法流程图。如图7所示,获取键值项坐标的方法包括:
[0118]步骤701:模拟鼠标操作,在获取到的展开键的坐标位置执行点击操作;[0119]步骤702:查找键值项所在界面的界面句柄;
[0120]步骤703:根据所述键值项所在的界面句柄,从该界面列表中遍历查找,并获取所述键值项的坐标。
[0121]下面以修改键值项为例简要说明一下注册表编辑器的操作流程。
[0122]图8示出了利用本发明在Windows系统下在注册表编辑器中修改键值项的详细实施方式流程图。如图8所示,该方法包括:
[0123]步骤801:通过调用系统接口运行注册表编辑器Regedit,并获取Regedit的界面句柄;
[0124]步骤802:拆分待修改的目标键值项路径;比如需要修改键HKEY_CURRENT_CONFIG\ Software \ Fonts的键值项LogPixels的键值内容,则第一次则将其拆分成键HKEY_CURRENT_CONFIG \ Software \ Fonts 和键值项 LogPixels ;键 HKEY_CURRENT_C0NFIG \Software \ Fonts位于Regedit界面左边部分的树状结构中,而键值项LogPixels则位于Regedit界面右边部分的列表结构中;
[0125]步骤803:根据Regedit的窗口句柄,查找Regedit界面左边部分的根键子键的窗口句柄;
[0126]步骤804:根据根键子键的窗口句柄,调用GUI函数从树根层层查找,定位子键的坐标位置,比如最终定位找到HKEY_CURRENT_C0NFIG \ Software \ Fonts中的子键Fonts的坐标位置;
[0127]步骤805:找到子键的坐标位置后,模拟鼠标操作,点击定位到的坐标位置,使该子键对应的键值项信息显示在Regedit界面右部的列表结构中;
[0128]步骤806:获取Regedit界面右部的根键值项的界面句柄,并根据所述根键值项的界面句柄,遍历所述列表结构,最终定位待查找键值项的坐标位置;
[0129]步骤807:在所找到的键值项的坐标位置上,模拟鼠标右键操作,弹出菜单项,并从所述菜单项中选择“修改”菜单项进行修改操作。
[0130]下面详细说明在注册表编辑器中获取展开键坐标和获取键值项坐标的方法步骤。
[0131]图9示出了利用本发明在Windows系统下获取注册表编辑器中展开键坐标的详细实施方式流程图。如图9所示,该方法包括:
[0132]步骤901:通过系统API接口 FindWindow查找类型SysTreeView32的窗口,获取注册表编辑器中键(注册表编辑器左边界面)的窗口句柄hwnd ;
[0133]步骤902:调用系统API接口 SendMessage向所述键窗口句柄hwnd发送消息号TVM_GETNEXTITEM,其参数为“TVGN_R00T”,以获取注册表编辑器中根键HKEY_CLASSES_ROOT 的信息 hitem ;
[0134]步骤903:调用系统API接口 WriteProcessMemory申请一块内存rectAddr,其结构体形式为TVITEM ;
[0135]步骤904:调用系统API接口 SendMessage向所述键窗口句柄hwnd发送消息号TVM_GETNEXTITEM,参数为“ I ”,获取所述根键HKEY_CLASSES_R00T下的第一个键信息item,并保存到内存块rectAddr中,同时把其父节点即根键HKEY_CLASSES_R00T的信息hitem也保存到内存块rectAddr中;
[0136]步骤905:调用系统API接口 ReadProcessMemory从内存块rectAddr中读取所述第一个键信息item,该键信息包含text和rect,分别表示文字信息和位置坐标;
[0137]步骤906:调用系统API接口 GetWindowRect向所述键窗口句柄hwnd发消息,以获取该键窗口句柄hwnd的位置坐标rect ;
[0138]步骤907:根据所述键窗口句柄hwnd对应的位置坐标rect和所述第一个键信息item中包含的位置坐标rect计算出该第一个键在所述键窗口的相对坐标pos ;
[0139]步骤908:用同样的方法,循环查找第一个键item的子键childHitem,获取子键childHitem的文字信息和坐标位置,匹配其文字信息是否与给定的键名相同;
[0140]步骤909:如果相同,则调用系统API接口 SendMessage给所述键窗口句柄hwnd发消息TVM_EXPAND,参数为TVE_EXPAND,使该第一个键展开,并显示在界面居中位置,调用系统API接口 SendMessage给所述键窗口句柄hwnd发消息TVM_SELECTITEM,参数为TVGN_CARET,以选中所述第一个键;
[0141]步骤910:如果不相同,则依次查找与所述第一个键相邻的下一个键nextitem,并使用同样的方法,循环查找下一个键nextitem的子键,直到找到给定的键,并获取该给定键的坐标。
[0142]图10示出了利用本发明在Windows系统下获取注册表编辑器中键值项坐标的详细实施方式流程图。如图10所示,该方法包括:
[0143]步骤1001:通过系统API接口 FindWindow查找类型SysListView32的窗口,获取键值项(注册表编辑器右边界面)的窗口句柄hwnd;
[0144]步骤1002:调用系统API接口 SendMessage向所述键值项窗口句柄hwnd发送LVM_GETITEMC0UNT的消息号,获取所述键值项窗口句柄hwnd对应的键值项数量count,即键值项行数;
[0145]步骤1003:遍历所述键值项窗口中的每行键值项对应的信息item,行号为index,调用系统API接口 WriteProcessMemory申请一块内存rectAddr,其结构体形式为LVITEM ;
[0146]步骤1004:调用系统API接口 SendMessage向所述键值项窗口句柄hwnd发送LVM_GETITEMTEXT的消息号,参数为当前所遍历的键值项行号index,获取当前遍历的键值项信息item,并保存到内存块rectAddr中;
[0147]步骤1005:调用系统API接口 ReadProcessMemory从内存块rectAddr中读取当前遍历的键值项信息item,该键值项信息item包含文字信息和该键值项对应的坐标,过匹配该键值项信息item包含的文字信息是否与给定的键值项名相同;
[0148]步骤1006:如果不相同,则继续遍历查找下一行;
[0149]步骤1007:如果相同,则调用系统API接口 GetWindowRect向所述键值项窗口句柄hwnd发消息,获取所述键值项窗口的坐标,根据所述键值项窗口的坐标和当前遍历的键值项的坐标计算出该当前遍历的键值项在键值项窗口内的相对坐标,作为所要获取的键值项的坐标。
[0150]图11示出了利用本发明在Windows系统下注册表编辑器中修改键值项的另一种实施方式流程图。如图11所示,该方法包括:
[0151]步骤1101:利用上面方法中已介绍的确定的键值项坐标pos,通过系统API接口mouse_event 传递 M0USEEVENTF_RIGHTD0WN&M0USEEVENTF_RIGHTUP 参数模拟鼠标右键操作;[0152]步骤1102:调用系统 API 接口 FindWindow&EnumChildWindows 查找窗口ClassName= “编辑字符串”的输入框的句柄hedit,调用系统API接口 SendMessage向此输入框句柄hedit发送WM_SETTEXT的消息号,参数为要修改的内容;
[0153]步骤1103:调用系统 API 接口 FindWindow&EnumChildWindows 查找窗口WindowsName^i‘确定”的按钮句柄hbtn,调用系统API接口 PostMessage向该按钮句柄hbtn发送BN_CLICKED消息,以完成键值项的修改操作。
[0154]本领域技术人员应当理解,上面仅示例性的介绍了本发明所提出的注册表操作方法的一部分【具体实施方式】,其中仅涵盖了对注册表的一部分操作方式,而其他对注册表的具体操作都可以沿用上述方法,对其进行扩展或变形,只要是通过调用界面函数对注册表进行相应的操作均涵盖在本发明的保护范围之内。
[0155]从上述【具体实施方式】可以看出,本发明提出的上述方案中全部流程均调用界面函数对注册表进行操作,而不是调用系统提供的注册表函数,比如找窗口、输入文字、点击按钮等函数对注册表进行操作。其能够完美的在防护软件监控的系统环境下,实现对注册表的安全操作,同时避免了自己的执行程序不会被防护软件误报导致功能失效等情况,本方法不只限于对杀毒软件或者防护软件的环境,同时也适用于各种Windows正常环境,能够保证最大的兼容性。
[0156]需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
[0157]图12示出了本发明提出的一种操作注册表的装置的模块化结构图。如图12所示,该装置包括:
[0158]启动模块1201,其用于启动 注册表编辑器;
[0159]获取模块1202,其用于获取所述注册表编辑器的窗口句柄;
[0160]操作模块1203,其用于根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。
[0161]下面依然以Windows操作系统为例详细说明本发明提出的操作注册表的装置所包括的上述各个模块实现的功能,本领域技术人员应当知道,该方法不仅限于Windows系统,其还适用于能够通过注册表编辑器对注册表进行操作的其它图形化界面系统。
[0162]启动模块1201,其用于启动注册表编辑器。
[0163]在Windows系统中,启动注册表编辑器的方式可以有多种,如通过系统提供的API接口模拟用户手动操作打开注册表编辑器,或者调用系统提供的API接口直接启动注册表编辑器等。
[0164]可选地,如果模拟用户手动操作来打开注册表编辑器,可以通过模拟Win+R的系统热键调起“运行”窗口,并在打开路径中输入Register, exe,然后模拟用户鼠标点击该“运行”窗口上的“确定”,启动注册表编辑器。
[0165]启动模块1201可通过多种方式来完成注册编辑器的启动,其中一种如图3所示,其可以通过调动系统接口先调出“运行”窗口,然后调用系统接口查找获得“运行”窗口上输入框句柄,并调用系统接口向所述输入框句柄输入注册表编辑器的启动程序名称"Register, exe”,并模拟鼠标点击“运行”窗口上的“确定”按钮,整个过程都是调用界面函数模拟用户启动注册表的方式启动所述注册表编辑器。由于在上面已经详细介绍了图3示出的内容,在此就不再赘述。
[0166]当然上述方式中,也可以通过快捷键等键盘模拟方式进行操作。另外,每种操作系统中注册表编辑器的打开路径不尽相同,可以根据实际情况模拟用户操作来启动注册表编辑器。
[0167]获取模块1202,获取所述注册表编辑器的窗口句柄。在Windows系统中,每个打开的窗口都具有特定的句柄,通过获得该句柄调用相应的界面函数即可对其进行操作。
[0168]依据上面所举的例子,通过模拟用户手动操作打开注册表编辑器后,可以在一个超时时间5s内,轮询调用系统API接口 “FindWindow”,查找窗口“ClassName=RegisterWindowClass”的句柄,即查找获得Register, exe注册表编辑器的窗口句柄。
[0169]操作模块1203,其根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。具体地,对注册表的操作包括导入或导出注册文件,新建、删除或重命名键或键值项,修改键值项等。对于上述这些对注册表的操作,都可以通过调用界面函数来实现。
[0170]可选地,所述操作模块包括菜单项操作模块,其用于获取注册表编辑器的菜单项,模拟鼠标和/或键盘对所述菜单项进行操作。
[0171]所述菜单项操作模块获取注册表编辑器的菜单项具体实现过程如下:
[0172]获取系统所有顶级窗口句柄,形成第一窗口句柄列表;
[0173]在预定位置模拟鼠标点击操作;
[0174]在预定时间间隔内,再次获取系统所有顶级窗口句柄,形成第二窗口句柄列表;
[0175]获取第一窗口句柄列表和第二窗口句柄列表的差集;
[0176]从所述差集中获取菜单的窗口句柄;
[0177]根据所述菜单的窗口句柄获取菜单项。
[0178]可选地,所述预定位置包括键值项的坐标和/或注册表编辑器的菜单栏。对于不同的操作,可以选择直接在相应键值项上模拟鼠标右键选择对应的菜单进行操作,也可以直接在注册表编辑器的菜单栏上进行操作。例如,对于导入、导出、新建和重命名操作,可以选择利用注册表编辑器的菜单栏进行操作,而其他操作可以选择在相应键值项上模拟鼠标右键选择对应的菜单进行操作,当然如导出、新建和重命名等操作两种方式皆可。
[0179]下面以新建键和/或键值项为例来详细说明菜单项操作模块获取注册表编辑器中菜单项的具体流程。
[0180]首先,该模块通过系统API接口 EnumChildWindows获取系统的所有顶级窗口句柄列表,记为第一窗口句柄列表hwndlistl ;在预定的位置处,通过操作系统提供的API接口mouse_event 传递参数 MOUSEEVENTF_RIGHTDOWN&MOUSEEVENTF_RIGHTUP,以模拟鼠标右键操作。
[0181]其次,在一个超时时间内(默认5s),循环调用系统API接口 EnumChildWindows获得一份系统中当前所有的顶级窗口句柄,记为第二窗口句柄列表hwn d I i s 12 ;计算第二窗口句柄列表hwndlist2与第一窗口句柄列表hwndlistl的差集;在所述差集中查找ClassName=#32768的句柄,即弹出菜单项的窗口句柄hwnd ;[0182]之后,通过系统API接口 GetMenu将所述弹出菜单项的窗口句柄hwnd转换为菜单句柄hmenu ;根据所述菜单句柄hmenu调用系统API接口 GetMenuItemCount获取此菜单中所有菜单项个数,并调用系统API接口 GetMenuItemInfo遍历每一个菜单项,获取其文字信息为“新建”的菜单项,并返回该菜单项所在的位置坐标(x,y),模拟用户将鼠标光标放置在该位置坐标U,y),并根据上面介绍的步骤查找弹出菜单,如此递归继续查找到文字信息为“项”的菜单项所对应的位置坐标;
[0183]最后,在所找到的“项”菜单项对应的位置坐标处,模拟用户鼠标点击操作,并模拟用户的键盘操作,输入新建键的名称,并模拟回车操作,完成键的新建操作。
[0184]键值项的新建操作与上述键的新建操作类似,所不同的是最后查找的是文字信息为“字符串值”、“二进制值”、“DWORD值”、“多字符串值”或“可扩充字符串值”等。
[0185]上述预定的位置可以是注册表编辑器窗口中左边界面上要新建的键的父键坐标,也可以是所述父键对应的右边界面上任意位置的坐标。
[0186]另外,所述新建操作还可以通过获取注册表编辑器上的系统菜单来完成,具体为:获取注册表编辑器的窗口句柄,并根据所述窗口句柄获取其菜单句柄,根据所述菜单句柄找到“编辑”菜单项的位置坐标后,模拟将鼠标光标置于该位置坐标处,并查找弹出菜单,如此递归继续查找到文字信息为“项”的菜单项所对应的位置坐标,并进行相应的新建操作。
[0187]可选地,所述操作模块还包括:坐标获取模块,其用于获取展开键坐标和/或展开键值项坐标,并模拟鼠标进行操作。
[0188]其中,坐标获取模块获取展开键坐标的具体实现过程如下:
[0189]首先,获取注册表编辑器中根键的界面句柄;
[0190]其次,根据根键的界面句柄,调用界面函数从树根逐层查找,获取展开键的坐标。
[0191]其中,所述坐标获取模块获取键值项坐标的具体实现过程如下:
[0192]首先,模拟鼠标操作,在获取到的展开键的坐标位置执行点击操作;
[0193]其次,查找键值项所在界面的界面句柄;
[0194]最后,根据所述键值项所在的界面句柄,从该界面列表中遍历查找,并获取所述键值项的坐标。
[0195]下面以修改键值项为例简要说明一下该操作注册表的装置对注册表编辑器进行操作的具体实现过程。
[0196]首先,启动模块通过调用系统接口运行注册表编辑器Regedit ;
[0197]其次,所述获取模块获取Regedit的界面句柄;
[0198]再次,所述操作模块拆分待修改的目标键值项路径;比如需要修改键HKEY_CURRENT_CONFIG \ Software \ Fonts的键值项LogPixels的键值内容,则第一次则将其拆分成键 HKEY_CURRENT_CONFIG \ Software \ Fonts 和键值项 LogPixels ;键 HKEY_CURRENT_C0NFIG \ Software \ Fonts位于Regedit界面左边部分的树状结构中,而键值项LogPixels则位于Regedit界面右边部分的列表结构中;
[0199]之后,操作模块根据Regedit的窗口句柄,查找Regedit界面左边部分的根键子键的窗口句柄;并根据根键子键的窗口句柄,调用GUI函数从树根层层查找,定位子键的坐标位置,比如最终定位找到HKEY_CURRENT_C0NFIG \ Software \ Fonts中的子键Fonts的坐标位置;在找到子键的坐标位置后,模拟鼠标操作,点击定位到的坐标位置,使该子键对应的键值项信息显示在Regedit界面右部的列表结构中;
[0200]最后,获取Regedit界面右部的根键值项的界面句柄,并根据所述根键值项的界面句柄,遍历所述列表结构,最终定位待查找键值项的坐标位置;在所找到的键值项的坐标位置上,模拟鼠标右键操作,弹出菜单项,并从所述菜单项中选择“修改”菜单项进行修改操作。
[0201]下面详细说明根据本发明提出的操作注册表的装置在注册表编辑器中获取展开键坐标和获取键值项坐标的具体实现过程。
[0202]获取注册表编辑器中展开键坐标的具体实现过程如下:
[0203]首先,操作模块通过系统API接口 FindWindow查找类型SysTreeView32的窗口,获取注册表编辑器中键(注册表编辑器左边界面)的窗口句柄hwnd;调用系统API接口 SendMessage向所述键窗口句柄hwnd发送消息号TVM_GETNEXTITEM,其参数为“TVGN_ROOT”,以获取注册表编辑器中根键HKEY_CLASSES_R00T的信息hitem ;调用系统API接口WriteProcessMemory申请一块内存rectAddr,其结构体形式为TVITEM ;
[0204]其次,操作模块调用系统API接口 SendMessage向所述键窗口句柄hwnd发送消息号TVM_GETNEXTITEM,参数为“1”,获取所述根键HKEY_CLASSES_R00T下的第一个键信息item,并保存到内存块rectAddr中,同时把其父节点即根键HKEY_CLASSES_R00T的信息hitem也保存到内存块rectAddr中;调用系统API接口 ReadProcessMemory从内存块rectAddr中读取所述第一个键信息item,该键信息包含text和rect,分别表示文字信息和位置坐标;
[0205]之后,操作模块调用系统API接口 GetWindowRect向所述键窗口句柄hwnd发消息,以获取该键窗口句柄hwnd的位置坐标rect ;根据所述键窗口句柄hwnd对应的位置坐标rect和所述第一个键信息item中包含的位置坐标rect计算出该第一个键在所述键窗口的相对坐标pos ;
[0206]最后,操作模块用同样的方法,循环查找第一个键item的子键childHitem,获取子键childHitem的文字信息和坐标位置,匹配其文字信息是否与给定的键名相同;
[0207]如果相同,则调用系统API接口 SendMessage给所述键窗口句柄hwnd发消息TVM_EXPAND,参数为TVE_EXPAND,使该第一个键展开,并显示在界面居中位置,调用系统API接口 SendMessage给所述键窗口句柄hwnd发消息TVM_SELECTITEM,参数为TVGN_CARET,以选中所述第一个键;
[0208]如果不相同,则依次查找与所述第一个键相邻的下一个键nextitem,并使用同样的方法,循环查找下一个键nextitem的子键,直到找到给定的键,并获取该给定键的坐标。
[0209]获取注册表编辑器中键值项坐标的具体实现过程如下:
[0210]首先,操作模块通过系统API接口 FindWindow查找类型SysListView32的窗口,获取键值项(注册表编辑器右边界面)的窗口句柄hwnd ;并调用系统API接口 SendMessage向所述键值项窗口句柄hwnd发送LVM_GETITEMCOUNT的消息号,获取所述键值项窗口句柄hwnd对应的键值项数量count,即键值项行数;
[0211]其次,操作模块遍历所述键值项窗口中的每行键值项对应的信息item,行号为index,调用系统API接口 WriteProcessMemory申请一块内存rectAddr,其结构体形式为LVITEM ;调用系统API接口 SendMessage向所述键值项窗口句柄hwnd发送LVM_GETITEMTEXT的消息号,参数为当前所遍历的键值项行号index,获取当前遍历的键值项信息item,并保存到内存块rectAddr中;
[0212]最后,操作模块调用系统API接口 ReadProcessMemory从内存块rectAddr中读取当前遍历的键值项信息item,该键值项信息item包含文字信息和该键值项对应的坐标,过匹配该键值项信息item包含的文字信息是否与给定的键值项名相同;
[0213]如果不相同,则继续遍历查找下一行;
[0214]如果相同,则调用系统API接口 GetWindowRect向所述键值项窗口句柄hwnd发消息,获取所述键值项窗口的坐标,根据所述键值项窗口的坐标和当前遍历的键值项的坐标计算出该当前遍历的键值项在键值项窗口内的相对坐标,作为所要获取的键值项的坐标。
[0215]Windows操作系统下在注册表编辑器中修改键值项的具体实现过程如下:
[0216]首先,利用上面方法中已介绍的确定的键值项坐标pos,操作模块通过系统API接口 mouse_event 传递 MOUSEEVENTF_RIGHTDOWN&MOUSEEVENTF_RIGHTUP 参数模拟鼠标右键操作;
[0217]其次,操作模块调用系统API接口 FindWindow&EnumChi IdWindows查找窗口ClassName= “编辑字符串”的输入框的句柄hedit,调用系统API接口 SendMessage向此输入框句柄hedit发送WM_SETTEXT的消息号,参数为要修改的内容;
[0218]最后,操作模块调用系统API接口 FindWindow&EnumChiIdWindows查找窗口WindowsName^i‘确定”的按钮句柄hbtn,调用系统API接口 PostMessage向该按钮句柄hbtn发送BN_CLICKED消息,以完成键值项的修改操作。
[0219]上面所介绍的具体实现过程均是以启动模块和获取模块已经启动了注册表编辑器并获得了注册表编辑器的窗口句柄为前提,且上面仅示例型的介绍了注册表的一部分操作过程,本领域技术人员应当能够通过上面介绍的流程毫无疑义地得出注册表的其他操作流程。
[0220]由于所述装置实施例基本相应于前述图1所示的方法实施例,故本实施例的描述中未详尽之处,可以参见前述实施例中的相关说明,在此就不赘述了。
[0221]ell、如权利要求8所述的操作注册表的装置,其特征在于,所述操作模块包括:
[0222]坐标获取模块,其用于获取展开键坐标和/或展开键值项坐标,并模拟鼠标进行操作。
[0223]cl2、如权利要求11所述的操作注册表的装置,其特征在于,所述坐标获取模块如下获取展开键坐标:
[0224]获取注册表编辑器中根键的界面句柄;
[0225]根据根键的界面句柄,调用界面函数从树根逐层查找,获取展开键的坐标。
[0226]cl3、如权利要求11或13所述的操作注册表的装置,其特征在于,坐标获取模块如下获取展开键值项坐标:
[0227]模拟鼠标操作,在获取到的展开键的坐标位置执行点击操作;
[0228]查找键值项所在界面的界面句柄;
[0229]根据所述键 值项所在的界面句柄,从该界面列表中遍历查找,并获取所述键值项的坐标。
[0230]cl4、如权利要求10所述的操作注册表的装置,其特征在于,所述预定位置包括展开键值项的坐标和/或注册表编辑器的菜单栏。
[0231]本发明提出的上述方案可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、机顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
[0232]本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0233]最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0234]以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之 内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种操作注册表的方法,其特征在于,包括: 启动注册表编辑器; 获取所述注册表编辑器的窗口句柄; 根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。
2.如权利要求1所述的操作注册表的方法,其特征在于,所述通过调用界面函数对所述注册表编辑器进行操作包括:获取注册表编辑器的菜单项,模拟鼠标和/或键盘对所述菜单项进行操作。
3.如权利要求2所述的操作注册表的方法,其特征在于,获取注册表编辑器的菜单项包括: 获取系统所有顶级窗口句柄,形成第一窗口句柄列表; 在预定位置模拟鼠标点击操作; 在预定时间间隔内,再次获取系统所有顶级窗口句柄,形成第二窗口句柄列表; 获取第一窗口句柄列表和第二窗口句柄列表的差集; 从所述差集中获取菜单的窗口句柄; 根据所述菜单的窗口句柄获取菜单项。
4.如权利要求1所述的操作注册表的方法,其特征在于,所述通过调用界面函数对所述注册表编辑器进行操作包括:获取展开键坐标和/或键值项坐标,并模拟鼠标进行操作。
5.如权利要求4所述的操作注册表的方法,其特征在于,获取展开键坐标包括: 获取注册表编辑器中根键的界面句柄; 根据根键的界面句柄,调用界面函数从树根逐层查找,获取展开键的坐标。
6.如权利要求4或5所述的操作注册表的方法,其特征在于,获取键值项坐标包括: 模拟鼠标操作,在获取到的展开键的坐标位置执行点击操作; 查找键值项所在界面的界面句柄; 根据所述键值项所在的界面句柄,从该界面列表中遍历查找,并获取所述键值项的坐标。
7.如权利要求3所述的操作注册表的方法,其特征在于,所述预定位置包括键值项的坐标和/或注册表编辑器的菜单栏。
8.一种操作注册表的装置,其特征在于,包括: 启动模块,其用于启动注册表编辑器; 获取模块,其用于获取所述注册表编辑器的窗口句柄; 操作模块,其用于根据所述窗口句柄通过调用界面函数对所述注册表编辑器进行操作。
9.如权利要求8所述的操作注册表的装置,其特征在于,所述操作模块包括: 菜单项操作模块,其用于获取注册表编辑器的菜单项,模拟鼠标和/或键盘对所述菜单项进行操作。
10.如权利要求9所述的操作注册表的装置,其特征在于,所述菜单项操作模块如下获取注册表上的菜单项: 获取系统所有顶级窗口句柄列表; 在预定位置模拟鼠标点击操作;在预定时间间隔内,获得系统所有顶级窗口句柄列表;比较第一次和第二次分别获得的所有顶级窗口句柄列表的差集;从所述差集找到弹出菜单的窗口句柄; 根据所述菜单的窗口句柄获得相应的菜单项。
【文档编号】G06F21/50GK103593186SQ201310556281
【公开日】2014年2月19日 申请日期:2013年11月11日 优先权日:2013年11月11日
【发明者】张 杰, 汤倩 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1