【问题标题】:Access violation error with memcpymemcpy 访问冲突错误
【发布时间】:2014-02-14 21:29:56
【问题描述】:
    unsigned char hexData[14] = {
    0x31, 0xC0, 0xBB, 0x42, 0x24, 0x80, 0x7C, 0x66,
    0xB8, 0x88, 0x13, 0x50, 0xFF, 0xD3
};

void dummy(){}

int main()
{
    void *code_ptr = &dummy;
    PDWORD OP;
    __asm
    {
        call code_ptr
        add code_ptr,10h
    }
    VirtualProtect(code_ptr, 14, PAGE_EXECUTE_WRITECOPY, OP);
    memcpy(code_ptr, hexData, 14);
.
.
.

在反汇编中

_LoadLibraryA@4:
003C11E0  jmp         _LoadLibraryA@4 (03C1430h)  
dummy:
003C11E5  jmp         dummy (03C1A80h)  
_printf:
003C11EA  jmp         _printf (03C1436h)  
_VirtualProtect@16:
003C11EF  jmp         _VirtualProtect@16 (03C143Ch)  
003C11F4  int         3  
003C11F5  int         3  
003C11F6  int         3  
003C11F7  int         3 

看来我可以在 003C11E5 之后复制 15 个块
但是当我这样做时,我得到访问访问冲突错误

我尝试使用 VirtualAlloc 之类的

void *code_ptr = &dummy;
code_ptr = VirtualAlloc(NULL, 14, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(code_ptr, hexData, 14);
__asm
{
    call code_ptr
}

我又遇到了这个错误

int (*func)();
func = (int (*)()) code;
(int)(*func)();

那个也不行

我的IDE是VS2013,我的操作系统是win8.1

我会很感激任何想法

【问题讨论】:

  • 不能保证从函数类型转换为指向 void。

标签: c++ c operating-system windows-8.1 portable-executable


【解决方案1】:

好吧,OP 是一个未初始化的指针。您不能将其传递给VirtualProtect。而不是

PDWORD OP;

你需要:

DWORD OldProtect;

然后将&OldProtect 传递给VirtualProtect

VirtualProtect(code_ptr, 14, PAGE_EXECUTE_WRITECOPY, &OldProtect);

您现有的代码在调用 VirtualProtect 时失败。您不检查错误,因此无论如何都继续。然后对memcpy 的调用失败并出现一般保护错误,因为内存是只读的。

即使您修复了代码,我也怀疑它是否会起作用。我认为dummy 没有理由长 14 个字节。你是靠运气和一厢情愿的。所以你可能会覆盖你正在执行的代码。

如果您想要 14 字节的内存来写入代码,请致电 VirtualAlloc。这样你就可以确定成功。

作为一般建议,您需要养成检查返回值是否有错误的习惯。您调用VirtualProtect 并忽略返回值。你怎么知道你对VirtualProtect 的调用成功了?

【讨论】:

  • 似乎我可以将未初始化的指针传递给一个函数,并且没有错误我说“我尝试使用 VirtualAlloc ......”
  • 好吧,既然你没有检查错误,你怎么可能这么说呢?提示,不要再忽略VirtualProtect 的返回值了。首先重新阅读文档并专注于返回值。
  • 嗯,正如我在答案中所说的那样。你传递了一个未初始化的指针,不用再看了。总是有GetLastError
  • GetLastError 返回对内存位置的无效访问
  • 您传递了一个未初始化的变量。你还期待什么?
猜你喜欢
  • 1970-01-01
  • 2015-01-26
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多