必威体育Betway必威体育官网
当前位置:首页 > IT技术

从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析

时间:2019-10-13 17:12:12来源:IT技术作者:seo实验室小编阅读:82次「手机版」
 

rundll

今年7月份,国外研究机构发现了一个比较新型的恶意软件,这个恶意软件不会在系统上安装任何文件,而是藏身在windows的注册表中通过rundll32.exe执行javascript代码

听上去确实很有意思,通过rundll32.exe来执行js代码,那么它究竟是怎么实现的呢?我们一起来研究下。

实现代码很简单

1

rundll32.exe JavaScript:"\..\mshtml,RunHTMLAPPlication ";alert('foo');

在cmd下运行后就能弹窗

t017efc836c9c866329.png

下面我们一起来看看究竟是怎么回事。

Rundll32是什么

先看下MSDN给出的介绍

http://support.microsoft.com/kb/164787/

从介绍中可以看出,Rundll32的作用是执行DLL文件中的内部函数

命令行格式如下

1

RUNDLL32.EXE <dllname>,<entrypoint> <optional arguments>

EntryPoint就是要执行的内部函数,他的原型如下

1

void CALLBACK EntryPoint(HWND hwnd, Hinstance hinst, LPSTR lpszCmdLine, int nCmdShow);

下面我们来试着解决为什么rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";alert(‘foo’);这个语句能执行js。

Rundll32分析

参数

Rundll32首先要调用Parsecommand函数把传进来的参数分割,函数会搜索逗号(‘,’, 0x2C)来定位DLL名字。搜索空格(‘ ‘, 0x20)来定位入口点。

/d/file/news/20190925/t01be23c35a6ab98cc3.png

在我们输入的命令中,ParseCommand返回javascript:"\..\mshtml作为DLL名称,RunHTMLApplication作为入口点。

t018a1f1038932c1999.png

Dll loader

下面Rundll32会试图读取名称为javascript:"\..\mshtml的DLL。

首先他会尝试调用GetFileAttributes(“javascript:”\..\mshtml”)来读取文件,最终函数会访问C:\Windows\system32\mshtml这个文件,但是由于文件不存在,函数返回-1。

t01764e9143e5161772.png

然后函数会调用SearchPath来寻找DLL名称。这个函数会读取注册表中HKEY_local_MACHINE\SYSTEM\CurrentControlSet\Control\session Manager\SafeProcessSearchmode的键值。关于这点MSDN给出的介绍

http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa365527(v=vs.85).aspx

当他的键值为1时,SearchPath首先搜索系统路径中指定的文件夹,然后搜索当前工作目录。当键值为0时,正好相反,首先会搜索当前工作目录,然后搜索系统路径。

在(on Windows XP / 7 / 8)的默认情况下这个键值不存在,所以SearchPath会试图在当前工作目录(c:\windows\system32)读取mshtml。

t0110552b1adf18d298.png

当都读取不到时,rundll32开始进入下一步工作,GetFileAttributes被重新调用来搜索javascript:”\..\mshtml.manifest。

t01769565e1fc627ecd.png

