C# 将链接的ASM x86可执行文件转换为外壳代码?

C# 将链接的ASM x86可执行文件转换为外壳代码?,c#,vb.net,assembly,x86,C#,Vb.net,Assembly,X86,我正试图通过C#运行一些ASM代码(它只是减少一个数字)。我有一个链接文件(.exe)和一个(.o)win32 ASM编译文件。我试图以字节为单位读取它们,并通过在托管环境中执行ASM的标准方式执行它们,但它始终给我一个System.AccessViolationException 有什么好处?我试图对内存分配做一些研究,但我不知道问题出在哪里 代码: 请您的汇编器提供一个列表并复制字节。您是否知道如何在NASM中执行此操作?NASM-h是帮助,上面写着-l listfile。谢谢。这就产生了外

我正试图通过C#运行一些ASM代码(它只是减少一个数字)。我有一个链接文件(.exe)和一个(.o)win32 ASM编译文件。我试图以字节为单位读取它们,并通过在托管环境中执行ASM的标准方式执行它们,但它始终给我一个System.AccessViolationException

有什么好处?我试图对内存分配做一些研究,但我不知道问题出在哪里

代码:


请您的汇编器提供一个列表并复制字节。您是否知道如何在NASM中执行此操作?
NASM-h
是帮助,上面写着
-l listfile
。谢谢。这就产生了外壳代码,但不幸的是,代码似乎是用3条以上的指令来实现的。可执行文件不是一个简单的指令列表。将它们转换为外壳代码通常并不简单。加载本身通常不像将它们映射到内存那样简单。您可能需要查看PE文件格式或win32/64对象文件格式(松散地命名为COFF)。
   Const PAGE_EXECUTE_READWRITE As UInteger = &H40
Const MEM_COMMIT As UInteger = &H1000

<DllImport("kernel32.dll", SetLastError:=True)>
Private Shared Function VirtualAlloc(lpAddress As IntPtr, dwSize As IntPtr, flAllocationType As UInteger, flProtect As UInteger) As IntPtr
End Function

Private Delegate Function IntReturner() As Integer

Public Sub Run()

    Dim body As Byte() = IO.File.ReadAllBytes("C:\MinGW\bin\test.exe")
    Dim buf As IntPtr = VirtualAlloc(IntPtr.Zero, CUInt(body.Length), MEM_COMMIT, PAGE_EXECUTE_READWRITE)
    Marshal.Copy(body, 0, buf, body.Length)

    Dim ptr As IntReturner = DirectCast(Marshal.GetDelegateForFunctionPointer(buf, GetType(IntReturner)), IntReturner)
    Console.WriteLine(ptr())
End Sub
section .text
global _WinMain@16

_WinMain@16:
mov ecx,4294967295
myloop:
 dec ecx
 jnz myloop

; Terminate program
 mov eax, 0
 ret 16