memcpy访问冲突错误

时间:2014-02-14 21:29:57

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

    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

我很感激任何想法

1 个答案:

答案 0 :(得分:3)

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

PDWORD OP;

你需要:

DWORD OldProtect;

然后将&OldProtect传递给VirtualProtect

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

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

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

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

作为一般性建议,您需要养成检查错误返回值的习惯。您调用VirtualProtect并忽略返回值。您如何知道您对VirtualProtect的电话是否成功?