记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

[翻译]构建混淆器以逃避Windows Defender

2020-10-02 07:39

Samuel Wong @Y4er

https://www.xanthus.io/post/building-an-obfuscator-to-evade-windows-defender




介绍

在Windows企业环境中工作的任何Redteam最终都将不得不与Windows Defender及其具有反恶意软件功能的AMSI交叉。对于操作员而言,在接合过程中无法落地合适的工具可能会非常令人沮丧,也可能是倾倒哈希值或一无所获之间的区别。在这篇文章中,我们将分析可能用于逃避防御者检测的技术。


Refresher

在跳入逃避技术之前,了解反病毒引擎如何在后台工作很重要。现代分析通常分为两大类:

静态分析-在运行时对可执行文件的内容进行审核,这通常涉及在文件中搜索恶意签名。它对未修改/开箱即用的恶意软件有效。

动态分析-在运行时对可执行文件的行为进行审核,可以分析从程序内存到程序集调用的syscall的所有内容,以了解已知的恶意行为。

绕过Defender签名

当前,绕过静态分析及其签名扫描的最佳技术之一就是简单地修改恶意签名。您可以使用多种方法来找到上述签名,Matt Graeber发布了一个 powershell脚本 https://gist.github.com/mattifestation/3af5a472e11b7e135273e71cb5fed866 来解压缩防御者AV签名数据库,以便对其进行查询。


 您可以使用 Winitor https://www.winitor.com/ 之类的恶意软件评估软件并对其指标进行现场修改


还有一个名为

DefenderCheck https://github.com/matterpreter/DefenderCheck 的便捷工具,该工具可以自动完成二进制文件的拆分过程,并利用防御程序本身进行扫描,直到精确确定触发签名为止。


虽然这些都是本文的绝佳技术,但我们将构建自定义混淆器,使用混淆器将为我们带来一些好处。首先,您不需要混淆源代码,只需要二进制文件。其次,这是节省时间,一旦构建了混淆器,您就不必花费时间来修改武器库中每个工具的每个单独的签名。有趣的是,混淆器的主要目的实际上是为了防止恶意活动,软件开发人员将使用这些工具来保护其代码免受逆向工程。

我们将专注于为.NET或更具体地说是通用中间语言(CIL)构建混淆器。编译.NET语言(如C#和Visual Basic)时,实际上并不会立即将它们转换为机器代码,而是会将它们编译为可在其公共语言运行时(CLR)上运行的中间语言。由于IL的可读性要强得多,因此汇编后,此工具的编写将成倍地容易。


您会注意到,如果您一直在使用防御者防病毒软件玩了一段时间,那么它选择的签名通常是常量,例如字符串或变量名。它不会保存任何常见的库方法名称,例如“ System.Text.Encoding.UTF8.GetString”,因为这会在合法程序上触发过多的误报。因此,我们将混淆字符串,方法,类,命名空间和程序集编译信息。

让我们开始

我们将使用dnlib作为程序集编辑器,也可以使用mono cecil,因为它们共享非常相似的语法。

using dnlib.DotNet;
using dnlib.DotNet.Emit;

首先,您必须加载程序集以混淆到模块中,

ModuleDef md = ModuleDefMD.Load("/path/to/assembly");

使用模块对象,我们可以访问二进制类型,编译信息和类。我们将像这样修改装配体信息。

string[] attri = {
"AssemblyTitleAttribute", ... ,"AssemblyCompanyAttribute"};
foreach (CustomAttribute attribute in md.Assembly.CustomAttributes) {
  if (attri.Any(attribute.AttributeType.Name.Contains)) {
    string encAttri = RandomString(10);
    attribute.ConstructorArguments[0] = new CAArgument(md.CorLibTypes.String, new UTF8String(encAttri));
  }
}

接下来,我们可以遍历程序集的类型并更改类和名称空间的名称。

foreach (var type in md.GetTypes()){
    type.Name = RandomString(10);
    type.Namespace = RandomString(10);

之后,让我们更改每个类中的方法名称,请警惕,因为某些我们不能更改的方法(例如构造函数)。

foreach (MethodDef method in type.Methods){
  if (!method.HasBody) continue;
  if (method.IsConstructor) continue;
  string encName = RandomString(10);
  method.Name = encName;

最后,让我们修改字符串,这是由 https://github.com/CodeOfDark/Tutorials-StringEncryption 提供的。最好添加自己的自定义字符串混淆说明。

for(int i = 0; i < method.Body.Instructions.Count(); i++){
  if(method.Body.Instructions[i].OpCode == OpCodes.Ldstr){
    String regString = method.Body.Instructions[i].Operand.ToString();
    String encString = Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(regString));
    method.Body.Instructions[i] = new Instruction(OpCodes.Call, md.Import(typeof(System.Text.Encoding).GetMethod("get_UTF8", new Type[] { })));
    method.Body.Instructions.Insert(i + 1, new Instruction(OpCodes.Ldstr, encString));
    method.Body.Instructions.Insert(i + 2, new Instruction(OpCodes.Call, md.Import(typeof(System.Convert).GetMethod("FromBase64String", new Type[] { typeof(string) }))));
    method.Body.Instructions.Insert(i + 3, new Instruction(OpCodes.Callvirt, md.Import(typeof(System.Text.Encoding).GetMethod("GetString", new Type[] { typeof(byte[]) }))));
    i += 4;
  }
}

在编写最终程序集之前,我们需要清理IL并纠正可能因指令插入而发生的错误,例如maxstack不足。

method.Body.SimplifyBranches();
method.Body.OptimizeBranches();

您可能想知道为什么我们不打扰更改变量,而dnlib的好处之一就是在写时为您简化了这些变量,因此无需混淆它们,因为它们已经被破坏了。最后写入文件

md.Write(outFile);

有关代码的完整版本,可以在这里查看 https://github.com/BinaryScary/NET-Obfuscate/blob/master/NET-Obfuscate/Program.cs

测试

现在,在有趣的部分上,让我们测试混淆器,记住要关闭“自动提交样品”功能,这样您就不会浪费所有的工作。


首先让我们在契约C2代理上尝试一下。

如您所见,没有防病毒触发通知,并且Defender-check也未报告任何内容。

接下来,让我们在TikiTorch之类的大型工具上进行尝试,这次运行防御程序扫描。



防御者报告未发现威胁。

结论

这篇文章的目的是提供有关如何轻松创建自己的混淆器的教育性文章,如先前所指出的,将任何旧的攻击性工具都放在网上并尝试在交战中使用是确保成功的可靠方法。逃避防御者的最佳策略是创建自己的混淆工具,无论是使用自定义混淆器还是手动更改它们。有一个很大的混淆社区,其处理方式比该混淆方案要大,因此另一种可行的方法是对其中一个工具进行足够的修改,以免被其旧签名所困扰。

逃避旅程的下一步可能是使用流行的 DonutTikitorch工具 研究过程注入,或者检查 AMSI ByPass

分享、点赞、看就是对我们的一种支持!



知识来源: https://mp.weixin.qq.com/s?__biz=MzU0ODg2MDA0NQ==&mid=2247484781&idx=1&sn=67be72b849e5471a2bb227d59d579d16

阅读:30451 | 评论:0 | 标签:windows

想收藏或者和大家分享这篇好文章→复制链接地址

“[翻译]构建混淆器以逃避Windows Defender”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

❤人人都能成为掌握黑客技术的英雄❤

ADS

标签云