欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何使用windbg调试javascript

来源:本站整理 作者:佚名 时间:2017-08-18 TAG: 我要投稿

由于javascript具有强大、可用性高,很少被禁用的特点。javascript经常被恶意软件作者用来执行恶意代码。我们之前的文章介绍了如何使用windbg调试.net程序吸引了很多人的关注因此也有了这篇文章如何使用windbg来调试js文件。在这篇文章中我们会介绍如何使用64位版本的wscript.exe来分析javascript代码。强烈建议你在阅读本篇文章之前先阅读我们之前的文章。
Windows系统载入对象
Javascript经常需要载入外部对象目的是获得windows系统默认不具备的额外特性。可以使用 ActiveXObject() API用来加载activex对象或者WScript.CreateObject() API用来加载COM组件。这两种API的机制是相同的通过加载外部库来获得新的对象。举两个例子
new ActiveXObject("Shell.Application");
WScript.CreateObject("Wscript.Shell");
首先你需要理解这两个对象所加载的库。这些信息存储在注册表当中。首先我们需要通过查看注册表项HKEY_CLASSES_ROOT\OBJECT_NAME\CLSID获得对象名的CLSID

通过这张图片我们可以看到CLSID是 {13709620-C279-11CE-A49E-444553540000}。通过这条信息我们可以进一步获得 HKEY_CLASSES_ROOT\CLSID\{THE_CLSID}处的信息。可以看到 Shell.Application对象位于shell32.dll。有了这些信息我们就可以开始使用windbg来分析对象的加载和执行了。
Windbg分析
分析javascript的执行是通过调试wscript.exe来进行的。可以通过以下命令来执行
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe"
C:\Windows\System32\wscript.exe c:\Users\User\to_be_analysed.js
分析步骤一般是相同的
1 当目标库载入时下断点
2 识别想要分析的方法并下断点
3 获得方法的参数
案例学习#1 activex对象
考虑如下代码
var oShell = new ActiveXObject("Shell.Application");
var commandtoRun = "calc.exe";
oShell.ShellExecute(commandtoRun,"","","","1");
第一步是找出Shell.Application库在注册表中的位置
c:\Users\user> script.py Shell.Application
Object Name: Shell.Application
CLSID: {13709620-C279-11CE-A49E-444553540000}
Description: Shell Automation Service
dll: %SystemRoot%\system32\shell32.dll
很明显我们需要分析shell32.dll。下一步执行脚本并且在库加载时下断点
0:000> sxe ld shell32 ; g
ModLoad: 00007fff`c6af0000 00007fff`c7f27000   C:\WINDOWS\System32\SHELL32.dll
ntdll!NtMapViewOfSection+0x14:
00007fff`c8e658a4 c3              ret
The next step is to identify the ShellExecute function:
0:000> x shell32!ShellExecute
不幸的是在javascript和加载的库中没有找到同名方法。但是我们可以使用正则表达式进行搜索
0:000> x shell32!ShellExecute*
00007fff`c6b13dd0 SHELL32!ShellExecuteExW (void)
00007fff`c6b13e44 SHELL32!ShellExecuteNormal (void)
00007fff`c6cb1630 SHELL32!ShellExecuteExA ()
00007fff`c6fa8d58 SHELL32!ShellExecuteRegApp ()
00007fff`c6bef560 SHELL32!ShellExecuteW ()
00007fff`c6cb15a0 SHELL32!ShellExecuteA ()
00007fff`c6fa9058 SHELL32!ShellExecuteRunApp ()
在这个案例中我们可以在ShellExecuteNormal上下断点
0:000> bp shell32!ShellExecuteNormal
0:000> g
Breakpoint 0 hit
SHELL32!ShellExecuteNormal:
00007fff`c6b13e44 48895c2408      mov     qword ptr [rsp+8],rbx ss:00000029`cb56c7a0=00000029cb56cc90
现在我们可以通过RCX寄存器获取参数了
0:000> r $t1=poi(rcx+0x18);du $t1
000001ee`350d055c  "calc.exe"
你可能不太理解为什么偏移量是0x18。这是因为传递到ShellExecuteNormal()的参数是SHELLEXECUTEINFO结构的指针。微软的文档描述了这种情况这个数据结构本身位于偏移0x18处。
案例学习#2 wscript shell对象
考虑下面这段代码
var shell = WScript.CreateObject("Wscript.Shell");
var command = "calc.exe";
shell.Run(command, true, false);
按照前面所介绍的第一步是找到 Wscript.Shell所在的库
c:\Users\user> script.py Wscript.Shell
Object Name: Wscript.Shell
CLSID: {72C24DD5-D70A-438B-8A42-98424B88AFB8}
Description: Windows Script Host Shell Object
dll: C:\Windows\System32\wshom.ocx
然后尝试找到函数名
0:000> sxe ld wshom
0:000> g
ModLoad: 00007fff`b5630000 00007fff`b5657000   C:\Windows\System32\wshom.ocx
ntdll!NtMapViewOfSection+0x14:
00007fff`c8e658a4 c3              ret
0:000> x wshom!*Run*
00007fff`b5640930 wshom!CUnknown::InnerUnknown::`vftable' =
00007fff`b563d530 wshom!CUnknown::InnerUnknown::QueryInterface ()
00007fff`b5648084 wshom!_IMPORT_DESCRIPTOR_ScrRun =
00007fff`b563d570 wshom!CUnknown::InnerUnknown::Release ()
00007fff`b5643d30 wshom!ScrRun_NULL_THUNK_DATA =
00007fff`b563bbb0 wshom!CWshShell::Run ()
00007fff`b5631000 wshom!CUnknown::InnerUnknown::AddRef ()
00007fff`b5644518 wshom!LIBID_IWshRuntimeLibrary = )
这个方法是wshom!CWshShell::Run我们可以在这下断点来寻找参数

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载