我做了一些PE分析脚本。一部分是虚函数提取,我使用这个模式实现了 vTables 查找。
实际的查找算法不是问题的重要部分。我不知道如何确定 vTable 的实际大小,我得到的是指向 COL 的指针,指向第一个虚拟方法的指针,指向第二个虚拟方法的指针,...指向最后一个虚拟方法的指针。
所以问题是我不知道哪个虚方法是最后一个。任何与此相关的帮助表示赞赏。
我做了一些PE分析脚本。一部分是虚函数提取,我使用这个模式实现了 vTables 查找。
实际的查找算法不是问题的重要部分。我不知道如何确定 vTable 的实际大小,我得到的是指向 COL 的指针,指向第一个虚拟方法的指针,指向第二个虚拟方法的指针,...指向最后一个虚拟方法的指针。
所以问题是我不知道哪个虚方法是最后一个。任何与此相关的帮助表示赞赏。
您可以尝试以下启发式方法:从给定的基地址扩展 vtable,直到到达已被归类为其他内容的地址(例如下一个 vtable 的 COL 指针),或者您发现某些内容不是已知地址的地址已知代码段中的函数。这个分析步骤应该推迟到完整的 RTTI 描述符及其相关结构被发现和验证之后。
如果可以通过其他方式(如调试信息、映射文件或 64 位可执行文件必需的函数描述符表)确定地或至少合理准确地识别函数,则此方法有效;如果分析虚表的目的是找到更多的代码地址,它就不会那么好用。
我发现这种启发式算法在几个现实世界的分析项目中的表现相当令人满意,比如一个包含大约 23000 个 vtable 的大型游戏可执行文件。