用Frida看看AmsiScanBuffer

admin 2025年4月21日22:07:02评论10 views字数 4594阅读15分18秒阅读模式

用Frida看看AmsiScanBuffer呢

AMSI简介

反恶意软件扫描接口(AMSI)是Microsoft首次在Windows 10中引入的安全机制,目的是保护用户免受恶意软件侵害。AMSI能够实时拦截PowerShell、JavaScript、VBScript、VBA或.NET脚本和命令,并将其发送到防病毒软件进行安全扫描。

传统杀毒软件主要检测磁盘上的文件或试图创建进程的文件,而对于完全依赖内存执行且不落地磁盘的无文件攻击却无能为力。而AMSI填补了这一安全缺口,提供了一个统一的接口,使安全产品能够检测内存中的威胁,能够检测命令或无文件脚本中的恶意内容。

AMSI的工作原理

当用户启动脚本或初始化PowerShell进程时,AMSI.DLL库会自动加载到该进程中。此库提供与防病毒软件交互所需的API。在执行前,脚本或命令通过远程过程调用(RPC)发送至Microsoft Defender或其他支持AMSI的防病毒软件进行分析。若检测到已知恶意签名,执行会被中断,并显示脚本已被防病毒程序阻止的提示。

用Frida看看AmsiScanBuffer

目前与AMSI集成的Windows组件包括:

  1. 1. 用户账户控制(UAC)
  2. 2. PowerShell(脚本、交互式使用和动态代码评估)
  3. 3. Windows脚本宿主(wscript.exe和cscript.exe)
  4. 4. JavaScript和VBScript
  5. 5. Office VBA宏

AMSI核心函数与检测机制

AMSI的功能主要通过以下关键函数实现:

  1. 1.AmsiInitialize: 初始化AMSI API
  2. 2.AmsiOpenSession: 打开会话,用于关联多个扫描请求
  3. 3.AmsiScanBufferAmsiScanString: 核心扫描函数,用于检测缓冲区或字符串中的恶意内容
  4. 4.AmsiCloseSession: 关闭由AmsiOpenSession打开的会话
  5. 5.AmsiUninitialize: 移除由AmsiInitialize打开的AMSI API实例

其中,AmsiScanStringAmsiScanBuffer是AMSI检测过程中最关键的函数。当这些函数被调用后,会返回扫描结果,可能的值包括:

  • AMSI_RESULT_CLEAN(0) - 已知安全。未检测到威胁,结果不太可能在未来的定义更新后发生变化。
  • AMSI_RESULT_NOT_DETECTED(1) - 未检测到威胁,但结果可能在未来的定义更新后发生变化。
  • AMSI_RESULT_BLOCKED_BY_ADMIN_START(16384) - 管理员策略在此机器上阻止此内容(范围开始)。
  • AMSI_RESULT_BLOCKED_BY_ADMIN_END(20479) - 管理员策略在此机器上阻止此内容(范围结束)。
  • AMSI_RESULT_DETECTED(32768) - 检测到威胁。内容被视为恶意软件,应该被阻止。
typedef enum AMSI_RESULT {
  AMSI_RESULT_CLEAN,
  AMSI_RESULT_NOT_DETECTED,
  AMSI_RESULT_BLOCKED_BY_ADMIN_START,
  AMSI_RESULT_BLOCKED_BY_ADMIN_END,
  AMSI_RESULT_DETECTED
} ;

动手实践

1. 准备PowerShell环境并获取进程标识符

首先,我们需要打开一个PowerShell窗口,这将作为我们的测试环境。在Windows操作系统中,可以通过开始菜单或者按下Win+X然后选择PowerShell来启动。PowerShell启动后,我们需要确定其进程ID,这是后续操作的基础。

在PowerShell控制台中,输入以下命令:

Get-Process -Name powershell
用Frida看看AmsiScanBuffer

执行后,系统会返回当前运行的所有PowerShell实例的详细信息,包括进程ID(PID)、内存使用情况、CPU时间等。我们需要关注的是PID列,因为这个数字标识符将在后续步骤中用于定位目标进程。

2. 配置Frida工具进行函数挂钩

接下来,我们需要打开一个单独的命令行窗口(可以是CMD或另一个终端)。这个窗口将用于运行Frida工具,它能够动态分析和修改正在运行的程序。

在命令行中,输入以下命令(注意将<PID>替换为上一步获取的PowerShell进程ID):

frida-trace -p <PID> -x amsi.dll -i Amsi*

这条命令的执行效果是:

  • • 将Frida工具连接到指定的PowerShell进程
  • • 专门加载并分析amsi.dll动态链接库
  • • 设置监听器以拦截所有以Amsi开头的函数调用,如AmsiScanBufferAmsiOpenSession等AMSI关键函数

当命令执行成功后,Frida会显示它已经成功附加到目标进程,并且正在监听相关函数调用。

用Frida看看AmsiScanBuffer

3. 定位并访问自动生成的脚本文件

Frida工具执行后,它会在当前工作目录中自动创建必要的JavaScript处理脚本,这些脚本通常位于__handlers__子目录下。(或者直接在当前目录中创建amsiscanbuffer.js文件也可以)

用Frida看看AmsiScanBuffer

使用文本编辑器(如记事本、VS Code或Notepad++)打开生成的AmsiScanBuffer.js文件。初始状态下,这个文件包含一个基本的函数框架,允许我们拦截和分析函数调用,但还没有其它实际的干预操作。

用Frida看看AmsiScanBuffer

