码迷,mamicode.com
首页 > 其他好文 > 详细

程序为何挂掉?

时间:2014-05-25 19:13:58      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   java   

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

解决方案:

 

程序为何挂掉?,布布扣,bubuko.com

程序为何挂掉?

标签:style   class   blog   c   code   java   

原文地址:http://www.cnblogs.com/qiangua/p/3750536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!