与 exe 一起发布 pdb 有多安全?

How safe is it to have a pdb released with the exe's?

如果我没看错,(https://github.com/Microsoft/microsoft-pdb),pdb 包含调试信息。如果您要将一个与 exe 一起发布给客户,是否会造成客户或最终用户能够找到源代码的风险?

我可能认为如果您将 Visual Studio 附加到该过程是可能的,我自己还没有尝试过,但我相当确定您不需要将源代码按顺序塞到某个地方使用 pdb 查看入口点,并最终查看某些数据可能采用的整个路径。

如果是这样,有没有办法阻止最终用户阻止这样做?

pdb 不包含源代码。它包含符号名称(函数、class、全局变量)和有关源文件 names/lines 的信息(如何将 RVA 转换为 file/line)。所以 pdb 不会给用户你的源代码,而是给你的源文件的名称和文件系统中的完整路径 所有内部符号名称

如果用户有足够的知识,您就无法阻止用户了解您的程序的用途。

即使没有 PDB,也可以使用一种称为逆向工程的技术来找出您的程序的作用。像 IDA Pro are really good at it. Programming languages like C# and Java that use an intermediate language are almost delivered in source code. Tools like dotPeek 这样的程序可以显示反编译的源代码,令人难以置信的是它与真实源代码的接近程度。

关于PDB,有public PDB和私有PDB。您通常会将 public PDB 提供给 public(顾名思义)并保留私有 PDB 用于内部调试目的。可以使用名为 PDBCopy 的工具(使用 -p 参数)将私有 PDB(包含更多信息)转换为 public PDB。

简化一下,你可以这样想:public PDBs 包含关于具有 public 关键字(或等效的,取决于你的编程语言)的方法的信息,私有 PDBs 有关于所有方法的信息(protectedinternalprivate 以及任何关键字)。

PDB 不包含源代码;它们只包含编译时使用的文件的 link 。这样,人们就可以弄清楚构建服务器的本地文件结构,这可能被视为安全风险。恕我直言,可以接受。

就个人而言,我不会太担心放弃 public PDB。甚至微软也为 Windows 这样做了。你可以弄清楚微软构建服务器的本地目录结构;-)

例如,文件 combase.pdb(具有 symstore 哈希 10EDC6786A36FBF7D9EE585F00212CB41)包含(以及其他)

d:\os\obj\x86fre\onecore\com\combase\dll\objfre\i386\combase.def
onecore\base\appmodel\common\removedirectorytree.cpp