高手都来看看,分析程序的运行结果~~~
不是病毒,分析理解。
难道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;
新手进来观摩,请问这是一种什么写法?
[解决办法]
[解决办法]
参考“冯·诺伊曼”原理
[解决办法]