为什么 C# 应用程序可以使用变量名进行反向编译而 C++ 应用程序不能?

逆向工程 C++ dll C#
2021-06-28 09:45:24

为什么用 C# 编写的程序基本上可以通过变量名(例如 dnSpy)反向编译为其原始形式,而 C++ 反编译器(例如 Ghidra)无法解码变量名?

1个回答

调试符号信息通常从C++二进制文件中“剥离” 符号信息存储所有用户创建的名称、符号和类型、边界、功能边界和其他与函数相关的元数据信息(它通常根据流行和标准化的“矮人”格式存储,在现代编译器中广泛使用和使用)。如果您想保留此信息,请使用 --g在 gcc 或 clang 中标志来编译您的二进制文件例如gcc -g myprog.c您将找到 Ghidra 渲染的所有用户定义符号。

另一方面,在C#.NET 中删除名称符号元数据是不可能的(因为反射需要在运行时检索类型的符号)。因此,为了解决这个问题,C#通常会对符号进行混淆

参考资料: https ://www.appsealing.com/code-obfuscation-comprehensive-guide/ http://www.semdesigns.com/Products/Obfuscators/CSharpObfuscationExample.html https://help.gapotchenko.com/eazfuscator.net /53/advanced-features/symbol-names-encryption