我调试的时候查找到
mov eax, 1
对应的机器码是
B8 01 00 00 00
写了如下的代码来运行:
const char *code = "\xB8\x01\x00\x00\x00";//mov eax, 1
void main()
{
__asm
{
lea eax, code;
call eax;
}
}
调试运行时出错:
0x01188000 处有未经处理的异常(在 code.exe 中): 0xC0000005: 执行位置 0x01188000 时发生访问冲突。
这种做法是对的吗?如果不对应该怎么做?
(运行环境:Win8.1 + VS2013)
另一种写法:
((void(*)())code)();
也试过
------解决思路----------------------
既然是用 call 去运行的,最起码得在 mov 后加上 ret 指令吧
------解决思路----------------------
const char *code = "\xB8\x01\x00\x00\x00";//mov eax, 1
void main()
{
__asm
{
mov eax, code;
call eax;
}
}
这样可以保证你执行到 mov eax, 1 但之后就可能崩溃了,需要返回。
------解决思路----------------------
你这样的定义,lea 得到的是那个数组地址的地址,所以需要再加上 mov eax, [eax] 指令,或者干脆定义为const char code[]=。当然了,最后的 ret(0xc3) 指令还是需要的。
这个问题,其实也简单,你调试跟踪下就知道了。
------解决思路----------------------
请注意我的代码和你代码的区别,用我的代码,肯定能执行到你想要的 mov eax, 1
------解决思路----------------------
那很可能就是数据执行保护 DEP 的缘故了,尤其是你没有主动地关闭它,好像 Win8 上的关闭 DEP 麻烦不少。
可以参照http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=389564 的 3 楼查看自己系统 DEP 的当前状态。