我有一个包含一些算法的.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
文件夹)。
因此,我想知道:
1.使用这个.dll
的程序 * 从不 * 调用这样的_ZN4core3ptr102drop_in_place$LT$alloc..vec..Vec$LT$vision_utils_rs..algo..rep..row_detect..core_algo..TextRow$GT$$GT$17h0axxxfa922f149aE.llvm.176520069xxxxxx41370
函数,所以删除这个函数名应该是安全的。
1.我还能怎么办?如果我查看dumpbin.exe /ALL myfile.dll
并没有看到任何包含core_algo
(我的代码的核心算法文件夹)的文本,我是否安全?或者我仍然缺少什么?
P.S.如果你感兴趣,DLL是从Rust代码编译的;但是C++代码应该有类似的效果。Cargo.toml
是:
[profile.release]
debug = true
型
换句话说,我做了一个发布版本(cargo build --release
),但保留了调试信息(因为我想上传调试信息给Sentry进行符号化)。但我想在给最终用户之前进一步剥离。
2条答案
按热度按时间xzv2uavs1#
如果有人决心要对你的程序进行逆向工程,他们会,你无法阻止他们。如果你把所有的符号都去掉,他们仍然会分析机器代码。如果你混淆机器代码,他们会逆向工程 * 那个 *。
另一方面,绝大多数人 * 不关心 * 你的程序是如何工作的,甚至不会注意到二进制文件是否有符号。
因此,任何加强你的程序抵抗逆向工程的努力都是白费力气。不要担心它。集中精力让程序在它实际做的事情上做得更好,这样人们就愿意给予钱。
**编辑:**回应paddy去年的评论:
这并不是说一些硬化是没有根据的……你只是想提高标准,足以阻止那些认为自己是l33t黑客的随便的孩子。
我不同意这种说法。IMNSHO所有的努力都是为了加强对逆向工程的防御。特别是,“剥离”符号(函数和对象名称)不仅是浪费精力,而且适得其反。它使那些出于好奇心的人不太可能通过随意浏览符号表来满足。同时,这会让你的用户更难给你发送好的bug报告。
在这种情况下,值得指出的是,微软自己,尽管热情地保护他们在Windows中的“知识产权”利益,使detailed symbol tables and other debugging information for Windows向公众开放。这项服务需要他们花钱运行,这使得Wine和ReactOS的开发人员更容易弄清楚他们需要做什么才能与Windows兼容。他们还是运行它,因为他们明白,对他们来说,更有价值的是帮助调试涉及Windows核心组件的奇怪应用程序崩溃。
脚注:“强化逆向工程”不应与“强化安全漏洞”混淆。堆栈金丝雀、控制流完整性保护等都是值得做的。
xv8emn3q2#
我找到了答案:DLL确实没有这样的信息。这是因为一个PDB隐藏在其他地方,我没有意识到。请参阅https://stackoverflow.com/a/71422958/4619958的完整细节。