当这些都失败后Rundll32最终会调用loadlibrary("javascript:"\..\mshtml")。

LoadLibrary是存在在ntdll.dll中包装LdrLoadDll的函数,内在地LdrLoadDll加载了默认的扩展名.dll然后把结果字符串javascript:”\..\mshtml.dll作为了路径。”..”符号代表着跳转到上一级。上一个指令解析到了mshtml.dll(例如foo\..\mshtml.dll 解析为 mshtml.dll)

通过指定mshtml.dll,LdrLoadDll能够调用在系统目录的库。

t01b22eaa4d6f1369bc.png

Rundll32然后根据以前从RunHTMLApplication提取的入口点的名字调用GetProcAddress。到目前为止前缀javascript:似乎没起到什么作用,LoadLibrary("foobar:\"\..\mshtml")工作正常。那么javascript:是怎么被加上的呢?

协议处理

一旦Rundll32得到了入口地址就会调用函数mshtml.dll!RunHTMLAppliction.

该函数并比未出现在微软的官方文档中,但其函数原型可以通过c:\windows\system32\mshta.exe(用来启动.hta文件的程序)对其的调用推断出来:

1

2

3

4

5

6

HRESULT RunHTMLApplication(

 HINSTANCE hinst,

HINSTANCE hPrevInst,

LPSTR szCmdLine,

int nCmdShow

);

该函数与rundll32需要的入口函数很相似:

1

2

3

4

5

6

void CALLBACK EntryPoint(

 HWND hwnd,

 HINSTANCE hinst,

 LPSTR lpszCmdLine,

 int nCmdShow

 );

RunHTMLApplication的第一个参数接受一个窗口句柄而不是模块句柄,该参数用于mshtml注册新窗口类并创建窗口,传一个非实例的参数貌似也不会有啥问题。

第二个参数并未被用到,即使不匹配也没啥事。

最后一个参数nCmdShow由于指定RunHTMLApplication是否显示HTML应用的窗口。Rundll32调用入口的时候总是传入SW_SHOWDEFAULT来显示窗口到默认位置。

我们主要关心的参数是lpszCmdLine,这里传入的应该是””;alert(‘foo’)”。

t01231f52de2ae5b6c1.png

很明显,这不是一个合法的JavaScript语句(末尾缺失双引号)。但本例中却是有效的,因为RunHTMLApplication会忽略该参数,而调用API GetCommandLine(包装在GetCmdLine函数中)来获取参数。

t018b526d133cf736c9.png

完整的命令行包含可执行文件的名字和参数,GetCmdLine会去掉可自行文件名,提取出参数:

t013378767308639c17.png

然后,RunHTMLApplication 会调用CreateUrlMoniker:

t0171cfb77db67dc552.png

该处传入的字符串”javascriopt:”是必须的。

CreateUrlMoniker解析命令行并提取出”:”之前的字符串,即“javascript”。

t01e57543eaf71f24b9.png

CreateUrlMoniker会读取注册表HKCR\SOFTWARE\Classes\PROTOCOLS\handler\  中的值,其中存储了协议和其对应的CLSID。

CreateUrlMoniker会为JavaScript寻找合适的协议处理器

(HKCR\SOFTWARE\Classes\PROTOCOLS\Handler\javascript):

t0188323f26454c57e6.png

该CLSID{3050F3B2-98B5-11CF-BB82-00AA00BDCE0B} 对应 “Microsoft HTML Javascript Pluggable Protocol”。

t01a6d46c852d6e5c51.png

正是因为这样,所以参数必须以”javascript”开始。

在IE中输入javascript:alert('foo') 也是同样处理的机制:

t013e234996b8ab53f3.png

“:”之后的字符串会被JavaScript URL moniker当成JavaScript指令解析执行:

"\..\mshtml,RunHTMLApplication ";alert('foo');

这是一段合法的JavaScript,包含一个字符串"\..\mshtml,RunHTMLApplication " (包括之前被忽略过的双引号!)和一个函数(alert)。

最后RunHTMLApplication  会调用CHTMLApp::Run 并运行JavaScript:

t010bb58984e8f96ece.png

安全 

从安全的角度来看这个问题,通过Rundll32来执行javascript类似执行 HTML应用。也就是说,我们能使用IE的所有功能—对象模型,性能,渲染和协议支持—但却没有开启安全全限制和用户界面。因为域安全特性(同源策略)也是关闭的,所以可以跨域执行脚本,并具有本地文件系统和注册表的读写权限。

通过这个trick,可以让javascript在IE进程以外执行,同时又不受Vista等的保护模式和沙盒等安全策略的限制。所以我认为这个小技巧以后会有更多的利用空间

转自:http://bobao.360.cn/learning/detail/164.html

相关阅读

Advapi32.dll 函数接口说明

Advapi32.dll 函数接口说明             函数原型                              

vi :E325 解决办法!

为什么会出现这种情况?是因为你在使用vim进行编辑时,没有保存直接关闭了终端,所以vim就生成了一个.swp的文件,这个文件就是用来保存,你

java中Executor框架之ThreadPoolExcutor和ScheduledTh

转载自: https://blog.csdn.net/javazejian/article/details/50890554 java多线程-概念&创建启动&中断&守护线程&

JDBC的PreparedStatement启动事务使用批处理executeBa

转自:https://blog.csdn.net/xiong9999/article/details/53258698 JDBC使用MySQL处理大数据的时候,自然而然的想到要使用批处理, 普

Win10 iso安装包中的setup.exe文件如何使用?

Win10 iso安装包中的setup.exe文件如何使用?如果我们想要安装Win10系统,一般都会下载官方原版的Win10操作系统ISO文件,将该文件解压

分享到:

栏目导航

推荐阅读

热门阅读