【问题标题】:Reverse engineering - compile with debug info逆向工程 - 使用调试信息编译
【发布时间】:2019-11-08 14:48:01
【问题描述】:

我正在学习逆向程序,我想知道..如果我使用调试信息进行编译:

gcc -g ....

这对逆转过程有什么帮助吗?如果我这样做,我会提供额外的信息吗?我找不到有关该主题的任何信息。

【问题讨论】:

  • 调试信息不​​提供那种信息。也许阅读 dis-assemblers 会有所帮助。
  • 你所说的逆向工程是什么意思,你期望它产生什么? (例如,一些 UML 建模器从 sources 反向填充 UML 模型)。由选项-g 生成的调试信息通常被调试器用于将地址与函数/操作中的行关联起来,以了解变量在内存/堆栈中的位置等,但这不是逆向工程
  • 所有-g 应该影响的是是否在编译+链接时生成符号调试信息。它实际上不应该影响 code 的生成。也就是说,您的真实问题是否以某种方式使用-g 编译是否会使其他人更容易对其他人进行逆向工程的您的代码?
  • @WhozCraig 是的,这正是我要问的......

标签: c debugging gcc reverse-engineering reversing


【解决方案1】:

它有助于将行号、文件名、宏定义等添加到生成的二进制文件中。但是,它不包括程序本身内部的程序的完整源代码。

这是一个包含在结果文件中的宏定义示例:

username@localhost /path/to/source/code $ gcc test.c -Wall -Wextra -gdwarf-4 -g3
username@localhost /path/to/source/code $ grep __STDC_VERSION__ a.out 
Binary file a.out matches

使用-g3编译时,调试信息对反编译更有用,如上例所示。

所以,你的问题的答案是:它提供了一些额外的信息,可能对反编译有用,但不足以成功地反编译和重新编译程序。如果可能,请将源代码提供给此人。

如果您想防止反编译您的代码,只需在构建和调试程序后像这样运行strip

strip program-file

-g 不应影响代码生成,它只是将仅对调试器有用的信息添加到生成的程序文件中。

如果您想禁止他人反汇编或反编译您的软件,只需将其包含在您的许可证中即可。

【讨论】:

  • 宏定义/用法在预处理过程中编译之前消失,并且不能成为调试信息的一部分
  • 信息包含在二进制文件中。只需grep-g3__STDC_VERSION__ 编译的东西,你就会看到。
  • #define AZE 1 int main() { return AZE; }(当然至少2行)并用-g编译,你不会在二进制/可执行文件中看到AZE,你也可以编译使用选项 -E 并检查 AZE 未出现在预处理结果中
  • @bruno 抱歉,只有在使用-g3 编译时才会出现特定的调试信息。
  • ok with -g3 你有 AZE 的定义(我不知道,谢谢你让我知道)但没有在源代码中使用它,所以兴趣很有限(其实我也看不出来可以是什么^^)
猜你喜欢
  • 2011-07-13
  • 2017-08-08
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多