读书人

quot;(*(void(*)())0)(); 和 for(;) Funct

发布时间: 2012-03-09 16:54:57 作者: rapoo

"(*(void(*)())0)(); 和 for(;;) Function();"这个帖子的主人来给指点下
下面这段话是你在帖子中的有的原话,我有些想不明白, "我在VC6中,先编译一编,得到LABLE的地址. "这句话什么意思,得到的是什么地址?内存地址好像在编绎时得不到吧,应该在运行时才能确定的吧,希望给点指教.


===================================================
zhujiujun ( < < < < < < < <动感光波> > > > > > > > )

其实用 "(*(void(*)())Address)(); "这个就可以跳出来.
我发帖的时候刚好看到它,便想起了第2个问题.
例如:

for (;;)
Function();
LABLE:
...

只需要知道LABLE的地址,就可以在Function中调用(*(void(*)())Address)();
跳到LABLE的位置,执行后面的程序.

我在VC6中,先编译一编,得到LABLE的地址,然后把该地址给Address.即可以实现.
但是这种方法也只能是一种取巧了.
Chiyer(星羽) 的longjmp确实不错,但是不知道会不会产生什么问题.继续研究一下

===========================================================



[解决办法]
这个,你得了解编译方面的知识了。
对你稍深了点,跳过吧。
不要好奇心太强,有太多更重要的东西要学呢。
[解决办法]
得到这个标签的地址
其实也就是下面执行代码的地址空间
最终的确立在连接和加载期决定的
编译好像不扫描相互依赖的关系
[解决办法]
呵呵,原帖的帖主应聘的应该是一个嵌入式的公司.

嵌入式系统里面应该有不少用这种手法的.
[解决办法]
LABLE最终就是一个地址,就是循环后面的那一句。(*(void(*)())LABLE)()就是执行修改PC的为LABLE,实现了程序的跳转

[解决办法]
有兴趣google PE文件格式 参考参考就知道了。

读书人网 >C++

热点推荐