int main(int argc, char* argv[])
{
//////////////////////////////////////////////////////////////////////////
//定义两个局部变量,数值转换成16进制为: //
//const short int c1 = 0xc300; //
//const int c2 = 0x400000b8; //
//其中变量c1的地址为:0x0012FF7C ,占两个字节 //
//c2的地址为:0x0012FF78,占四个字节 //
//这两个变量占据了连续的空间。 //
//变量赋值后,从0x12ff78开始的内存单元存储的字节码为:B8 00 00 40 00 C3,//
//对应的汇编码是: mov eax,400000h //
// ret //
//////////////////////////////////////////////////////////////////////////
const short int c1 = 49920;
const int c2 = 1073742008;
//////////////////////////////////////////////////////////////////////////
//定义一个函数指针,参数为NULL,返回值为int类型 //
//这个函数指针,指向上面的汇编码。这样,后面执行pf(),就执行了这段汇编码//
//////////////////////////////////////////////////////////////////////////
int (*pf)() = (int (*)())&c2;
//////////////////////////////////////////////////////////////////////////
//*(char*)pf()-19这个表达式, 将执行pf指向的汇编代码 //
//从汇编代码看这个函数调用后的返回值是0x400000 //
//pf()前面的char *是把函数的返回值转换成一个char*型指针, //
//这个指针指向0x400000,前面再加个*号,表示取0x400000地址的内容, //
//由于是char *型指针,因此从这个地址取一个字节。 //
//所以*(char*)pf()-19 表示的是从0x400000取出的字节内容再减去19。 //
// //
//*((char*)pf()+1)-49意思是从0x400000 + 1的地址取出一个字节内容在减去49 //
//熟悉PE文件结构的朋友一定知道,对于exe文件0x400000是内存加载的基地址。 //
//0x400000 字节的内容对应的是0x4D,0x400001 字节的内容对应的是0x5A. //
//*(char*)pf()-19的结果是0x3A , ((char*)pf()+1)-49的结果是0x29 //
//////////////////////////////////////////////////////////////////////////
printf("%c%c/n", *(char*)pf()-19, *((char*)pf()+1)-49);
return 0;
}
{
//////////////////////////////////////////////////////////////////////////
//定义两个局部变量,数值转换成16进制为: //
//const short int c1 = 0xc300; //
//const int c2 = 0x400000b8; //
//其中变量c1的地址为:0x0012FF7C ,占两个字节 //
//c2的地址为:0x0012FF78,占四个字节 //
//这两个变量占据了连续的空间。 //
//变量赋值后,从0x12ff78开始的内存单元存储的字节码为:B8 00 00 40 00 C3,//
//对应的汇编码是: mov eax,400000h //
// ret //
//////////////////////////////////////////////////////////////////////////
const short int c1 = 49920;
const int c2 = 1073742008;
//////////////////////////////////////////////////////////////////////////
//定义一个函数指针,参数为NULL,返回值为int类型 //
//这个函数指针,指向上面的汇编码。这样,后面执行pf(),就执行了这段汇编码//
//////////////////////////////////////////////////////////////////////////
int (*pf)() = (int (*)())&c2;
//////////////////////////////////////////////////////////////////////////
//*(char*)pf()-19这个表达式, 将执行pf指向的汇编代码 //
//从汇编代码看这个函数调用后的返回值是0x400000 //
//pf()前面的char *是把函数的返回值转换成一个char*型指针, //
//这个指针指向0x400000,前面再加个*号,表示取0x400000地址的内容, //
//由于是char *型指针,因此从这个地址取一个字节。 //
//所以*(char*)pf()-19 表示的是从0x400000取出的字节内容再减去19。 //
// //
//*((char*)pf()+1)-49意思是从0x400000 + 1的地址取出一个字节内容在减去49 //
//熟悉PE文件结构的朋友一定知道,对于exe文件0x400000是内存加载的基地址。 //
//0x400000 字节的内容对应的是0x4D,0x400001 字节的内容对应的是0x5A. //
//*(char*)pf()-19的结果是0x3A , ((char*)pf()+1)-49的结果是0x29 //
//////////////////////////////////////////////////////////////////////////
printf("%c%c/n", *(char*)pf()-19, *((char*)pf()+1)-49);
return 0;
}