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

问题描述 投票:0回答:2

我有一个包含一些算法的

.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
    never 的程序调用这样的
    _ZN4core3ptr102drop_in_place$LT$alloc..vec..Vec$LT$vision_utils_rs..algo..rep..row_detect..core_algo..TextRow$GT$$GT$17h0axxxfa922f149aE.llvm.176520069xxxxxx41370
    函数,所以删除这个函数名应该是安全的。
  2. 我还应该做什么?如果我查看
    dumpbin.exe /ALL myfile.dll
    并且没有看到任何包含
    core_algo
    (我的代码的核心算法文件夹)的文本,我安全吗?还是我还遗漏了什么?

附注如果您有兴趣,DLL 是由 Rust 代码编译而成的;但C++代码应该有类似的效果。

Cargo.toml
是:

[profile.release]
debug = true

换句话说,我进行了发布构建(

cargo build --release
),但保留了调试信息(因为我想将调试信息上传到 Sentry 以进行符号化)。但我希望在提供给最终用户之前进一步剥离。

c++ windows rust dll
2个回答
4
投票

如果有人决心对您的程序进行逆向工程,他们会,并且您无法阻止他们。如果您取出所有符号,它们仍然会分析机器代码。如果您混淆机器代码,他们将进行逆向工程that

另一方面,绝大多数人不关心你的程序如何工作,甚至不会注意到二进制文件是否有符号。

因此,任何针对逆向工程强化程序的努力都是白费力气。别担心。专注于让程序更好地完成其实际用途,以便人们想要为此给你钱。


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

这并不是说某些强化是没有根据的...您只是想提高标准以阻止那些认为自己是l33t hackz0rs的休闲小孩子。

我不同意这一点。 IMNSHO 在针对逆向工程的强化方面投入的所有努力都是白费力气。特别是,从编译的二进制文件中“剥离”符号(函数和对象名称)不仅是浪费精力,而且会“适得其反”。它使得那些出于好奇心的人不太可能满足于随意浏览一下符号表。同时,它使您的用户更难向您发送良好的错误报告。 在此背景下,值得指出的是,尽管 Microsoft 自己热衷于保护其对 Windows 的“知识产权”利益,但仍向公众提供

Windows 的详细符号表和其他调试信息

。这项服务的运行成本很高,而且它让 WineReactOS 的开发者能够更轻松地弄清楚他们需要做什么才能与 Windows 兼容 bug。无论如何,他们都会运行它,因为他们知道,对于他们来说,促进调试涉及核心 Windows 组件的奇怪应用程序崩溃更有价值。 脚注:“针对逆向工程的强化”不应与“针对安全漏洞的强化”混淆。堆栈金丝雀、控制流完整性保护等都是

值得做的。

我找到了答案:DLL中确实没有这样的信息。这是因为 PDB 隐藏在其他地方而我没有意识到。请参阅

https://stackoverflow.com/a/71422958/4619958

1
投票

© www.soinside.com 2019 - 2024. All rights reserved.