首页 > 代码库 > 程序为何挂掉?
程序为何挂掉?
#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; }
解决方案:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。