分析从PowerShell内存转储中提取实行的脚本 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

分析从PowerShell内存转储中提取实行的脚本

申博_新闻事件 申博 176次浏览 已收录 0个评论

上次宣布从PowerShell流程转储中提取运动历史记录以后,我又想到了一个风趣的题目:“是不是能够提取已实行的剧本(来自磁盘)的内容,纵然这些文件未被捕捉?”,我获得谜底是“是”,然则它也很庞杂。这将须要大批的WinDbg自动化事情,因而第一步,装置WinDbg模块。

我们先建立一个简朴的剧本。

分析从PowerShell内存转储中提取实行的脚本

翻开PowerShell会话,运转剧本,然后建立转储文件。

分析从PowerShell内存转储中提取实行的脚本

如今,运用WinDbg模块连接到转储文件:

Connect-DbgSession -ArgumentList '-z "C:\Users\lee\AppData\Local\Temp\powershell.DMP"'

最先

我们想要提取透露表现在该会话中运转的剧本的工具(若是存在)。但我们怎样找到这些呢?

起首,让我们运用SOS的“转储工具”敕令来转储它晓得的关于历程中每一个工具的一切内容。因而,我们将从!DumpHeap敕令最先查找一切工具实例(即:我们甚至不运用-Type过滤器)。但另有其他要领能够做到这一点,但这一步和下一步将须要很长时候。

$allReferences = dbg !dumpheap -short

一旦我们具有一切工具援用,让我们运用!do(转储工具敕令)让SOS将它们悉数可视化。转储工具的输出不包括被转储工具的地点,因而我们也将运用Add-Member来跟踪它。

$ allObjects = $ allReferences | Foreach-Object {$ object = dbg“!do $ ”; Add-Member -InputObject $ object Address $ -PassThru -Force}

SOS在此流程实例中晓得大约有一百万个工具。然则他们中的任何一个GUID都会被SOS可视化吗?

分析从PowerShell内存转储中提取实行的脚本

看起来我们很荣幸!在这些百万个工具中,我们想法将其缩小到PowerShell内存中的7个System.String工具,这些工具以某种体式格局援用了GUID。若是我们以为信息能够一向在System.String中,我们能够运用“$allReferences = dbg !dumpheap –type System.String –short”使我们的初始“$ allObjects”查询更快。然则我们怎样弄清楚这些GUID的是什么?

为了找到谜底,我们将运用SOS的!gcroot敕令。这一般用于诊断托管内存走漏 ,!gcroot敕令会告诉您援用它的工具和援用该工具的工具 – 一向抵达工具的根目录。让我们议论一下这些泉源。

分析从PowerShell内存转储中提取实行的脚本

第5项根植于工具数组(System.Object[]),个中一个元素是ConcurrentDictionary,它包罗一个ScriptBlock,它又包罗CompiledScriptBlockData,个中包罗PowerShell AST中的节点,在援用这个GUID的敕令AST中触底。

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

这是我实例中的第4项:

分析从PowerShell内存转储中提取实行的脚本

这是风趣的!这个开首是雷同的根工具数组(0000026e101e9a40),雷同的ConcurrentDictionary(0000026e003bc440),但这次末了是一个包罗我们的字符串和另一个字符串的元组(两个项目的简朴配对)。让我们深切相识谁人元组及其包罗的字符串。

分析从PowerShell内存转储中提取实行的脚本

以是这个元组有两个元素。第一个元素看起来是实行剧本的途径,第二个元素看起来是该剧本中的内容。让我们看看PowerShell Source对这些数据结构。我将搜刮ConcurrentDictionary以检察我能找到的内容。在第三页,我们能够看到我们正在检察的内容:

分析从PowerShell内存转储中提取实行的脚本

有一个名为CompiledScriptBlock的类。它包罗一个名为“s_cachedScripts”的静态(历程局限)缓存。这是一个将一对字符串映照到ScriptBlock实例的字典。若是您阅读了源代码,您能够确实地看到Tuple的内容 – 剧本途径到ScriptBlock缓存时包罗的内容的映照:

分析从PowerShell内存转储中提取实行的脚本

这个数据结构是我们终究议论的内容。出于机能缘由,PowerShell保护一个内部剧本块缓存,如许每次看到剧本时都不须要从新编译剧本块。该缓存是途径和剧本内容的症结。存储在缓存中的器械是ScriptBlock类的一个实例,它包罗(除此之外)编译的剧本的AST。

以是如今我们晓得这个器械存在了,我们能够在自动化中更智能,并提取这些器械!如今我们须要一个真正的剧本,这就是我们要做的:

1. 运用!dumpheap查找此Tuple类的实例。dumpheap敕令实行子字符串搜刮,因而我们将运用正则表达式举行一些后处理。

2. 这给了我们现实想要研讨的元组类的MT。

3. 运用该MT作为过滤器再次运转!dumpheap

分析从PowerShell内存转储中提取实行的脚本

如今我们能够探究个中一个节点。它有一个m_key,我们能够深切研讨。

分析从PowerShell内存转储中提取实行的脚本

差不多了!让我们从那些效果键中提掏出两个项目,然后天生一个美丽的PowerShell工具:

分析从PowerShell内存转储中提取实行的脚本

这是一个将一切这些打包成函数的剧本.

function Get-ScriptBlockCache
{
    $nodeType = dbg !dumpheap -type ConcurrentDictionary |
        Select-String 'ConcurrentDictionary.Node.Tuple.String.String.]]$'
    $nodeMT = $nodeType | ConvertFrom-String | Foreach-Object P1
    $nodeAddresses = dbg !dumpheap -mt $nodeMT -short
    $keys = $nodeAddresses | % { dbg !do $_ } | Select-String m_key
    $keyAddresses = $keys | ConvertFrom-String | Foreach-Object P7
    foreach($keyAddress in $keyAddresses) {
        $keyObject = dbg !do $keyAddress
        $item1 = $keyObject | Select-String m_Item1 | ConvertFrom-String | % P7
        $string1 = dbg !do $item1 | Select-String 'String:\s+(.)' | % { $_.Matches.Groups[1].Value }
        $item2 = $keyObject | Select-String mItem2 | ConvertFrom-String | % P7
        $string2 = dbg !do $item2 | Select-String 'String:\s+(.*)' | % { $.Matches.Groups[1].Value }
        [PSCustomObject] @{ Path = $string1; Content = $string2 }
    }
}

申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明分析从PowerShell内存转储中提取实行的脚本
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址