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
我很感激任何想法
答案 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
的电话是否成功?