混淆C ++共享库

时间:2015-02-23 02:41:27

标签: obfuscation c++

我被要求帮助混淆一个将分发给客户的库(用C ++编写)。我已经讨论过为什么混淆不一定是个好主意,并且看到许可将被整合到软件中,许多关于复制保护的问题都没有实际意义。

无论如何,我还是被要求研究方法。我已经查看了头文件(以及类似版本)以及HARES,但是我找不到可以用于库的任何东西(当然,这些东西会破坏任何形式的API,使库无用)。

我可以应用哪些适用于图书馆的技术?虽然我希望对可能有用的工具(或编译器标志等)提出建议,但我想强调的是,这不是一个以工具为中心(即可关闭)的问题,而是一个侧重于适用技术的问题。

2 个答案:

答案 0 :(得分:6)

我不会花太多精力去做这件事,因为逆向工程师将会赢得这一轮。

https://softwareengineering.stackexchange.com/questions/155131/is-it-important-to-obfuscate-c-application-code

混淆C ++二进制文件是一场失败的战斗。这取决于你正在与谁打交道,但如果你的逆向工程师足够聪明,可以使用IDA Pro和一些插件,以及一个好的调试器,那么它一切都是徒劳的。

混淆优先级

  • 你可以给逆向工程师提供无用的功能名称。

老实说,这没有多大帮助,因为最终你的代码将不得不调用某种非混淆的共享库来完成任何事情。在某些时候,您将使用标准库,或STL,甚至进行系统调用。

  • 添加虚假路径以混淆静态分析

因此,逆向工程师可以使用调试器获得乐趣。反分析技术是逆向工程师所熟知的,它们几乎可以通过像ollydbg这样的调试器来规避。

  • 编写调试程序代码

反向工程师喜欢玩。同样,这是一个预期的举动,响应只是绕过有问题的代码,或修改掉陷阱。任何在RE接受过正规训练的人都会过时。

  • 将我的大部分二进制文件打包到一个加密区域,该区域在执行之前由存根解密。

与上述答案相同。反向工程师从第一天开始为此进行培训。

  • 请记住,逆向工程师正在寻找有针对性的信息背景 - 他们很少尝试重新创建整个应用程序。安全密集型代码,许可证验证代码,家庭基础通信代码,网络代码。这些都是主要目标 - 将精力投入到制造这些棘手的地方。

  • 请记住,地球上最大的公司的二进制文件经常被20世纪初的人们逆向设计。

  • 不要将调试符号保留在最终二进制文件中,因为这些符号肯定有助于分析。

  • 如果您致力于做到这一点,也要专注于浪费工程师的时间 - 时间总是与逆向工程师对抗。

请记住,任何有意义的混淆都可能会使您首先在C ++中使用合理的性能提升。 C世界中有许多区域(对于Java世界而言),有可能无法进行有意义的混淆。例如,游戏无法隐藏他们对OpenGl API的调用,也无法真正阻止工程师收集着色器代码。

还要记住,逆向工程师大多数时间都在程序集级别上查看代码。他宁愿拥有你的功能名称,但如果需要,他可以没有它。他可以在最有限的水平上看到你的程序正在做什么。他找到关键的惯例只是时间问题。

为了您的目的,找到一个程序来破坏功能名称,让老板高兴,并称之为一天。至少在那时,对软件进行逆向工程将不会琐碎

答案 1 :(得分:1)

你真的有2个主要载体,你必须防范

  1. Disassembley
  2. 调试
  3. 我最喜欢的防止第一个问题的方法是在内存中解密,获取可执行代码的一部分并加密它,在库运行时让它在内存中自我解密,你也可以校验部分代码并比较校验和反对ram中加载的内容(加密部分检查解密器,反之亦然)

    另一个巧妙的技巧是静态地将您使用的库链接到您的可执行文件中,这样就无法轻易地将它们换出来试图查看您的代码正在做什么。

    现在调试检查中断向量有帮助,另一个技巧是检查代码的各个部分之间的“时间”(例如,如果代码中发生的延迟超过几毫秒,应该比那时执行得快得多)假设代码正在调试