#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;
}
解决方案:
时间: 2024-10-26 19:31:36