我正在尝试分析一个.NET恶意软件示例,该示例或多或少是这样的:

),显然是从封送处理的代码实例化的。我不是.Net专家,但是从我阅读的封送处理的代码中可以了解某种序列化,可以将其应用于对象以通过二进制通道(例如TCP连接)传输功能代码。据我了解,我应该能够将其反转为可理解的或至少类似于字节码的格式。

我尝试了ILSpy和dotPeek之类的软件,但它们似乎无法识别其中的代码Code作为托管代码,并且不提供可用的输出。

#1 楼


我正在尝试获取newObject()背后的代码,该代码显然是由封送处理的代码实例化的。我不是.Net专家,但是从我阅读的封送处理代码中可以了解某种序列化,可以将其应用于对象以通过二进制通道(例如TCP连接)传输功能代码。 />
我不确定“封送的代码”是什么意思,但是.Net中的封送通常指与本机代码的互操作性。用于该目的。 (它可以用于将单个对象转换为字节数组,但这在这里并不重要,因为您的代码无法执行此操作。)

Marshal类包含对互操作性有用的方法,包括在本机和托管类型之间进行转换。可以从.Net调用。

为了验证这确实是您的代码,我创建了一个稍微简化的版本,并将用于非常简单功能的x86机器代码放入字节中数组:



class Program
{
    private static readonly byte[] code =
    {
        0xB8, 0x2A, 0x00, 0x00, 0x00, // mov eax, 0x2a
        0xC3 // ret
    };

    private delegate int FuncInt();

    private static void Main()
    {
        IntPtr ptr = AllocExecutableMemory(code.Length);
        for (int i = 0; i < code.Length; i++)
        {
            Marshal.WriteByte(ptr, i, code[i]);
        }
        var del = (FuncInt)Marshal.GetDelegateForFunctionPointer(ptr, typeof(FuncInt));
        Console.WriteLine(del());
    }

    private static IntPtr AllocExecutableMemory(int length)
    {
        // see http://www.pinvoke.net/default.aspx/kernel32.virtualalloc,
        // but change the return type from UIntPtr to IntPtr
        return NativeMethods.VirtualAlloc(
            UIntPtr.Zero, (UIntPtr)length,
            AllocationType.COMMIT, MemoryProtection.EXECUTE_READWRITE);
    }
}


此代码按预期打印42(= 0x2A)。

这意味着要分析GetDelegateForFunctionPointer(),您必须将其视为非托管代码(很可能是x86)。

#2 楼

您可能会在IDA中打开文件,并强制IDA将IL机器代码字节解释为代码,从而为您提供IL机器代码字节的反汇编。可以尝试将IL机器代码字节“强制送入” ILSpy的反编译器函数,以查看它是否可以为您反编译。您需要查看ILSpy的源代码以找出要调用的函数。

我意识到这不是理想的解决方案,因此希望有人可以发布更好的答案:)

评论


我尝试将代码强制输入ILSpy,但没有骰子。与IDA一样,它也找不到入口点(因为它不是我要加载的PE,所以我没有)。我将尝试与其他.Net反汇编程序/反编译器一起使用。

– Thomas Chopitea
2014-10-10 13:23

将原始.NET exe加载到IDA中,导航到Code数组,然后按“ C”告诉IDA对其进行反汇编。

–詹森·格夫纳(Jason Geffner)
2014-10-10 13:39



另外,您尝试将代码提供给ILSpy中的哪些函数?

–詹森·格夫纳(Jason Geffner)
14-10-11在20:22

我只是尝试在ILSpy中打开转储的Code数组,但无济于事。我尝试寻找其他加载功能,但未找到任何功能。

– Thomas Chopitea
14-10-13在14:29

正确,使用ILSpy的标准“打开文件”用户界面肯定无法正常工作。上面我曾建议您将ILSpy的代码库加载到IDE中,并调用特定函数以反编译您的机器代码。

–詹森·格夫纳(Jason Geffner)
2014年10月13日15:05