Objective c Cocoa应用程序-安全问题

Objective c Cocoa应用程序-安全问题,objective-c,cocoa,delegates,protection,piracy,Objective C,Cocoa,Delegates,Protection,Piracy,我有一个关于保护我的cocoa应用程序免受盗版的好方法的问题。我知道这是不可能的 因此,在我的应用程序中,我有一个isRegistered()方法,每次用户启动应用程序时都会运行该方法。 这是从applicationdFinishLaunching:App委托调用的。因此,如果此方法返回true,则应用程序将继续执行代码,否则会显示一条警报,说明应用程序未注册,并且有xx天的时间购买许可证 这是个好办法吗?因为,我在这方面没有经验 提前感谢您的帮助 已解决 首先,谢谢大家!我也这么认为:任何版

我有一个关于保护我的cocoa应用程序免受盗版的好方法的问题。我知道这是不可能的

因此,在我的应用程序中,我有一个
isRegistered()
方法,每次用户启动应用程序时都会运行该方法。 这是从
applicationdFinishLaunching:
App委托调用的。因此,如果此方法返回true,则应用程序将继续执行代码,否则会显示一条警报,说明应用程序未注册,并且有xx天的时间购买许可证

这是个好办法吗?因为,我在这方面没有经验

提前感谢您的帮助


已解决

首先,谢谢大家!我也这么认为:任何版权保护都可以阻止盗版。我只想解决这个小错误,即使我知道有人会再次破解我的应用程序。
然而,这是真的-最好的事情是改进应用程序,而不是浪费时间来提高盗版保护的效率。

我不是从事收缩包装软件业务,但我的朋友是。在销售产品10年后,他观察到,创建过于复杂的保护是没有意义的,因为总会有人入侵它。你们是孤独的,世界是无限的。与其致力于拷贝保护,不如投入时间/金钱改进软件

还要记住,大约10%的人永远不会偷东西,另外10%的人会一直尝试。只要确保这80%的人能够在没有任何其他障碍的情况下购买你的产品。你可以忽略那些讨厌的10%。实际上这是乔尔·斯波尔斯基·伊赫莫的一句话


因此,从技术角度来看,您的解决方案似乎完全可以,只需坚持下去

您描述的解决方案几乎不需要任何专业知识即可破解。将
isRegistered()
函数更改为始终返回true是很简单的。因此,规避您的保护所需的努力只是您为支持用户购买注册码而实施所有基础设施所需努力的一小部分

换句话说,你的投资回报率不高。关于实施盗版保护(而不是改进产品)的投资回报是否足够好(因为你与那些除了证明他们比你更聪明之外别无选择的人较量),存在一些争论


纠正投资回报平衡的一个好方法是使用预先存在的代码,例如。这样,至少你不会花那么多时间去追逐彩虹:)

这是个好问题。阅读了答案后,我认为BitDiff真正的意思是:我们知道
isRegistered()
函数非常容易破解。了解到任何保护系统最终都会遭到黑客攻击,编写比返回布尔值的
isRegistered
函数更难破解的函数有哪些策略

从根本上说,任何拷贝保护系统最终都会有如下功能:

if (program is registered)
    let the program continue
else
    nagging message
end
任何拥有GDB副本的黑客最终都会找到第一行代码,并编写一个小补丁将其删除。大多数拷贝保护系统都通过隐蔽性来关注安全性,也就是说,这条线路很难找到。您还可以通过对二进制文件进行签名并检查签名来增强该系统的健壮性,但您只需为黑客添加另一个障碍即可。他们最终会找到您的公钥,并将其更改为自己的公钥,以便替换您的签名。然而,我相信这将大大减缓他们的速度。Leopard提供了一个代码签名实用程序,但我不知道它是否可以用来防止错误签名的应用程序运行

这个问题没有完美的解决方案,但有两件事需要记住:

  • 你的注册系统将被破坏。这是绝对没有办法的
  • 您的再培训系统是用户和您的程序之间的屏障。您应该为(希望是大多数)合法用户进行优化,并使其尽可能容易实现

  • 实施自己的反盗版系统几乎是不值得的,因为你几乎总是会在一些很容易被破坏的东西上花费大量精力。依靠一个共享的实现——在本例中是一个框架,比如(邮件列表中的许多人都建议使用这个框架)——而你实际上是在依靠这个框架来保护你自己的应用程序以及所有其他应用程序


    Leopard和更高版本上的代码签名框架允许您对代码进行签名,这样,如果代码被篡改,它将拒绝运行-请参阅中
    kill
    选项的文档。

    欢迎您的建议!谢谢你是对的!您所描述的是我的应用程序发生了什么!破解程序已将isRegistered()调用替换为常量真值!AquaticPrime很好,但我不想使用框架!我能做些什么来解决这个问题?不过,谢谢@比特酒:你不能做太多。不管你的反盗版系统到底有多复杂,它最终都归结为一个决定:是正版还是盗版。破解程序将找到该点,并将其替换为常量true。您可以使用校验和,但校验和检查代码也是如此。如果我不使用isRegistered()调用,但我在ApplicationIDFinishLaunching委托中实现了该方法的主体[isRegistered()],这是一个好的解决方案,还是一回事?(谢谢你的回答)是一样的。一个破解程序所要做的就是找到检查注册的指令序列,然后用跳转到序列后的下一条指令来替换该序列中的第一条指令。不,这不完全是一回事。如果
    isRegistered
    是一种Objective-C方法,那么替换它的实现就很简单了。在Leopard中,有