Rundll32.exe javascript

9

我刚看到一份关于使用命令行的程序的报道(2014年8月)

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication"

这是怎么运作的?我原以为第一个参数应该是DLL的名称(mshtml),但是rundll32是如何解析命令行的呢?

rundll参考文献: http://support.microsoft.com/kb/164787


1
我很好奇这是一个为什么会被踩的问题。这是一个非常有趣的问题。虽然在编写程序时不一定会经常遇到,但绝对是一个机会,让某人提供关于Windows低级别内容的详细解释。(就像下面@TheQwerty所做的那样) - Ryan Ransford
1个回答

17

这里有一个很好的解释:http://thisissecurity.net/2014/08/20/poweliks-command-line-confusion/

用相同的例子进行总结:

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";alert('foo');
  1. RunDll32
    1. 解析命令并确定目标DLL为:javascript:"\..\mshtml
    2. 尝试将其作为绝对路径加载失败。
    3. 在工作目录或路径中找不到匹配项。
    4. 找不到该模块的清单javascript:"\..\mshtml.manifest
    5. 调用LoadLibrary
  2. LoadLibrary
    1. 添加扩展名并尝试加载javascript:"\..\mshtml.dll
    2. 将其视为相对路径,从虚假的javascript:"\目录向上进行。
    3. 搜索mshtml.dll,在系统目录中找到它。
    4. 使用RunHTMLApplication作为入口点加载DLL。
  3. RunHTMLApplication
    1. 尝试执行命令";alert('foo');
    2. 由于是无效的Javascript,因此调用GetCommandLine以获取原始命令,返回值为javascript:"\..\mshtml,RunHTMLApplication ";alert('foo');
    3. 尝试打开此URI,因此询问系统如何处理通常在注册表中设置为Microsoft HTML Javascript Pluggable Protocoljavascript协议。
    4. 然后执行Javascript:"..\mshtml,RunHTMLApplication ";alert('foo');
  4. Javascript
    1. 第一个语句创建一个字符串并不对其执行任何操作,这足够有效以不引起错误。
    2. 继续执行脚本的其余部分。

这是非常聪明的编程技巧,或者是一种难以言喻的折衷方案,但无论如何都很出色。不管怎样,这不是一种受支持的技术,很可能很快就会被阻止。 - david
今天在更新后的Windows 10上仍然可以使用。不太可能很快修复。 - karliwson
RunHTMLApplication 的文档在哪里可以找到? - Chef Gladiator
@ChefGladiator,无效的JavaScript以双引号开头,因此它在技术上是一个未关闭的字符串。RunHTMLApplicationmshta.exe用于打开hta文件的未记录方法。答案中的链接更好地解释了这一点。 - TheQwerty
感谢@TheQwerty...如果您将该字符串粘贴到浏览器地址栏中,它将被执行而不会出现任何问题。因此,我敢称其为有效的JavaScript代码。这是不幸的“Windows脚本宿主”子系统的一部分。我发现它非常有用。 - Chef Gladiator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接