- 注册时间
- 2005-3-12
- 最后登录
- 1970-1-1
|
C/C++中的函数指针 在LAVA纯软件条件下不可实现性分析
by sippey
C/C++中利用函数指针是非常有用的一项特性,但经证明,纯粹的函数指针跳转在LAVA纯软件条件下不可能实现。
我所说的纯粹的函数指针跳转有两大特点,一是指向必须具有在运行时也具有随意性,二是必须在callee(被调函数)对程序编写者不可见(不知其内部信息,只知道调用参数及返回值)。
下面我们开始分析,假设题设为假,即有可能实现,那么函数指针必须要实现执行路径的跳转,即改变IP的值。在LAVA中可以完成这样的任务的代码只有三条,goto、call、ret。其中goto, call 为立即寻址,不能满足要求。因此只有ret可能在与一些其他代码合作的情况下完成此项任务。
为简化问题,我们暂且不分析其他的步骤,只分析跳转的核心步骤----ret。
1.在某一个ret后,执行路径将转到callee。那么在执行ret前,虚拟机的bp必然指向callee的地址。
2.在执行完此ret后bp'=old_BP,sp'=bp。此时执行callee的第一条命令func(类似于x86的enter)
3.执行完func之后bp"=sp'=bp 恰为 1 中的bp 也就是说 在callee执行完返回时必然返回到callee的开头重新执行。
此步骤只涉及ret,func两条指令,其间不可能插入任何指令,因此题设成立。
------------------
P.S.
1.虽然函数指针用来调用不能实现,但是用于跳转却是有可能的。这是因为跳转不涉及返回地址及栈祯的变化。
2.可以用指针跳转+其他技巧的办法来实现伪函数指针调用,这在LAVA这样几乎严格以函数为单位的程序架构中,虽然不能代替前面提到的那种无所不能的“纯粹的函数指针”的所有功能,但是也是可以完成绝大多数的功能的。
3.本文讨论的是“在纯软件条件下”,LAVA程序是在虚拟机上运行的,我把虚拟机看作是硬件。在修改虚拟机参数甚至是代码的条件,函数指针可以完全被实现。但是修改虚拟机会使程序失去跨平台性,还不如用6502写呢,呵呵。
|
|