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

JavaScript使得利用WinDbg进行恶意软件分析更轻松

来源:本站整理 作者:佚名 时间:2019-03-13 TAG: 我要投稿

一、介绍
作为恶意软件研究人员,我们每周花几天时间调试恶意软件来了解有关它的更多信息。我们有几个功能强大且流行的用户模式工具可供选择,例如OllyDbg,x64dbg,IDA Pro和Immunity Debugger。所有这些调试器都使用一些脚本语言来自动执行任务,例如Python或OllyScript等专有语言。在内核模式分析时,确实有一个选项:Windows调试引擎及其接口CDB,NTSD,KD和WinDbg。
遗憾的是,即使WinDbg是最受用户欢迎的,但它也被广泛认为是一个世界上用户友好度最差的调试器。WinDbg命令的学习曲线非常陡峭,因为它将一个不直观且经常相互冲突的命令语法与过时的用户界面相结合。将传统的WinDbg脚本语言添加到此等式中并不会使用户更容易,因为它通过引入自己的特性来创建额外的复杂层。
谢天谢地,Windows 10的新WinDbg预览版使其符合现代编程环境。此预览版包括一个新的JavaScript引擎和一个公开的调试数据模型,通过一组JavaScript对象和函数。这些新功能使WinDbg符合如Visual Studio一样的现代编程环境,使用已经熟悉的用户界面元素。在这篇文章中,我们将讨论这个新版本的WinDbg调试器数据模型及其与JavaScript和dx命令的新接口。
二、调试数据模型
调试器数据模型是一个可扩展的对象模型,它允许调试器扩展以及WinDbg用户界面通过一致的接口访问许多内部调试器对象。与通过数据模型公开的恶意软件分析相关的对象是:
· Debugging sessions
· Processes
· Process environment (ex. Peb and Teb)
· Threads
· Modules
· Stack frames
· Handles
· Devices
· Code (disassembler)
· File system
· Debugger control
· Debugger variables
· Pseudo registers
1.DX显示表达式
所有上述类型的对象都通过新命令dx(显示调试器对象模型表达式)公开,该命令可用于访问对象并使用类似C ++的语法计算表达式,其方式比通过混合MASM和C ++表达式的方式更简单。由于为WinDbg添加了NatVis功能,dx命令的结果以更加用户友好的方式显示,使用DML作为默认输出的直观格式化。探索dx命令的起点就是在WinDbg命令窗口输入dx Debugger,它将显示公开数据模型中的顶级命名空间。这四个名称空间是Sessions,Settings,State和Utility。DML使用超链接生成输出,允许用户只需单击它们即可深入查看各个命名空间。例如,单击Sessions超链接,将执行命令dx -r1 Debugger.Sessions并显示其结果。

从顶级命名空间向下直到进程
如果我们进一步向下几层,也可以使用-r dx命令选项控制,我们将获得所有进程及其属性的列表,包括_EPROCESS内核对象作为Process调试器对象的成员KernelObject公开的字段。早期WinDbg版本的用户肯定会喜欢通过dx命令提供的调查的新便利性。dx命令还支持选项卡完成,这使得导航数据模型更加容易,并允许用户了解操作系统和WinDbg内部,如调试器变量和伪寄存器。例如,要遍历内部调试器变量列表,可以键入dx @ $然后重复按Tab键,它将从$ argreg开始循环遍历所有已定义的伪寄存器。伪寄存器和内部变量很有用,如果我们想避免在dx命令后输入完整的对象路径。可以简单地使用伪寄存器@ $ cursession而不是Debugger.Sessions [0],它指向当前会话数据模型对象。如果需要使用当前进程,只需键入dx @ $ curprocess而不是更长的dx Debugger.Sessions [0] .Process [procid]。
2.LINQ查询
Linq(语言集成查询)是.NET软件工程师已经熟悉的概念,允许用户在通过dx命令公开的对象集合上创建类似SQL的查询。有两种语法可用于为正常的.NET开发创建Linq表达式,但是WinDbg通过dx命令仅支持使用Lambda表达式语法创建查询。Linq查询允许对集合对象进行分割,并提取感兴趣的信息。Linq函数“Where”允许我们只选择满足由作为函数提供的Lambda表达式参数指定条件的那些对象。例如,要仅显示名称中包含字符串“Google”的进程,我们可以键入:
dx @$cursession.Processes.Where(p => p.Name.Contains("Google"))
就像在SQL中一样,“Select”函数允许我们选择要显示集合中对象的哪些成员。例如,对于已使用“Where”函数过滤的进程,我们可以使用“Select”来仅检索进程名及其ID:
dx -r2 @$cursession.Processes.Where(p => p.Name.Contains("Google")).Select(p => New { Name=p.Name, Id=p.Id })
深入一层,进入公开的_EPROCESS内核对象,我们可以选择显示被观察进程所拥有的句柄子集。例如,查找用户模式rootkit隐藏的进程的方法之一是枚举Windows客户端服务器子系统进程(csrss.exe)的进程句柄,并将该列表与使用标准进程枚举命令生成的列表进行比较。之前已列出由csrss.exe创建的进程,我们需要找到csrss.exe进程对象,一旦找到,切换到它们的上下文:
dx @$cursession.Processes.Where(p => p.Name.Contains("csrss.exe"))[pid].SwitchTo()
现在可以运行Linq查询来显示csrss.exe句柄表中存在的进程主模块的路径:
dx @$curprocess.Io.Handles.Where(h => h.Type.Contains("Process")).Select(h => h.Object.UnderlyingObject.SeAuditProcessCreationInfo.ImageFileName->Name)
由于ImageFileName是指向_OBJECT_NAME_INFORMATION类型结构的指针,因此我们需要使用箭头取消引用它并访问包含模块路径的“Name”字段。还有许多其他有用的Linq查询。例如,用户可以根据某些条件对显示的结果进行排序,这类似于Order By SQL子句,或使用“Count”函数计算查询结果。Linq查询也可以在JavaScript扩展中使用,但它们的语法略有不同。我们将在文章中稍后展示一个在JavaScript中使用Linq的示例。

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

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