首页 > 代码库 > 程序为何挂掉?

程序为何挂掉?

#include<stdio.h>
#include<stdlib.h>
// 自己构造mov指令更改变量值
int val,address;
char *func()    //构造mov addr,val指令 与jmp指令
{
    char *code,*pMov,*pAddr,*pJmp;
    code=(char *)malloc(16); //申请2个指令的空间
    //mov
    pMov=code;
    pMov[0]=0xc7;
    pMov[1]=0x05;
    pAddr=code+2;
    *((int*)pAddr)=(int)&val;
    *((int *)(pAddr+4))=30;
    //jmp
    //pJmp=code+11;  不能加11
    pJmp=code+10;
    pJmp[0]=0xff;
    pJmp[1]=0x25;
    //4字节的地址
    //*((int *)(pJmp+2))=(int)&address;
    *((int *)(&pJmp[2]))=(int)&address;
    //=mov dword ptr [pJmp+2],address
    return code;     //返回指令的地址
}

//计算机中 机器码中并没有类型之分 char 仅仅代表 byte 
//char的作用是给编译器用的。编译器解释的时候 解释一个字节 并转换为字符类型
//为什么不用void?void看起来像全能类型。而用char *? 因为char占一个字节 void占4字节 
int main()
{  
    //char *pCode;
    //pCode=func();  //擦  这个返回一个字节  一开始就觉得不正确
    void *pCode=func();
    _asm{
        mov address,offset lable
    }
    val=10;
    
    printf("%d\n",val);
    //执行下面的asm就会挂掉
    _asm{
        jmp pCode    
    }
    val=20;
    
lable:
    printf("%d\n",val);
    return 0;
}

解决方案: