【问题标题】:How safe is it to have a pdb released with the exe's?将 pdb 与 exe 一起发布有多安全?
【发布时间】:2020-05-13 22:40:59
【问题描述】:
如果我没看错,(https://github.com/Microsoft/microsoft-pdb),pdb 包含调试信息。如果您将一个与 exe 一起发布给客户,是否会带来客户或最终用户能够找到源代码的风险?
我可能认为,如果您将 Visual Studio 附加到该进程,我自己没有尝试过,但我相当确定您不需要为了使用 pdb 将源代码塞进某个地方查看入口点,并最终查看一些数据将采取的整个路线。
如果是这样,有没有办法阻止最终用户阻止这样做?
【问题讨论】:
标签:
security
debugging
pdb-files
【解决方案1】:
如果用户有足够的知识,你没有办法阻止用户发现你的程序做了什么。
即使没有 PDB,也可以使用一种称为逆向工程的技术来找出您的程序做了什么。像IDA Pro 这样的程序真的很擅长。使用中间语言的 C# 和 Java 等编程语言几乎以源代码的形式提供。像dotPeek 这样的工具可以显示反编译的源代码,它与真实源代码的接近程度令人难以置信。
关于 PDB,有公共 PDB 和私有 PDB。您通常会将公共 PDB 提供给公众(顾名思义)并保留私有 PDB 用于内部调试目的。可以使用名为 PDBCopy 的工具(使用 -p 参数)将私有 PDB(包含更多信息)转换为公共 PDB。
简化后,您可以这样想:公共 PDB 包含有关具有 public 关键字(或等效项,取决于您的编程语言)的方法的信息,私有 PDB 包含有关所有方法的信息(protected、internal , private 和任何关键字)。
PDB 不包含源代码;它们仅包含指向在编译时使用的文件的链接。这样,人们就可以弄清楚构建服务器的本地文件结构,这可能会被视为安全风险。恕我直言,这是可以接受的。
就我个人而言,我不会太担心会赠送公共 PDB。甚至微软也为 Windows 做这件事。而且你可以弄清楚微软构建服务器的本地目录结构;-)
例如,文件combase.pdb(符号存储哈希为 10EDC6786A36FBF7D9EE585F00212CB41)包含(以及其他)
d:\os\obj\x86fre\onecore\com\combase\dll\objfre\i386\combase.def
onecore\base\appmodel\common\removedirectorytree.cpp
【解决方案2】:
pdb 不包含源代码。它包含符号名称(函数、类、全局变量)和有关源文件名/行的信息(如何将 RVA 转换为文件/行)。所以 pdb 不会给用户你的源代码,而是给你的源文件的名称和文件系统中的完整路径和
所有内部符号名称