调试构建如何简化逆向工程?

时间:2010-12-07 09:56:49

标签: c++ debugging reverse-engineering

这里的一些答案表明,调试信息可以更容易地对软件进行逆向工程。当我使用Visual C ++并使用调试信息分发可执行文件但没有其他文件(.pdb)时,它是否包含任何有趣的东西?

我用十六进制编辑器查看了可执行文件,发现没有像符号名称那样,现在我假设.exe文件只链接到.pdb文件中的信息,对吧?

你知道它是否包含

  • 变量名称?
  • 功能/会员名称?
  • 行号?
  • 有意思吗?

5 个答案:

答案 0 :(得分:9)

调试版本倾向于生成可以轻松与高级语言结构相关联的输出。您可以通过查看机器代码来识别变量,测试,循环等。您不会获得变量的名称,但这通常是逆向工程中最不重要的考虑因素。

优化代码,OTOH,重新排列指令,展开循环,重用多个变量的槽,在函数之间共享代码块,内联小函数等等,使得识别原始意图变得更加困难。即使您拥有代码,它也会使调试变得更加困难,因为当前行标记通常非常误导,并且变量往往会消失或显示随机废话。

但是,这些都不会使逆向工程变得不可能。理解其含义只是更多的工作。

答案 1 :(得分:5)

使用调试信息构建不是“调试构建”。

“Debug build”是定义_DEBUG符号时的构建。如果是这样,有很多字符串可用于逆向工程(断言等)。

因此,您可以使用.pbd中的调试信息进行Release构建,并且对程序进行反编译将会像没有调试信息一样困难。

答案 2 :(得分:2)

可执行文件不应包含变量名称或行号。它可能包含函数/成员名称,用于导出的任何此类名称(更可能是lib / dll而不是exe)。

代码的结构将“更接近”类似于原始源代码 - 代码不可能被内联,语句重新排序,循环展开等等。

答案 3 :(得分:1)

很久以前,调试信息被附加到可执行文件中(以所谓的CodeView格式)。这些天它主要是在PDB文件中单独出现。 exe本身确实只包含PDB的链接。

PDB通常有两种形式:私人和公共(也称为剥离)。公共(例如由Microsoft提供的那些)通常只具有函数和全局变量的名称。私有(例如,使用调试信息构建应用程序时生成的)还可以包括类型信息(结构,枚举,类,变量类型)函数原型,局部变量名称和类型以及行号信息。

如果要检查PDB,请在Visual Studio安装的“DIA SDK”文件夹中检查DIA2Dump。

答案 4 :(得分:1)

优化使代码更难理解(并且在使用符号和源代码调试自己的代码时,也更难以在源代码和程序集之间进行关联)。

调试版本不包括行号,函数名和行号,这些属于PDB。但是,每次使用assert()时,代码都会包含一个包含文件名和行号的字符串。