AMSI 绕过之.Net API Hook

简介

反恶意软件扫描接口 (AMSI) 是对动态恶意脚本执行进行深入检查的 Microsoft Windows 组件。AMSI
可以被不同的防病毒软件调用,提供对PowerShell 脚本、JavaScript 和 VBA 宏等恶意脚本的扫描。Practical Security
Analytics提出了一种通过Hook .Net Api绕过AMSI的新技术,本文主要对此技术进行分析与复现。

0x01 背景

反恶意软件扫描接口 (AMSI) 的开发旨在为 Windows
环境中执行恶意脚本提供安全防护支持。目前,主流对抗AMSI的技术主要有编码混淆、内存补丁、强制AMSI初始化失败、amsi.dll劫持、修改注册表项等。其中,内存补丁通过Hook
windows API AmsiScanBuffer()
函数,使其始终返回AMSI_RESULT_CLEAN值以达到绕过的目的。而目前Hook的实现多针对于asmi.dl中的AmsiScanBuffer函数,实际上,powershell是.Net程序集,在执行命令或脚本之前,powershell会调用AmsiUtils.ScanCotent静态方法,该方法将命令发送到amsi接口进行检查,如下图所示。AmsiUtils是一个内部类,位于System.Management.Automation.dll中。如果修补ScanCotent方法,就可以阻止对amsi.dll中
AmsiScanBuffer 的调用,从而实现asmi绕过。AmsiUtils.AmsiNativeMethods.AMSI_RESULT result = AmsiUtils.AmsiNativeMethods.AMSI_RESULT.AMSI_RESULT_CLEAN;fixed (char* chPtr = content) {IntPtr buffer = new IntPtr((void*)chPtr);hresult = AmsiUtils.AmsiNativeMethods.AmsiScanBuffer(AmsiUtils.amsiContext, buffer, (uint)(content.Length * 2), sourceMetadata, AmsiUtils.amsiSession, ref result);}## 0x02 技术分析

该技术的核心是Hook .Net API。由于.Net程序集运行在CLR环境中,因此.Net API Hook 与常规windows API
Hook不一样。

.Net API Hook 的步骤有6步:

1、确定要hook的目标函数

2、定义具有相同函数签名的函数

3、利用反射找到函数

4、编译目标函数和自定义函数

5、找到目标函数和自定义函数在内存中的地址

6、修补目标函数,该步骤与Hook windows API一致

可以看到,与windows hook相比,重点在于编译函数和定位函数地址,这是由.Net的特性决定的。.NET
编写的代码经编译后,会得到一个由通用中间语言(CIL)构成的二进制文件,CIL构成的二进制文件会交由CLR进行接管, 只有在运行时
才会由CLR进行编译(JIT),生成可以直接运行的native code。

我们可以通过RuntimeMethodHandle.GetFunctionPointer()方法获取编译后的native
code地址。但在.Net中,如果函数没有实际被调用,那么该函数可能不会被编译,也就无法定位到函数地址。幸运的是,RuntimeHelpers类可以手动触发JIT编译。如下代码所示。//反射找到函数MethodInfo ori = typeof(CmdletInfo).Assembly.GetType(“System.Management.Automation.A”+“ms”+“i”+“Ut”+“ils”).GetMethod(“ScanC”+“ontent”, BindingFlags.NonPublic | BindingFlags.Static);MethodInfo rep = typeof(Program).GetMethod(“ScacnConte”+“ntStub”, BindingFlags.NonPublic | BindingFlags.Static);//JIT 编译函数RuntimeHelpers.PrepareMethod(ori.MethodHandle);RuntimeHelpers.PrepareMethod(rep.MethodHandle);//获取函数地址IntPtr originalSite = original.MethodHandle.GetFunctionPointer();IntPtr replacementSite = replacement.MethodHandle.GetFunctionPointer();//修补目标函数…

这里多说一句,未编译前MethodHandle.GetFunctionPointer()获得的地址指向PreJitStub块,大小为5个字节,该块的作用是调用JIT进行编译。

另外,在自定义函数这一步,由于函数总是返回1,因此c#编译器认为函数不是完整的函数调用,从而优化整个函数代码,无法hook。可以通过向函数添加属性来告诉编译器不要优化或内联该方法。[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]private static int ScanContentStub(string content, string metadata) {return 1; //AMSI_RESULT_NOTDETECTED}

0x03利用

为了在 PowerShell 中安装Hook,需要把程序集加载到powershell中,作者提出了两种方法,一是使用Add-
Type动态编译c#代码并加载到session中;二是将已编译的程序集作为 Base64 嵌入脚本中,并以反射方式将该
DLL加载到内存中;还有其他的利用思路,比如未托管代码使用CLR Hosting技术来加载Hook程序集,未托管代码可以做持久化,注入到启动项当中。

该技术针对.Net
API进行Hook,可以较好规避杀软,但需要对代码中的一些静态特征做混淆,如"System.Management.Automation.Amsiutils"字符串。

0x04总结

本文介绍了利用Hook .Net API进行amsi绕过的一种新技术,对其中关键技术点进行了分析,并简要介绍了Hook .Net API的其他利用思路。

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此为代码,不带任何数据库,有很重要的研究价值 奇怪,我上传了4和6的,没有显示,补上 1.引言 4 1.1编写目的 4 1.2背景 4 1.2.1 中国战网对战平台产生的背景 4 1.2.2 对战平台的市场分析 4 1.3定义 5 1.4参考资料 6 1.5开发软件 6 2系统的结构 6 2.1客户端系统结构模块划分 6 2.1.1管道模块 6 2.1.2用户socket通信模块, 6 2.1.3主程序界面模块 6 2.1.4网络通信的信息库模块 7 2.1.5客户端界面基础类库 7 2.1.6检查系统进程加密等操作模块 7 2.1.7 检查系统进程记录数据信息写日志模块 7 2.1.8特殊cs1.5服务器客户端使用的动态连接库模块 7 2.2中国战网网络拓朴图 8 3.客户端设计说明 9 3.1客户端描述 9 3.2功能 9 3.2.1 用户登录 9 3.2.2 游戏房间、比赛房间,公共资讯 9 3.2.3游戏类型列表 10 3.2.4 房间成员信息显示 10 3.2.5 基于互联网络环境下的局域网 10 3.2.6 支持多种网络协议 10 3.2.7 支持多种局域网游戏 11 3.2.8 支持cs1.5战网服务器方式游戏 11 3.2.9 对战成绩统计和积分排名 11 3.2.10战队组队和战队排名 11 3.2.11丰富多彩的聊天系统 11 3.2.12强大的在线管理功能 12 3.2.13基于用户的针对性广告系统 12 3.2.15战币, 游戏币计费与帐务系统功能 12 3.3应用环境 12 3.4输入项 13 3.5输出项 13 3.6技术实现 13 3.6.1利用挂钩(Hook)插入DLL进行网络内容访问控制 13 3.6.2 tcp转udp设计方案 19 3.6.3 客户端皮肤方案 24 3.7客户端与服务器的流程逻辑 25 3.7.1 客户端与登陆服务器数据包流程 (TCP数据包) 25 3.7.2客户端与游戏服务器数据包流程 (TCP数据包) 27 3.8接口 30 3.9存储分配 31 3.10注释设计 31 3.11限制条件 31 3.12综合测试计划 31 3.12.1.待测产品: 31 3.12.2测试目的: 31 3.12.3测试环境: 31 3.12.4测试范围: 32 3.12.5测试策略 : 32 3.12.6测试资源 33 3.12.7测试内容 33 3.13尚未解决的问题 34 4.中国战网对战平台技术特点和优势 34

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值