CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

深入机器码...

楼主vcsongs(vcsongs)2002-02-03 18:52:26 在 C/C++ / C语言 提问

#include   "stdafx.h"  
   
  #include   <windows.h>  
  #include   <iostream>  
  using   namespace   std;        
   
  class   A  
  {  
  public:  
  A();  
  virtual   ~A();  
   
  virtual   void   Func();  
  int   n;  
  };  
   
  A::A()  
  {  
  n   =   0;  
  }  
   
  A::~A()  
  {  
   
  }  
   
  void   A::Func()  
  {  
  n++;  
  }  
   
  class   B   :   public   A  
  {  
  public:  
  B();  
  virtual   ~B();  
   
  virtual   void   Func();  
  };  
   
  B::B()  
  {  
   
  }  
   
  B::~B()  
  {  
   
  }  
   
  void   B::Func()  
  {  
  n--;  
  }  
   
  int   main(int   argc,   char*   argv[])  
  {  
  A*   pa   =   new   B;  
  typedef   void   (A::*PFN)();  
  PFN   pfn   =   A::Func;  
   
  BYTE   byCode[]   =   {  
  0xb9,   0xcc,   0xcc,   0xcc,   0xcc, //   mov   ecx,   #...  
  0xbe,   0xcc,   0xcc,   0xcc,   0xcc, //   mov   esi,   #...  
  0xff,   0xd6, //   call   esi  
  0xc3  
  };  
   
  //   write   object   pointer   to   byCode   buffer  
  DWORD   dw   =   (DWORD)pa;  
  byCode[1]   =   (dw   >>   0x00)   &   0xff;  
  byCode[2]   =   (dw   >>   0x08)   &   0xff;  
  byCode[3]   =   (dw   >>   0x10)   &   0xff;  
  byCode[4]   =   (dw   >>   0x18)   &   0xff;  
   
  //   type   cast   "dw   =   (DWORD)(void*)pfn"   ...  
  _asm  
  {  
  push   eax  
  mov   eax,   pfn  
  mov   dw,   eax  
  pop   eax  
  }  
   
  byCode[6]   =   (dw   >>   0x00)   &   0xff;  
  byCode[7]   =   (dw   >>   0x08)   &   0xff;  
  byCode[8]   =   (dw   >>   0x10)   &   0xff;  
  byCode[9]   =   (dw   >>   0x18)   &   0xff;  
   
  //   don't   modify   next   lines,   it   is   called   from   out   code  
  _asm  
  {  
  push   eax  
  lea   eax,   byCode  
  call   eax  
  pop   eax  
  }  
   
  cout   <<   pa->n   <<   endl;  
  return   0;  
  }  
   
  问题点数:100、回复次数:3Top

1 楼vcsongs(vcsongs)回复于 2002-02-03 18:53:47 得分 0

如何保证pa,   pfn绝对地址的不变?   Top

2 楼yanchang(笨笨)回复于 2002-02-03 19:17:30 得分 100

不用指针成不成Top

3 楼vcsongs(vcsongs)回复于 2002-02-03 19:35:54 得分 0

?   哪里不用指针.  
  对象指针不用可以的.    
  比如:  
  A   a;  
  ...  
  _asm  
  {  
        lea   max,   a  
        mov   ...  
  }  
   
  但函数指针不用不行吧...    
   
  Top

相关问题

  • 生成机器码问题。
  • 如何取得机器码?
  • 如何更改机器码
  • 机器码的头大问题
  • 关于机器码的问题
  • 有关机器码的问题
  • 机器码时怎么回事?
  • 关于8086机器码的问题
  • 怎么样获得PDA的机器码?
  • 请问怎么能知道自己的机器码?

关键词

  • virtual
  • bycode
  • xcc
  • dw
  • xff
  • pfn
  • func
  • eax
  • include

得分解答快速导航

  • 帖主:vcsongs
  • yanchang

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo