当前位置: 代码迷 >> 汇编语言 >> VC中如何执行一段机器码
  详细解决方案

VC中如何执行一段机器码

热度:189   发布时间:2016-05-02 04:30:04.0
VC中怎么执行一段机器码?
我调试的时候查找到
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) 指令还是需要的。
这个问题,其实也简单,你调试跟踪下就知道了。
------解决思路----------------------
引用:
Quote: 引用:


const char *code = "\xB8\x01\x00\x00\x00";//mov eax, 1
void main()
{
    __asm
    {
        mov eax, code;
        call eax;
    }
}


这样可以保证你执行到 mov eax, 1 但之后就可能崩溃了,需要返回。

执行 mov eax, 1的时候就崩溃了,应该不关ret的事

请注意我的代码和你代码的区别,用我的代码,肯定能执行到你想要的 mov eax, 1
------解决思路----------------------
那很可能就是数据执行保护 DEP 的缘故了,尤其是你没有主动地关闭它,好像 Win8 上的关闭 DEP 麻烦不少。
可以参照http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=389564 的 3 楼查看自己系统 DEP 的当前状态。
  相关解决方案