),显然是从封送处理的代码实例化的。我不是.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