0

我是电脑程序编制员。我有大约 5 年的不同语言编程经验。我担心我的代码速度,优化使用我的代码的内存,以及良好的编码风格等等。但从未想过我的代码有多安全。所以我反汇编了我的代码,看看黑客能做什么。破解我的密码容易吗?我看到了!这很容易,因为我正在存储

  1. 序列号作为字符串
  2. 加密解密代码

因此,如果有人对汇编器了解最少,他/她可以只简单地进行反汇编器,经过 10-20 分钟的调试,我的代码就被破解了!!!我猜甚至可以通过用记事本打开exe来完成!:-)

所以我要问的是:

  1. 我应该在哪里存储这种安全信息?
  2. 提供安全代码的常用策略是什么?
4

9 回答 9

1

如果您担心盗版,那么您可以采取多种途径。使代码安全性更严格(混淆、许可证代码、将软件绑定到特定 PC、硬件/加密狗保护等)是其中之一,但值得牢记的是,如果有足够才华的人可以被打扰,每个软件都可能被破解.

另一种方法是考虑软件的定价模型。如果您收取 1000 美元的副本费用,那么就会有很大的动力去尝试破解它。如果您只收取 5 美元,那么为什么有人要费心破解它呢?

所以需要的是一种平衡。即使是最基本的保护也将阻止普通人随意复制。除此之外,简单的技术(混淆和许可证代码)和合理的定价策略将使大多数潜在的破解者不值得破解。之后,您开始接触更复杂的技术(需要存在加密狗/CD 才能运行软件,只有在登录到在线许可系统后才能运行软件),这需要花费大量精力/成本来实施并显着增加惹恼真正客户的风险(还记得每个人在购买半条命但不让他们玩游戏时有多恼火吗?)-除非您拥有流行的主流产品(即需要保护的巨大收入来源),可能没有

于 2009-10-03T08:07:27.813 回答
1

使其成为网络应用程序。

于 2009-10-03T08:08:28.433 回答
1

它通常不会得到很好的保护,除非有一个外部服务在做你可以控制的检查——并且那些真正想要“破解”它的人仍然可以欺骗该服务。相反,请信任客户并仅提供最低限度的版权保护。我敢肯定 Joel Spolsky 在某处有一篇关于此的文章或播客……这是另一个相关的 SO question

我不知道它是否会有所帮助,但 Windows 提供(自 2000 年以来)一种检索和存储加密信息的机制,如果需要,您还可以在每个应用程序的基础上对该存储进行加盐:Data Protection API ( DPAPI )

这是在机器或用户级别上,但存储序列号和使用它的一些密钥可能比将它们隐藏在应用程序中更好?

于 2009-10-03T09:09:45.250 回答
1

您必须意识到的第一件事是,您永远不会阻止确定的逆向者破解任何保护方案,因为代码可以做的任何事情,逆向者最终都会找到如何复制它。实现任何可靠保护的唯一方法是让交付的程序只不过是一个愚蠢的客户端,并且在逆向器无法访问的某些服务器上首当其冲。

有了这个,你当然可以让反向者更难打破你的保护。混淆 是实现这一目标的第一步。我没有使用混淆器的经验,但我相信你可以在 SO 上找到一些建议。此外,如果您使用的是 C/C++ 等较低级别的语言,只需使用完全优化编译代码并去除所有调试符号即可获得相当多的混淆。

几年前我读过这篇文章,但我仍然认为它的技术在今天仍然存在。这是一款名为 Spyro 的视频游戏的开发者之一,他在谈论他们用来防止盗版的一套技术。他们声称直到发布后 3 个月才有破解版可用,这相当令人印象深刻。

于 2009-10-03T09:25:27.260 回答
1

你在说什么样的安全?从您保护用户数据的角度来看是否安全?如果是这样,请研究一些真正的密码学并利用现有库来加密您的数据。win32 API 非常适合这一点。

但是,如果您要阻止破解者窃取您的应用程序?方法有很多,但还是放弃吧。他们放慢饼干的速度,他们不会阻止他们。

于 2009-10-03T15:43:46.890 回答
0

看看如何在二进制代码中隐藏字符串?问题

于 2009-10-03T06:51:11.023 回答
0

执行此操作的一种简单技术是对所有代码进行异或并在需要时对其进行异或...但这需要与生俱来的汇编知识...我不确定,但是您可以尝试以下方法:

void (*encryptionFunctn)(void);
void hideEncryptnFunctn(void)
{
    volatile char * i;
    while(*i!=0xC0) // 0xC0 is the opcode for ret
    {
        *i++^=0x45; // or any other code
    }
}
于 2009-10-03T07:14:34.377 回答
0

首先,您必须定义您的代码应该针对什么进行安全保护,这样的安全是没有意义的。

您似乎担心逆向工程和用户无需付费即可生成许可证代码,尽管您没有这么说。为了使这更难,您可以以各种方式混淆您的代码和关键信息。还有一些技术可以使调试器的使用更加困难,以防止逆向工程师单步执行代码并清楚地查看信息。但这只会使逆向工程变得更加困难,并非不可能

另一个常见的安全威胁是执行不需要的代码,例如通过缓冲区溢出。

于 2009-10-03T07:49:59.013 回答
0

为了防止黑客查看您的代码,您应该使用混淆器。混淆器将使用各种技术,这使得理解混淆代码变得极其困难。使用的一些技术是字符串加密、符号重命名、控制流混淆等。查看Crypto Obfuscator,它还具有外部方法调用隐藏、Anti-Reflector、Anti-Debugging 等

目标是在潜在黑客的道路上设置尽可能多的障碍。

于 2010-05-27T05:55:37.240 回答