rust 避免泄漏内部函数信息:如何正确检测和剥离Windows dll文件中的符号?

9rnv2umw  于 9个月前  发布在  Windows
关注(0)|答案(2)|浏览(151)

我有一个包含一些算法的.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进行符号化)。但我想在给最终用户之前进一步剥离。

xzv2uavs

xzv2uavs1#

如果有人决心要对你的程序进行逆向工程,他们会,你无法阻止他们。如果你把所有的符号都去掉,他们仍然会分析机器代码。如果你混淆机器代码,他们会逆向工程 * 那个 *。
另一方面,绝大多数人 * 不关心 * 你的程序是如何工作的,甚至不会注意到二进制文件是否有符号。
因此,任何加强你的程序抵抗逆向工程的努力都是白费力气。不要担心它。集中精力让程序在它实际做的事情上做得更好,这样人们就愿意给予钱。

**编辑:**回应paddy去年的评论:

这并不是说一些硬化是没有根据的……你只是想提高标准,足以阻止那些认为自己是l33t黑客的随便的孩子。
我不同意这种说法。IMNSHO所有的努力都是为了加强对逆向工程的防御。特别是,“剥离”符号(函数和对象名称)不仅是浪费精力,而且适得其反。它使那些出于好奇心的人不太可能通过随意浏览符号表来满足。同时,这会让你的用户更难给你发送好的bug报告。
在这种情况下,值得指出的是,微软自己,尽管热情地保护他们在Windows中的“知识产权”利益,使detailed symbol tables and other debugging information for Windows向公众开放。这项服务需要他们花钱运行,这使得WineReactOS的开发人员更容易弄清楚他们需要做什么才能与Windows兼容。他们还是运行它,因为他们明白,对他们来说,更有价值的是帮助调试涉及Windows核心组件的奇怪应用程序崩溃。
脚注:“强化逆向工程”不应与“强化安全漏洞”混淆。堆栈金丝雀、控制流完整性保护等都是值得做的。

xv8emn3q

xv8emn3q2#

我找到了答案:DLL确实没有这样的信息。这是因为一个PDB隐藏在其他地方,我没有意识到。请参阅https://stackoverflow.com/a/71422958/4619958的完整细节。

相关问题