一次无聊的尝试----用C语言,在子程序里修改主程序的局部变量.

/*
  文件名:cvar.cpp
  环境:win2k sp4+vc6
  作者: Vical Lee
  完成日期:2004-9-12 晨1:00
  版本:1.0
  描述:测试如何在子程序里修改主程序的局部参数.
  */
  #include <stdio.h>
  #include <string.h>
  void foo(void);
  int main(int argc, char* argv[])
  {
  int a = 3, b = 4;
  char c = 'a';
  char *d = "b";
  long e = 2;
  float f = 3.0;
  foo();
  printf("a=%d/t b=%d/t c=/'%c/'/t d=%08X /"/"/t e=%ld/t f=%f/n",
   a, b, c, d, e, f);
  }
  void foo(void)
  {
   int paramcount = 0;
   char *p;
   _asm{
  push edi;
  mov edi, [ebp];/*取得主程序的EBP;*/
  mov p, edi;
  sub edi, ebp;/*主程序的esp==现在的ebp+返回地址栈位+原ebp栈位.即esp==ebp+2*4 */
  sub edi, 4*5;/*程序保存了返回地址,ebp,ebx,esi,edi共占5个栈位,*/
   /*故再减5个栈位可取得主程序局部参数所占字节数*/
  mov paramcount, edi;
  sub p, edi;/*P即为主程序局部参数起始地址了.*/
  pop edi;
   }
   memset(p, 0, paramcount);/*把它全部置0算了,极其危险的作法,如果主程里malloc了,就
   会导致主程序访问*(NULL),产生0址访问异常.*/
  }
  输出:
  a=0 b=0 c=' ' d=00000000 "" e=0 f=0.000000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值