为什么用 C# 编写的程序基本上可以通过变量名(例如 dnSpy)反向编译为其原始形式,而 C++ 反编译器(例如 Ghidra)无法解码变量名?
为什么 C# 应用程序可以使用变量名进行反向编译而 C++ 应用程序不能?
逆向工程
C++
dll
C#
2021-06-28 09:45:24
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
其它你可能感兴趣的问题