- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将代码从 C++ 转换为我的 VB.NET 应用程序。这是 C++ 代码:
typedef int (__stdcall *init_t)(uint32_t value,uint32_t param1,uint32_t* param2);
static init_t fnInit;
...
...
memory = (uint8_t*)VirtualAlloc(NULL,5000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
memset(memory,5000,0);
memmove(memory,data,datalen);
fnInit = (init_t )&memory[0];
如你所见,它在堆栈中定义了一个函数。我如何在 VB.NET 中模拟它?
注意:你可以写C#代码,没问题。
编辑:
我根据您的建议写了一个类。
<Flags> _
Public Enum AllocationType As UInteger
COMMIT = &H1000
RESERVE = &H2000
RESET = &H80000
LARGE_PAGES = &H20000000
PHYSICAL = &H400000
TOP_DOWN = &H100000
WRITE_WATCH = &H200000
End Enum
<Flags> _
Public Enum MemoryProtection As UInteger
EXECUTE = &H10
EXECUTE_READ = &H20
EXECUTE_READWRITE = &H40
EXECUTE_WRITECOPY = &H80
NOACCESS = &H1
[READONLY] = &H2
READWRITE = &H4
WRITECOPY = &H8
GUARD_Modifierflag = &H100
NOCACHE_Modifierflag = &H200
WRITECOMBINE_Modifierflag = &H400
End Enum
<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function VirtualAlloc(lpAddress As IntPtr, dwSize As UIntPtr, flAllocationType As AllocationType, flProtect As MemoryProtection) As IntPtr
End Function
<DllImport("msvcrt.dll", EntryPoint:="memset", CallingConvention:=CallingConvention.Cdecl, SetLastError:=False)> _
Public Shared Function MemSet(dest As IntPtr, c As Integer, count As IntPtr) As IntPtr
End Function
<DllImport("msvcrt.dll", SetLastError:=False)> _
Private Shared Function memmove(dest As IntPtr, src As IntPtr, count As Integer) As IntPtr
End Function
<UnmanagedFunctionPointer(CallingConvention.StdCall)> _
Public Delegate Sub Init(ByVal Value As UInt32, ByVal Param1 As UInt32, ByVal Param2 As IntPtr)
Dim Func_Init As Init
Sub New(ByRef Bytes() As Byte)
Dim OffSetInit As Int32 = &H0 'This is correct
Dim MemoryPtr As IntPtr
MemoryPtr = VirtualAlloc(Nothing, 5000, AllocationType.COMMIT, MemoryProtection.EXECUTE_READWRITE)
MemSet(MemoryPtr, 0, 5000)
Marshal.Copy(Bytes, 0, MemoryPtr, Bytes.Length)
Dim InitPtr As IntPtr = MemoryPtr + OffSetInit
Func_Init = CType(Marshal.GetDelegateForFunctionPointer(InitPtr, GetType(Init)), Init)
Func_Init.Invoke(0, 0, Nothing)
End Sub
当我执行这个时,“Func_Init.Invoke(0, 0, Nothing)”行给我这个错误:
System.AccessViolationException
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
编辑2:
我在 Bytes 变体中添加了汇编代码的第一部分:
seg000:00000000 ;
seg000:00000000 ; +-------------------------------------------------------------------------+
seg000:00000000 ; | This file has been generated by The Interactive Disassembler (IDA) |
seg000:00000000 ; | Copyright (c) 2011 Hex-Rays, <support@hex-rays.com> |
seg000:00000000 ; | License info: B3-432E-F558-21 |
seg000:00000000 ; | Ilfak Guilfanov |
seg000:00000000 ; +-------------------------------------------------------------------------+
seg000:00000000 ;
seg000:00000000 ; Input MD5 : 55D6B96FEF969A18F927BC5A7A21FAEE
seg000:00000000 ; Input CRC32 : 9A6D4B33
seg000:00000000
seg000:00000000 ; File Name : C:\****************.dll
seg000:00000000 ; Format : Binary file
seg000:00000000 ; Base Address: 0000h Range: 0000h - 4174h Loaded length: 4174h
seg000:00000000
seg000:00000000 include uni.inc ; see unicode subdir of ida for info on unicode
seg000:00000000
seg000:00000000 .686p
seg000:00000000 .mmx
seg000:00000000 .model flat
seg000:00000000
seg000:00000000 ; ===========================================================================
seg000:00000000
seg000:00000000 ; Segment type: Pure code
seg000:00000000 seg000 segment byte public 'CODE' use32
seg000:00000000 assume cs:seg000
seg000:00000000 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
seg000:00000000
seg000:00000000 ; =============== S U B R O U T I N E =======================================
seg000:00000000
seg000:00000000 ; Attributes: bp-based frame
seg000:00000000
seg000:00000000 sub_0 proc near
seg000:00000000
seg000:00000000 var_4 = dword ptr -4
seg000:00000000 arg_0 = dword ptr 8
seg000:00000000 arg_4 = dword ptr 0Ch
seg000:00000000 arg_8 = dword ptr 10h
seg000:00000000
...
最佳答案
该代码正在分配内存,将数据复制到分配的内存,然后创建一个引用它的函数指针。大概下一步是执行该代码。
虽然您可以在 .NET 中分配内存并将数据复制到其中,但您无法将控制转移到该内存块。
有关从 .NET 调用 VirtualAlloc
的信息,请参阅 pinvoke.net: VirtualAlloc .
要将数据复制到分配的 block 中,您需要调用某种形式的 Marshal.Copy .
如果出于某种未知原因你确实想要执行该内存块中的代码,你将不得不调用一个非托管函数(例如,用 C 或 C++ 编写),将返回的地址传递给它
VirtualAlloc
,并让
它执行代码。
(来自评论)
如果出于某种原因你真的想执行那个内存块中的代码,你可以调用Marshal.GetDelegateForFunctionPointer , 传递给它那个内存块的地址。然后您可以通过委托(delegate)调用该函数。
顺便说一句,委托(delegate)类型类似于:
delegate int test_t (uint32 type, IntPtr data, uint32 length);
我不确定您将如何指定调用约定,并且有多种方法可以编码数据。您可以固定数组并传递指针,使用不安全指针并传递 byte*
,或者可能将参数声明为 byte[]
并编码数据(尽管我不确定你如何指定编码)。也许其他人对此有答案。
您将委托(delegate)定义为:
Public Delegate Sub Init(
ByVal Value As UInt32,
ByVal Param1 As UInt32,
ByVal Param2 As IntPtr)
这不符合 C 定义。我认为 Param1
应该是 IntPtr
而 Param2
应该是 UInt32
。
此外,您没有说明这是 32 位还是 64 位代码。如果您运行的是 64 位应用程序并且您正在执行的代码(Bytes
中的任何内容)是 32 位的,那么它将无法运行。
我不知道 Bytes
中有什么,所以我什至无法猜测是什么导致了您的访问冲突。但是,您向它传递了一个空指针,所以这可能是个问题。如果你想调试它,你必须使用汇编级调试器。
关于c# - VirtualAlloc 和 StdCall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976722/
当使用 VirtualAlloc API 分配和提交具有 2 次幂页面边界大小的虚拟内存区域时,例如: void* address = VirtualAlloc(0, 0x10000, MEM_COM
我知道 C/C++ 风格的程序有内存部分、堆栈、堆、.text 等。但是当我使用 VirtualAlloc 时,它从哪里分配内存?我不认为它是堆,因为我可以只使用 HeapAlloc。 建议将不胜感激
virtualpointer=(char*) VirtualAlloc (NULL, (unsigned __int64) (1<<31), MEM_RESERVE, PAGE_READWRITE);
出于某种原因,当我的应用程序在某些配置的硬盘上运行时(RAID、随机分区、通过单独的 IDE Controller ,而不是在操作系统分区上),VirtualAlloc 返回 null 与 ERROR
我正在尝试使用 VirtualAlloc 来保留和提交一 block 内存,然后再次扩展该 block 。不幸的是,尽管 VirtualQuery 说请求的地址范围是免费的,但它返回 NULL 和错误
我正在为正在优化的 (Win7) C++ 例程编写回归测试,该例程以前释放并重新分配了许多巨大的缓冲区:内存流失。我想证明在测试期间,程序没有分配任何大内存区域(比如 16M 或更大),而是有效地重新
我试图从一个二进制文件中读取一些数据到一个用 VirtualAlloc 分配的缓冲区中。问题是我遇到了一个“糟糕的 Pr”问题并且无法执行 fread。这是我的代码: fseek(myfile,0,
VirtualAlloc 返回的内存块是否总是与页面大小对齐?换句话说,VirtualAlloc 的返回值和页面大小的模数总是为零吗? 最佳答案 嗯,是。 毕竟,你调用 VirtualAlloc 来分
在我的应用程序中,我试图在启动时通过 VirtualAlloc 分配一大块内存(大约 1GB-2GB),然后我可以稍后将其分割以供整个应用程序的其余部分使用。在 Debug模式下,我想在 Virtua
假设我使用 VirtualAlloc() 从 0x06000000 到 0x06010000 分配了几页连续内存(即 16 个 4KB 页),其中 PAGE_READWRITE保护。但过了一段时间,我
我正在使用 C# 开发应用程序 SFX/Protector,我希望 protected 程序集从字节数组执行,而不是将其写入硬盘,以便逆向工程更加困难。 我在一个字节数组中有一个程序(它有一个有效的入
我在使用 virtualalloc 时有一些奇怪的行为。我在使用 C++,Visual Studio 2010。 我有两件事要分配,我正在使用 VirtualAlloc(我有我的理由,与问题无关) 1
我正在将代码从 C++ 转换为我的 VB.NET 应用程序。这是 C++ 代码: typedef int (__stdcall *init_t)(uint32_t value,uint32_t pa
我想知道是否有比malloc/free低一级的跨平台分配器。 例如,我想要一些在 Linux 中简单地调用 sbrk 并在 Windows 中调用 VirtualAlloc 的东西(可能还有两个类似的
重要:在您在这里花费太多时间之前向下滚动到“最终更新”。事实证明,主要的教训是提防单元测试套件中其他测试的副作用,并始终在孤立地重现事物,然后再仓促下结论! 从表面上看,以下 64 位代码使用 Vir
我需要使用 VirtualAlloc/VirtualAllocEx 做什么? 举个例子,我发现的一个案例——如果我分配了 4 GB 的虚拟内存,那么如果我不使用所有虚拟内存,那么我就不会花费物理内存,
我想知道是否有可能确定一个虚拟地址(指针)是否属于以前的 VirtualAlloc 调用(如果可能的话不写入页面)。如果 VirtualFree 与 MEM_RELEASE 一起使用,它可以自动设置
在 VirtualFree 的 msdn 文档中 BOOL WINAPI VirtualFree( _In_ LPVOID lpAddress, _In_ SIZE_T dwSize, _
我需要使用 VirtualAlloc 为我的项目分配可执行内存,以便 JIT 将自定义脚本格式重新编译为 x86/etc。但我感到困惑的是,其他人似乎都没有注意到,而且它的行为似乎明显缺乏细节。 我知
我想调整由 MS 窗口的 VirtualAlloc 分配的内存区域的大小。查看 VirtualFree 文档,可以只部分取消提交一个区域,但不可能部分释放它。即可以释放部分物理内存,但不能释放部分虚拟
我是一名优秀的程序员,十分优秀!