设为首页 加入收藏

TOP

C++虚函数逆向教程(1)(二)
2016-12-30 08:14:41 】 浏览:528
Tags:函数 逆向 教程
针,比如Dog__run的类型是void (*)(Dog*),这样就更容易识别了。
最后一步是回到原来的代码中,为变量赋予适当的类型:

上面是把m设定为Cat*或Dog*,可以看到,现在的代码比刚才简洁很多:如果m是Dog类型的话,那么第15行调用的就是Dog__walk,否则是Cat__walk。这个例子很简单,但能够说明我们大致的思路了。
我们也可以把m设置为Mammal*类型,但效果就不太好了:

假设m是Mammal*类型,那么第15行就会调用一个纯虚函数,这是不可能的,此外第17行的调用也会产生问题。因此我们可以推测,m一定不是Mammal*类型。
这种和源代码不符的说法,可能听上去比较奇怪。实际上,这是因为在编译时,我们给m赋予的是一个编译时的类型(静态类型),但我们更关注它的动态类型(或者说是运行时的类型),因为这才是决定哪个虚函数被调用的关键。事实上,一个元素的动态类型,基本永远不可能是一个抽象类。因此如果给出的虚表中,含有一个___cxa_pure_virtual函数,那这个类型可能并不是他的运行时类型,可以无视。实际刚才的例子中我们完全可以不给Mammal类的虚表创建一个结构体,因为这个结构体永远都不会用到。
通过以上的分析,我们知道了,动态类型可能是Cat或者Dog,我们也知道了如何通过查看虚表的项目,来判断哪个函数会被调用,这是C++虚函数逆向的第一步。下一步,我们会介绍如何处理更多、更复杂的二进制程序和继承关系。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数字组合问题 下一篇雷德算法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目