首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

高手都来看看,分析程序的运行结果~该怎么处理

2012-06-09 
高手都来看看,分析程序的运行结果~~~不是病毒,分析理解。难道C++中 内存都是可以执行的吗?第一题:#include

高手都来看看,分析程序的运行结果~~~
不是病毒,分析理解。

难道C++中 内存都是可以执行的吗?

第一题:
#include <stdio.h> 
int main() 

  const short int c1 = 49920; 
  const int c2 = 1073742008; 

  int (*pf)() = (int (*)())&c2; 
  printf("%c%c\n", *(char*)pf()-19, *((char*)pf()+1)-49); 
  return 0; 




第二题:

C/C++ code
#include <iostream.h>void main(){    unsigned char c[]={0xb8,0x78,0x56,0x34,0x12,0xc3}; // mov eax,12345678h / ret    int (*p)()=(int (*)()) &c[0];    cout<<p()<<endl;}


或者:
C/C++ code
#include <iostream.h>#include <string.h>void main(){    unsigned char c[]={0xb8,0x78,0x56,0x34,0x12,0xc3,0}; // mov eax,12345678h / ret    char *p=new char[8];    strcpy(p,(char*)c);    int (*f)()=(int (*)()) p;    cout<<f()<<endl;    delete[]p;}



[解决办法]
底层语言嘛,有指针就会出现很高深的代码。因为所有的东西在计算机内部都是数据,都有地址,而指针就是地址这一类的东西。
[解决办法]
不太明白你说 的"内存都是可以执行的"是什么意思
[解决办法]
程序被编译后,不就是二进制? move指令本来就是二进制的抽象,用机器码编程,就是01字符串的组合。没什么嘛,至于用二进制编码,感觉需要对硬件地址需要相当的了解。


[解决办法]
这个,你的栈和堆,都是可执行段,强力的编译器或者强力的系统,强力啊

现在的小朋友,没经历过,内存管理的原始时代。还好,lz没弄个石器时代的东西,那时候还没有c,呵呵呵。
[解决办法]
阿门, 在虚拟地址空间里你是可以随心所欲的, 操作系统会protect you.
[解决办法]
第一个例子使用了MZ头部,Linux下肯定不行啊。
[解决办法]
你最好去看操作系统的内存管理

重点看看页保护
[解决办法]
蛋疼代码
[解决办法]
我是新手,但还是进来看了,看不懂,不好意思!
[解决办法]
C/C++ code
#include <stdio.h>  int main()  {    const short int c1 = 49920;    const int c2 = 1073742008;    int (*pf)() = (int (*)())&c2;  //这里int (*pf)()是一个系统里面的指针函数????  printf("%c%c\n", *(char*)pf()-19, *((char*)pf()+1)-49);    return 0;  }
[解决办法]
int (*pf)() = (int (*)())&c2;
新手进来观摩,请问这是一种什么写法?
[解决办法]
探讨
int (*pf)() = (int (*)())&amp;c2;
新手进来观摩,请问这是一种什么写法?

[解决办法]
参考“冯·诺伊曼”原理
[解决办法]
探讨

引用:
int (*pf)() = (int (*)())&amp;amp;c2;
新手进来观摩,请问这是一种什么写法?

将c2的起始地址强制类型转换为一个函数指针,(该函数无参数,返回int),初始化赋值给pf这个变量。
pf的类型也是一个函数指针,(该函数无参数,返回int)

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇……

热点排行