这里的一些答案表明,调试信息可以更容易地对软件进行逆向工程。当我使用Visual C ++并使用调试信息分发可执行文件但没有其他文件(.pdb)时,它是否包含任何有趣的东西?
我用十六进制编辑器查看了可执行文件,发现没有像符号名称那样,现在我假设.exe文件只链接到.pdb文件中的信息,对吧?
你知道它是否包含
答案 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()时,代码都会包含一个包含文件名和行号的字符串。