Menu
Woocommerce Menu

jQuery搜索框自动补全功能插件实现,右键添加以管理员身份运行命令提示符菜单

0 Comment


  

nt!ExInterlockedPopEntrySList()
调用时,kd.exe
就卡住了,无法继续追踪此后的调用链。从稍早的栈回溯信息来看,与源码中和我们预测的调用序列大致相符,只是不晓得为啥在
nt!ObpAllocateObjectNameBuffer() 中,为了给传入的驱动对象名称
“\Device\QQProtect”
分配内核内存,调用 nt!ExInterlockedPopEntrySList(),而后者却无法追踪。。。。是虚拟机环境的缘故,还是原子操作类函数的不可分割性质?

 

  第一行就是注册表的版本声明吧,让系统知道这是个注册表文本文件要导入到注册表,就像
html 声明 <!DOCTYPE html> 差不多吧,和上面的一样 这个
[HKEY_CLASSES_ROOT\Directory\Background\shell\runas] 就是 shell
该项下的新建个名为  runas 的项,runas
是以管理员身份运行的所用到的,你可以注册表其它项可以看到
runas,如前言中的
batfile等项下有此项,应该是右键此类格式文件时右键中有以管理员身份运行的意思。而在此处(空白处右键)没有,就以此来实现右键中添加
以管理员身份运行命令提示符 的选项,其实就是普通的启动命令提示符 不过通过
runas 我们才得以管理员身份运行。

列出的数据相当于执行解引操作符 *
后的结果
),第二个参数是 UNICODE_STRING
结构的地址,对应源码定义中的一枚 _UNICODE_STRING
指针,该结构中存储的是我们驱动在注册表中的完整路径:

 

  关于命令的解释就简单说一下吧,
HKCR 是注册表五大主目录树之一的 HKEY_CLASSES_ROOT
的简写,本目录是程序运行时必要的信息,还有其它四项就不一一说明了,详情可以百度。后面这些参数
像 /f /v /d 可以在命令提示符中输入 reg add /?
进行详细的了解,HKCR\.bat\ShellNew 中ShellNew是新建项的名称
当然可不上名称这么简单,就是这个项确定该文件类型是否在右键新建选项中,还有其下名为
NullFile 的字符串值 。 REG-SZ 就是表示字符串值 REG_EXPAND_SZ
则表示可拓展字符串值 不止这两种还有八种左右吧 不详说了。后面的 “”
就是前面对应字符串值的值 这里表示为空。

银河国际网址手机版 1

源码如下:


参数
“logo” 指定要把整个调试过程的输出信息写入日志;

 


为了找出故障原因,我在分配
OPEN_PACKET 逻辑的前面利用内联汇编添加了一个软中断 “__asm{ int
3; } 

”,宿主机器上启动内核调试器 kd.exe,我的启动参数像是这样:

最近用nodeclub实现股票的输入关键字自动补全股票信息进行搜索功能,原先用jQuery-ui,结果jQuery-ui库太大,所以考虑用其他插件,最终选择使用autocomplete.js,控件简单用着方便。留下记录

  当然爱折腾的人就不会满足这样暗操作,就可以通过命令
regedit 或软件 Registry Workshop进入注册表进行修改, 路径
HKEY_CLASSES_ROOT 目录下以 .开头的就是Windows系统中文件格式的后缀名
展开新建名为 ShellNew 的项 然后在此项中(即右侧框中)建立个名为 NullFile
的字符串值
就OK了。(Tips:像在资源管理器中一样输入字母或文字就可定位对应文件夹位置,前提就是使定位的内容处于活动状态
鼠标激活状态)
同样的我们就可以通过此方法清除新建中多余或不常用的文件格式,像 Windows
7中的公文包可以找到 Briefcase 将其下的 ShellNew 项删除
联系人选项对应后缀 .contact 日记本选项后缀 .jnt 。 Windows 7 8 10
的各选项都不大一样,可能有些后缀名也不一样,跟要实际情况吧。(提醒:
为了防止不必要的损失,删除注册表项之前备份好注册表)

总而言之
,基于以上理由我无法继续跟进到 ObpLookupObjectName()
里面查看它是否执行了 IopParseDevice()
回调,从而无法确定究竟为啥后者返回 C0000024。

 

  复制粘贴到文本文件将其保存为
.reg 为后缀的注册表文件,双击导入注册表这个名为
以管理员身份运行命令提示符的选项
就添加到了右键中,按Shift键右键就出现了。什么??!
还要按Shift键?不急听我慢慢道来。

