从C ++编译反向工程二进制文件时,通常会在vtables中看到许多对函数指针的间接调用。若要确定这些调用的位置,必须始终了解虚函数中的this指针期望的对象类型,并且有时必须映射出类层次结构。

在静态分析的上下文中,应使用哪些工具或使用注释技术使反汇编中的虚拟函数更易于遵循?欢迎使用所有静态分析工具包的解决方案。

#1 楼

我在2011年的Recon上做了一个有关这个确切主题的演讲(“实用C ++反编译”)。提供幻灯片和视频(镜像)。

基本方法很简单:将类表示为结构,将vtables表示为函数指针的结构。我描述了一些技巧,可让您为同一层次结构中的类处理继承和不同的vtable。这些技巧在此博客中也有介绍。我不确定它是基于我的演讲还是基于独立的工作。

我要做的另一件事是在具有实现地址的vtable结构中的每个插槽中添加可重复的注释。当您将结构应用于vtable插槽负载时,这使您可以快速跳转至实现:



评论


有关此问题的问题:1)当不确定所引用的vtable时,如何(个人)注释间接调用? (更具体地说,当该调用有多个可能的目标地址时?)2)在确定用途之前,如何(个人)命名类结构,以及在更改之前让它们的临时名称在数据库中传播多长时间? ?

–user1354557
13年3月21日在20:02



我(通常)为每个实际的vtable实例创建一个vtable结构,因此地址始终指向实际的实现。但是,没有什么可以阻止您在评论中添加多个地址。至于命名,我实际上没有固定的规则集,可以在单个数据库中混合使用匈牙利语,CamelCase和undescored_words。重新命名的东西很烦人,因此我通常将重命名类和方法推迟到我有理由确定该类在做什么(或者有RTTI或调试信息)之前。

–伊戈尔·斯科钦斯基♦
13年3月21日在20:08

优秀的。关于第二个问题,我在问您是否有一些系统的方式来生成和处理临时名称。在没有上下文信息的情况下,我要做的是为班级选择一个“随机”的三个字符的语音名称。由于此临时名称会传播到注释,函数名称,结构成员,变量名称等。我不会总是为重命名而烦恼,但我将在“记事本”子视图中做一个注释,以解释类的实际含义。

–user1354557
13年3月21日在20:20