我正在尝试分析一个 .NET 恶意软件样本,它或多或少是这样的:
internal static class Class1
{
public static byte[] Code = new byte[]
{
9,
249,
131,
225,
...,
}
private static void Main()
{
// AFAIU this copies the marshaled code in Code to freshly allocated memory
IntPtr ptr = Class1.Alloc((uint)Class1.Code.Length);
for (int i = 0; i < Class1.Code.Length; i++)
{
int num = (int)Marshal.ReadByte(Class1.Code, i);
Marshal.WriteByte(ptr, i, (byte)num);
}
Class1.newObject newObject = (Class1.newObject)Marshal.GetDelegateForFunctionPointer(ptr, typeof(Class1.newObject));
object.Equals(null, null);
[...snip...]
object.Equals(null, null); // probably some timing mechanism
Marshal.GetFunctionPointerForDelegate(newObject);
newObject();
}
}
我试图找到 newObject() 背后的代码,它显然是从封送代码中实例化的。我不是 .Net 专家,但从我读到的编组代码是某种序列化,可以应用于对象以通过二进制通道(例如 TCP 连接)传输功能代码。据我所知,我应该能够将其反转为可理解的,或者至少类似于字节码的格式。
我尝试过像 ILSpy 和 dotPeek 这样的软件,但它们似乎没有将代码识别Code
为托管代码,并且没有提供可用的输出。