如何查找C ++可执行文件的所有对象(类对象/结构)

时间:2012-03-21 09:47:45

标签: c++ reverse-engineering

有没有办法,可能使用nm或gdb,让我创建一个可执行文件包含的所有对象类型的列表?

为了澄清,我有源代码。我需要一种方法来计算运行时使用的所有类/结构大小。所以这可能是一个两部分问题:

  1. 创建所有类/结构的列表
  2. 对列表中的每个项目使用sizeof(),在gdb中。

3 个答案:

答案 0 :(得分:9)

“类型”不是机器代码的属性。它们是高级抽象语言的属性,编译到机器代码中。除非编译器为您恢复有关源程序的信息做出具体安排,否则通常根本不存在类型信息。

答案 1 :(得分:2)

http://www.hex-rays.com/products/ida/index.shtml:DeCompiler for C ++

除非编译好调试信息,否则通常不会从二进制文件中获得好的C ++。准备花费大量的手工劳动来扭转代码。

如果你没有删除二进制文件,那么就有一些希望,因为IDA Pro可以生成类似C的代码供您使用。

答案 2 :(得分:0)

从gdb获取类型列表很容易。您只想先info types,然后再想ptype(如果要向下钻取该类型(将其限制为与字符串匹配的类型,只是为了保持较小)即可):

(gdb) info types Q
All types matching regular expression "Q":

File foo.cpp:
Qq;
(gdb) ptype Qq
type = class Qq {
  private:
    int qx;

  public:
    Qq(int);
    std::__cxx11::string something(std::__cxx11::list<int, std::allocator<int> >);
    int getQ(void);
}

sizeof告诉您结构的大小(当然,它是结构本身,因此这可能有用,也可能没有那么有用):

(gdb) p sizeof(Qq)
$1 = 4
(gdb) 

您可能想要在脚本中运行gdb并以某种方式解析输出。