以下图为例子吧,传递给 nt!ExAllocatePoolWithTag()
的三个参数(从左到右)就是
00000000(NonPagedPool),00000070(我硬编码的值),704f6f49(ASCII
字符串“pOoI”)
,同理,传递给 hideprocess!DriverEntry() 的第一个参数
867c3550 是 _DRIVER_OBJECT 结构的地址,由I/O
管理器加载它时为它分配(注意与源码中 DriverEntry() 定义的一枚
_DRIVER_OBJECT 指针不同,“Args to
Child”

<!doctype html>
<html lang=”en-US”>
<head>
  <meta http-equiv=”Content-Type”
content=”text/html;charset=utf-8″>
  <title>Input Autocomplete Suggestions Demo</title>
  <link rel=”stylesheet” type=”text/css” media=”all”
href=”style.css”>
  <script type=”text/javascript”
src=”js/codedata.js”></script>
  <script type=”text/javascript”
src=”js/jquery-1.9.1.min.js”></script>
  <script type=”text/javascript”
src=”js/jquery.autocomplete.min.js”></script>
  <script type=”text/javascript”
src=”js/currency-autocomplete.js”></script>
</head>

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\runas]
"icon"="C:\\Windows\\System32\\shell32.dll,303"
@="以管理员身份运行命令提示符"
"Extended"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command]
@="cmd.exe /t:4f /s /k  pushd \"%V\" "

首个传入的参数
NonPagedPool
为不可换页池,其内的数据无法被换出物理内存,该常量对应的数值为
“0”:

具体源码地址  

 比如要在右键新建选项中添加
Bat
批处理文件,我们可以在(管理员)命令提示符下运行下面两条命令即可。此命令提示符一定要是具有管理员权限否则权限不够,在开始菜单中的
Windows 系统 或 附件
文件中找到命令提示符右键以管理员身份运行,若登录的是系统内置的管理员账户
Administrator
就直接打开即可,判断是否为管理员权限可以通过标题栏判断,若是会标有
管理员: C:\WINDOWS\system32\cmd.exe 等字样。

因为
OPEN_PACKET 结构同样没有公开的文档来描述,所以要么在我们的驱动源码中用 
#include
包含定义它的头文件,要么直接复制定义的那一部分黏贴进来。很显然,后者比较轻松——OPEN_PACKET
在内核源码的 “iomgr.h
中定义,而该头文件又嵌套包含了一堆杂七杂八的内核头文件,要理清这些嵌套包含关系很麻烦,而且最重要的是,其中一些头文件定义的数据类型会与驱动开发中用的 “ntddk.h”
和“wdm.h”重复,引起编译器的抱怨。
所以直接在 “iomgr.h
中搜索字串 “typedef struct
_OPEN_PACKET”,把找到的定义块拷贝进来即可。

<body>
  <div id=”w”>
    <div id=”content”>
      <h1>World Currencies Autocomplete Search</h1>
      <p>Just start typing and results will be supplied from the
JavaScript. Check out <a
href=”
Autocomplete</a> on Github.</a></p>
      
      <div id=”searchfield”>
        <form><input type=”text” name=”currency”
class=”biginput” id=”autocomplete”></form>
      </div><!– @end #searchfield –>
      
      <div id=”outputbox”>
        <p id=”outputcontent”>Choose a currency and the results
will display here.</p>
      </div>
    </div><!– @end #content –>
  </div><!– @end #w –>
</body>
</html>

  ”icon”=”C:\\Windows\\System32\\Shell32.dll,303″

银河国际网址手机版 2
——————————————————————————————————————————————————————————————————

 

继续按下
t” 单步执行,如下图所示,你可以看到,ExAllocatePoolWithTag()
的第二个参数,分配的内核内存大小为 0x70
字节,因为我在宏定义中硬编码了这个值,而不是用 sizeof(OPEN_PACKET)
表达式让编译器计算;另一方面,图中的 “dt” 命令也证实了它的大小为
0x70 字节。

  再往下看,可以看到这些
VBSFILE batfile regfile
等等这些都是对应文件格式后缀名。有什么联系呢?展开一看 shell shellex
open command 这些单词不陌生吧,大概可以猜出这里应该就是打开方式什么的
再看看 command 项中字符串值的值为 “%SystemRoot%\System32\WScript.exe”
“%1” %* 明白了吧 大概就是这些文件类型打开方式
默认打开方式就可能种此有关联。还有其它像 Edit Print runas
这些的就和编辑、打印、运行身份有关咯,更多的这些笔者就未深入了解了,有折腾精神的你不妨玩玩否,不过由于不当的操作弄崩了系统笔者就不管哟~
我觉得再次提醒折腾之前备份好注册表才是明智之举。

我想可能是因为内核源码版本的变化,导致相关例程的判断逻辑也不一样了,不能根据前一版源码的逻辑来编写预计运行在后一版内核上的驱动。

  大多数Windows用户,右键中默认新建的文件格式就那么几种。这可能对我们爱折腾或者特殊要求的人员来说可能有点不方便,比如说要创建个
