最近打算把《老码识途》搞一遍,就先拿这个构造汇编语句开刀吧。
1.1.3
在c语言里嵌入汇编语句,构造mov和jmp的机器指令,从而让程序按自己指定的路径跑。
见代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 int gi; 6 void *address; 7 8 void *buildCode(); 9 10 int main(){ 11 void *code=buildCode(); 12 _asm { 13 mov address,offset _lb1 14 } 15 gi=12; 16 printf("gi=%d ",gi); 17 _asm jmp code 18 gi=13; 19 _lb1: 20 printf("gi=%d ",gi);//输出18 21 getchar(); 22 return 0; 23 } 24 void *buildCode(){ 25 char *code=(char *)malloc(16); 26 char *pMov=code; 27 char *pJmp=code+10; 28 char *pAddress; 29 //mov gi,18 30 pMov[0]=0xc7; 31 pMov[1]=0x05; 32 pAddress=pMov+2; 33 *((int *)pAddress)=(int)&gi; 34 *((int *)(pAddress+4))=18; 35 //jmp address 36 pJmp[0]=0xff; 37 pJmp[1]=0x25; 38 *((int *)(&pJmp[2]))=(int)&address; 39 return code; 40 }
buildCode()就是在code处构造两句汇编指令,从而运行_lb1处代码,输出18。
反汇编查看code处:
代码构造成功。