我有一个包含一些算法的
.dll
文件,我不想泄露该算法的实现。最初我认为是安全的,因为在 Windows 中调试信息位于 .pdb
中。然而,我尝试使用dumpbin.exe /ALL myfile.dll
,并在那里看到大量的我的内部函数名称,这使得攻击者的生活变得更容易,因为他可以知道每个函数的名称。就像:
Function Table (24926)
Begin End Info Function Name
...
00001158 000xxxx0 0xxxx277 008AD830 _ZN4core3ptr102drop_in_place$LT$alloc..vec..Vec$LT$vision_utils_rs..algo..rep..row_detect..core_algo..TextRow$GT$$GT$17h0axxxfa922f149aE.llvm.176520069xxxxxx41370
Unwind version: 1
Unwind flags: None
Size of prologue: 0x0E
Count of codes: 7
Unwind codes:
0E: SAVE_XMM128, register=xmm6 offset=0x20
09: ALLOC_SMALL, size=0x38
05: PUSH_NONVOL, register=rbx
04: PUSH_NONVOL, register=rdi
03: PUSH_NONVOL, register=rsi
02: PUSH_NONVOL, register=r14
这是核心算法中的一个函数(我的代码的
core_algo
文件夹)。
因此,我想知道:
.dll
never 的程序调用这样的 _ZN4core3ptr102drop_in_place$LT$alloc..vec..Vec$LT$vision_utils_rs..algo..rep..row_detect..core_algo..TextRow$GT$$GT$17h0axxxfa922f149aE.llvm.176520069xxxxxx41370
函数,所以删除这个函数名应该是安全的。dumpbin.exe /ALL myfile.dll
并且没有看到任何包含 core_algo
(我的代码的核心算法文件夹)的文本,我安全吗?还是我还遗漏了什么?附注如果您有兴趣,DLL 是由 Rust 代码编译而成的;但C++代码应该有类似的效果。
Cargo.toml
是:
[profile.release]
debug = true
换句话说,我进行了发布构建(
cargo build --release
),但保留了调试信息(因为我想将调试信息上传到 Sentry 以进行符号化)。但我希望在提供给最终用户之前进一步剥离。
如果有人决心对您的程序进行逆向工程,他们会,并且您无法阻止他们。如果您取出所有符号,它们仍然会分析机器代码。如果您混淆机器代码,他们将进行逆向工程that。
另一方面,绝大多数人不关心你的程序如何工作,甚至不会注意到二进制文件是否有符号。
因此,任何针对逆向工程强化程序的努力都是白费力气。别担心。专注于让程序更好地完成其实际用途,以便人们想要为此给你钱。
编辑:回应paddy去年的评论:
这并不是说某些强化是没有根据的...您只是想提高标准以阻止那些认为自己是l33t hackz0rs的休闲小孩子。
我不同意这一点。 IMNSHO 在针对逆向工程的强化方面投入的所有努力都是白费力气。特别是,从编译的二进制文件中“剥离”符号(函数和对象名称)不仅是浪费精力,而且会“适得其反”。它使得那些出于好奇心的人不太可能满足于随意浏览一下符号表。同时,它使您的用户更难向您发送良好的错误报告。 在此背景下,值得指出的是,尽管 Microsoft 自己热衷于保护其对 Windows 的“知识产权”利益,但仍向公众提供
Windows 的详细符号表和其他调试信息。这项服务的运行成本很高,而且它让 Wine 和 ReactOS 的开发者能够更轻松地弄清楚他们需要做什么才能与 Windows 兼容 bug。无论如何,他们都会运行它,因为他们知道,对于他们来说,促进调试涉及核心 Windows 组件的奇怪应用程序崩溃更有价值。 脚注:“针对逆向工程的强化”不应与“针对安全漏洞的强化”混淆。堆栈金丝雀、控制流完整性保护等都是
值得做的。我找到了答案:DLL中确实没有这样的信息。这是因为 PDB 隐藏在其他地方而我没有意识到。请参阅
https://stackoverflow.com/a/71422958/4619958