.reg .bat .vbs等格式的文件,就需要新建个文本文件修改后缀为
或者是通过对应软件保存
.reg .bat
.vbs等。是不是有点麻烦哟,可不可以在右键中的新建选项中添加我们所想要的文件类型呢。在大Windows的环境下,这些没什么问题的。

银河国际网址手机版 3

  Regedit
注册表是Windows系统下一个好玩而又强大的东西,这里注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft
Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。算是Windows系统的一个的核心吧,总之这里面的设置关联着许多我们所接触的UI交互界面,比如可以选择去掉快捷方式图标的小箭头、管理员身份标识的小盾牌等等,像本文章添加新建选项的文件格式也是不在话下的。

我把自己的驱动实现成按需加载,也就是利用服务控制管理器sc.exe)发出命令来动态加载和卸载,实现此功能的相应批处理文件内容如下图,注意该文件要放在虚拟机中执行,“start=
demand” 表明通过 sc.exe 按需启动
;“binpath”
就是驱动文件存放的磁盘路径
,假设我的驱动名为
hideprocess.sys,执行该批处理任务后,就在相关的注册表位置添加了一项,往后只需在
cmd.exe 中执行 “sc.exe start/stop hideprocess” 就能够动态加卸载。

**  ”Extended”=””
就表示在 runas 项下新建个值为空白名为 Extended 的字符串值,这个就是按
Shift 键的所在了,删除此行就无需按下 Shift
再右键,直接右键就可见。不过若不想直接右键可见就可以加上此行,这个就和
Windows 7 下按住Shift右键会出现一个 在此处运行命令提示符 (Windows 10
下是 Powershell 一个比命令提示符cmd.exe
更强大灵活的工具)选项的方式类似,添加此项后按下Shift右键系统的
在此处打开命令提示符窗口/在此处打开Powershell窗口会和刚才添加的一起出现在选项中。

——————————————————————————————————————————————————————————————————

  下面所述就是在右键就添加
以管理员身份命令提示符 选项。运行命令提示符嘛就 Windows + R 输入 cmd
回车就打开了、按下Shift再右键选项在此处打开命令提示符窗口或者在开始菜单中找、再不者就去
C:\Windows\System32 或 C:\Windows\SysWOW64
目录去找。这些在登录系统内置的管理员账户 Administrator
的情况下不是问题了,直接打开就是管理员权限。如果不是呢?
就要到开始菜单找到命令提示符然后右键管理员身份运行或者到资源管理器目录找到再右键以管理员身份运行。像笔者未启用系统内置管理员
Administrator ,此方法适用没有启用系统内置管理员 Administrator 账户的
Windows 用户,当然想玩也不是不可以。

——————————————————————————————————————————————————————————————————

  [HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command]

银河国际网址手机版, 


然而,OPEN_PACKET
结构中唯有一个字段不是 “原生” 定义的——这就是 “PDUMMY_FILE_OBJECT”
类型,需要包含其它头文件才不致使编译器报错。


另外,由于
IopAllocateOpenPacket() 等价于
ExAllocatePoolWithTag(),而后者通常返回泛型指针(“ PVOID ,亦即 void
”),
所以我强制把它转型为与
“openPacket” 一致的类型。
万事俱备,“东风”
就在于调用 ObReferenceObjectByName() 时,为第七个参数传入“openPacket”
即可,上图显示的很清楚了。

 

解决办法也很简单,我们的驱动中,不要依赖编译时刻的计算,直接把
Size” 字段的值硬编码为 0x70 不就好了?

  上码:

银河国际网址手机版 4

  @=”以管理员身份运行命令提示符”
此项将命名右键中选项的名称,大意是将 runas 项下的 (默认) 空白值修改为
以管理员身份运行命令提示符,在Windows的注册表中每项下都有一个名为 (默认)
的空白(REG_SZ)字符串值,你也可以删除此行 此时选项中的名称为
以管理员身份运行(A) 系统就分配默认的名称啦。你想怎样 it’s up to you
。只是修改过后就没有了绑定的按键了 不过应该影响不大吧
,大部分我们是以鼠标进行操作的。**

银河国际网址手机版 5


接下来一直单步执行到调用
ObReferenceObjectByName() 前夕,在此处我们要 “步入
它的内部,进行故障排查,所以按下 “t
跟进,这里有一个小技巧,我们已经分析过 ObReferenceObjectByName()
的源码,知道它会调用很多函数,而且大致清楚问题出现在
ObpLookupObjectName() 里面,所以指令
tc”可以跟踪到每个函数调用处停止,再由用户决定是否跟进该函数内部。

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图