4. 拦截AmsiScanBuffer

现在,我们需要修改脚本文件的内容,实现对AMSI扫描结果的拦截。将AmsiScanBuffer.js的全部内容替换为以下JavaScript代码:

defineHandler({
// 当AmsiScanBuffer函数被调用时执行
onEnter(log, args, state) {
    log('[*] AmsiScanBuffer()');
    log('[+] AMSI CONTEXT : ' + args[0]);  // 记录AMSI上下文
    log('[+] BUFFER : ' + Memory.readUtf16String(args[1]));  // 记录被扫描的内容
    log('[+] LENGTH : ' + args[2]);  // 记录缓冲区长度
    log('[+] CONTENT NAME : ' + args[3]);  // 记录内容名称
    log('[+] AMSI SESSION : ' + args[4]);  // 记录AMSI会话
    log('[+] RESULT : ' + args[5]);  // 记录结果指针
    this.result = args[5];  // 保存结果指针以便稍后使用
  },
// 当AmsiScanBuffer函数返回时执行
onLeave(log, retval, state) {
    log('[+] RESULT VALUE: ' + Memory.readUShort(this.result));  // 打印最终返回的扫描结果值
  }
});

该代码使用Frida框架监控AmsiScanBuffer函数调用,记录所有关键参数(扫描内容、长度等)并显示最终扫描结果,用于分析AMSI的工作过程。与前一个代码不同,此版本只记录数据而不修改扫描结果。

  • onEnter函数在AMSI扫描函数被调用时触发,记录下所有关键参数,包括待扫描的内容和结果位置
  • • 特别保存了args[5],这是指向扫描结果的内存指针
  • onLeave函数在AMSI扫描完成准备返回结果时触发
用Frida看看AmsiScanBuffer
保存这个文件后,Frida会自动重新加载修改后的脚本,使其立即生效,所有通过这个PowerShell实例的AMSI扫描请求都会被拦截和篡改。

5. 测试

快捷键Win + R 之后输入 eventvwr.msc打开Windows的事件查看器,接着事件查看器 -> 应用程序和服务日志 -> Microsoft -> Windows -> Windows Defender -> Operational

用Frida看看AmsiScanBuffer

在powershell的命令行键入"test",Frida打印出[+] RESULT VALUE: 1,Windows的事件中没有对应日志:

用Frida看看AmsiScanBuffer

在powershell的命令行键入.Invoke-Mimikatz.ps1,Frida打印出[+] RESULT VALUE: 32768,Windows的事件中出现日志事件1116

用Frida看看AmsiScanBuffer

安全挑战与防御建议

通过本次的操作,可以浅浅窥探到AMSI的一些内部原理,虽然AMSI为用户提供了安全防护能力,但也可能被攻击者围绕这些机制进行滥用:

  1. 1. 代码混淆绕过:攻击者可使用代码混淆技术尝试绕过AMSI检测。
  2. 2. 内存修补攻击:攻击者可能尝试在内存中Patch AMSI.DLL,使其关键函数如AmsiScanBuffer返回"安全"结果,从而绕过检测。

由于本实验是从检测防御的角度来开展,就不展开叙述其它围绕AMSI的攻击性操作和绕过手段

为加强AMSI防护能力,系统管理员可考虑采取以下措施:

  1. 1.多层防御:不要仅依赖AMSI,应结合其他安全控制措施,如应用程序白名单、权限限制和网络监控。
  2. 2.日志监控:密切关注Windows事件ID 1116的日志,这可能是AMSI检测到了潜在威胁。
  3. 3.行为分析:实施基于行为的检测系统,识别尝试修改或绕过AMSI的可疑活动。
  4. 4.保持更新:确保Windows Defender或其他防病毒软件定期更新,以获取最新的恶意软件签名。
  5. 5.限制执行策略:在PowerShell中实施严格的执行策略,限制未签名脚本的执行。
  6. 6.应用程序控制:使用AppLocker或Windows Defender Application Control限制可执行文件的运行。
  7. 7.内存完整性监控:考虑实施监控关键系统DLL内存完整性的解决方案,以检测针对AMSI的修补尝试。

结语

对于AMSI绕过这类技术,需要采取多层次的防御策略,结合技术手段和管理措施,才能有效降低被攻击的风险。网络安全不是一次性工作,而是需要持续改进的过程,只有保持警惕并不断更新防御措施,才能在攻防对抗中占据主动。

希望本文对您的网络安全防护工作有所帮助。但在实施任何安全测试前,请务必在测试环境中进行验证,并根据实际情况进行适当调整。

参考

  • https://learn.microsoft.com/en-us/windows/win32/api/amsi/ne-amsi-amsi_result
  • https://learn.microsoft.com/en-us/windows/win32/amsi/how-amsi-helps
  • https://learn.microsoft.com/en-us/windows/win32/api/amsi/nf-amsi-amsiscanbuffer
  • https://frida.re/docs/javascript-api/

免责声明: 

文章中涉及的内容可能带有攻击性、损害性,请注意识别。文章内容仅能用于安全检测、安全防御、安全研究等合法合规的用途,请勿用作其它方面。若有违反,违反者将自行承担相应法律责任及连带责任,违反者的行为与本文章内容的创作者无关。请遵守相关法律法规,共同维护网络环境的清朗!如有问题可私信联系,望知悉。

原文始发于微信公众号(哆啦安全):用Frida看看AmsiScanBuffer

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月21日22:07:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   用Frida看看AmsiScanBufferhttps://cn-sec.com/archives/3981151.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息