我很好奇你如何保护你的软件免受破解,黑客攻击等.
你是否采用某种序列号检查?硬件钥匙?
您使用任何第三方解决方案吗?
您如何解决许可问题?(例如管理浮动许可证)
编辑:我不是说任何开源,但严格的商业软件分发...
什么是可以接受的减少iPhone应用程序盗版的方法,这些方法不违反Apple的评估流程?
如果我的应用程序"打电话回家"提供运行它的唯一设备ID,我需要收集哪些其他信息(例如,用于购买应用程序的Apple ID)以创建授权使用该应用程序的有效注册令牌?同样,我将使用什么代码来访问额外的数据?
目前看来这个问题最好的技术方法是什么?
(请避免关于盗版是如何不可避免的非编程答案等等.我知道盗版是不可避免的.我对基于编程的答案感兴趣,讨论如何减少盗版.提前感谢您的理解.)
我打算发布一个价格低廉的小型实用程序.由于这比业务更重要,我计划使用随VS2008一起提供的Dotfuscator Community Edition.
有多好?
我还可以使用"足够好的混淆器"的定义 - Dotfuscator Community Edition缺少哪些功能以使其足够好.
编辑:
我检查了商业混淆器数量的定价,它们花了很多钱.这值得么?
商业版本是否更好地防止逆向工程?
我并不十分害怕我的应用程序被破解(如果应用程序非常糟糕,没有人有兴趣破解它,那将会令人失望).它无论如何都没有受到严密保护,而不是在代码中的几个地方进行过于复杂的串行密钥和许可证检查.它只是让我感到困惑,没有混淆,有人可以轻松获取源代码,重新命名并将其作为自己出售.
这会发生很多吗?
编辑2:
有人可以推荐商业混淆器.我发现很多,它们都很贵,有些甚至没有列在网站上的价格.
功能明智,所有产品似乎或多或少相似.
混淆器应该具有的最小功能集是什么?
我刚刚发布了一个应用程序,一个付费应用程序,4天后,用户告诉我,中国有另一个网站托管我的应用程序.我从那里下载了它,它在我的设备上运行正常!
这里有帖子说人们可以更改包名并重新发布apk.但这不是我的情况,破解版仍然使用相同的包名.我在程序中使用了Android Vending Licensing,但破解版本根本不进行许可检查.我使用ProGuard对其进行了模糊处理,但这并没有阻止黑客.
问题1:我根据Google的说明签署了apk文件.但是,他们仍然修改了代码并取出了许可检查部分.我错误的是签署一个apk文件旨在防止人们篡改文件内容?
问题2:对于Win32 .exe程序,我曾经使用校验和来确定文件是否已被更改.这是它的工作原理:当创建.exe时,我使用工具计算文件的字节内容之和,然后将其填充到文件中的某个位置,例如,文本模式"MY SIGNATURE"之后的4个字节.然后在运行时,程序打开.exe文件并计算字节总和,将其与签名后的整数进行比较.
有没有人在apk文件上尝试过这种方法?关心分享您的经历?
我对获取版本信息不感兴趣.我想要做的就是确保我的应用程序只能在合法版本的Windows上运行,而不是在盗版版本上运行.Windows使用一些技巧来确定这一点但仍然允许盗版版本继续运行,尽管有一些限制.
那么,有没有办法检查应用程序是否安装在合法的正版Windows版本上?(Vista和更好,至少.)
让我澄清一下:微软并没有阻止用户使用他们的操作系统的未经验证或非法版本.因此,我没有任何理由在这样的版本上阻止我的申请.但我确实希望我的应用程序知道非法版本,并警告用户他的Windows版本未经过验证.也许他忘了,也许他不想验证.可能有很多原因,我不想阻止它们,只是让他们意识到他们的Windows版本的问题.
此外,当有人使用无效版本的Windows时,如果它是商业产品,我可能希望对我自己的软件进行更严格的验证检查.在我的免费产品中,我只想要一个烦人的弹出窗口,每天只出现一次.
未经验证的Windows版本的主要问题是它们可能包含其他间谍软件和其他恶意软件,并且他们可能无法获得所有必需的更新.这些Windows版本的保护功能比经过验证的Windows版本弱.由于我的几个应用程序使用敏感数据,我不希望任何恶意软件泄露这些敏感数据.
另外,我认为盗版软件对任何免费替代品都有害.如果不是所有那些漫游的盗版Windows版本,Linux和FreeBSD会更受欢迎.使用盗版软件的人不太可能首先购买该产品,但我更希望他们使用免费替代品.盗版软件对微软有一点伤害,但它对Free社区造成的伤害更大,因为它让人们与那些商业产品保持联系......
这是我们在某些时候都必须考虑的问题.
经过多年和许多方法,我倾向于同意这个问题:"对于超过几百人使用的任何受保护软件,你可以找到破解版本.到目前为止,每个保护方案都可以被篡改." 您的雇主是否强制使用反盗版软件?
此外,每次我发布这个主题,有人会提醒我; "首先,无论你采用什么样的保护措施,真正专注的饼干最终都会通过所有的保护屏障." 对于单个开发人员而言,c#代码保护的最佳价值是什么?
因此,不要承受这两个广泛真实的免责声明,让我们谈谈"保护"!
我仍然觉得,对于那些不太可能提高熟练破解者时间和注意力的小型应用程序,保护是值得的.
很明显,无论你做什么,如果破解者可以通过修补应用程序来切换IF语句(jmp)的结果,那么世界上所有的密码和加密狗都无济于事.
因此,我的方法是使用以下产品对虚拟化代码进行混淆:http: //www.oreans.com/codevirtualizer.php 我对此产品非常满意.据我所知,它已经被打败了.我甚至可以使用PEcompact压缩可执行文件是否有其他人有使用它的经验?
只有EXEcryptor的问题 http://www.strongbit.com/news.asp 甚至该网站使用起来很麻烦.在进行任何WMI调用时,编译的应用程序将崩溃.
这种方法允许您通过混淆来包围较小的代码段,从而保护安全检查等.
我使用在线授权方法,因为应用程序需要定期从服务器获取数据,因此用户无需长时间离线使用它.根据定义,即使它被破解,该应用程序也毫无价值.
因此,简单的加密握手非常有用.我只是偶然在混淆保护中检查它.如果用户在另一台计算机上安装该应用程序,则在启动时会上载新ID,并且服务器会禁用旧ID并返回新的授权.
我还使用已编译应用程序的哈希值并在启动时检查它以查看是否有一个位已更改,然后从应用程序中打开应用程序作为文件(带有读取锁定)以防止任何人在启动后更改它.
由于所有静态字符串在.exe文件中都清晰可见,因此我尝试使用错误消息等通用字符串.您无法在任何地方找到字符串"授权失败".
为了防止内存转储,我使用简单的文本混淆技术(比如每个字符的XOR)这使得内存中的纯文本数据更难以与变量等区分开来.
当然,对于任何非常敏感的数据都有AES.我喜欢文本的计数器模式,因为这不会导致重复序列显示基础数据,如一系列空白.
但是使用所有这些技术,如果Key或Initialization向量可以从内存中转储,或者IF语句被绕过,那么一切都会被浪费掉.
我倾向于使用switch语句而不是条件语句.然后我创建了一个基本上是死胡同的第二个函数,而不是实际执行所需任务的函数.
另一个想法是编写添加了变量的指针.变量是授权的结果(通常为零).这将不可避免地在某个时候导致GPF.在一些较低级别的授权失败之后,我只使用它作为最后的手段,否则真正的用户可能会遇到它.然后降低软件的声誉.
你用什么技术?
(这不是讨论实现某些东西的优点的线索.它是为那些已经决定做某事的人而设计的)
我正在处理的应用程序被antiLVL自动破解(虽然我在我的应用程序中没有使用LVL).
为了保护我的应用免受"一键盗版"的影响,我正在实施Google IO中解释的篡改检测技术.
我尝试使用getPackageInfo()和reflection(invoke())检查签名,但AntiLVL能够在两种情况下自动破解应用程序.
如何编写当前版本的antiLVL(1.4.0)不会自动破解的代码?我的意思是,除了使用JNI.
PS:我不是在谈论防止盗版.我只是希望盗版者手工挖掘代码,而不是使用自动破解器.
我正在编写一个基于HTML5的游戏,作为一个独立的应用程序运行.它通过网络分发,但没有其他服务器要求 - 没有数据库等 - 一切都是"应用程序内".这是设计的,因为额外的服务器会增加分发成本.
所以鉴于它只是一个包含大量JavaScript的静态html文件,是什么让某人在自己的网站上托管文件?是否有任何技术可用于帮助缓解这种情况?
我担心的不是奇怪的用户,而是其他网站所犯的身份盗用.非附加服务器解决方案将是首选,但任何想法将不胜感激.
应用内购买是否适用于iOS盗版应用程序?
作为开发人员,我在思考以下用例的可能性:
此应用程序不是免费的.你还没有购买它.请现在购买.
取消 - 购买
如果他接受,我会显示应用程序内购买对话框.
如果他没有,我禁用该应用程序的关键功能.
看起来(略微)比仅仅要求盗用应用程序的人去App Store购买它更有效.
我即将为我的应用程序实现一个非常基本的许可功能.每台计算机(或每个操作系统)或每个用户可以授予序列号(对于Windows Server中的CAL:如果我的应用程序由一台计算机上的多个用户使用,或者一个用户使用多个用户)机).
对于每个操作系统许可,我用的SerialNumber的Win32_OperatingSystem.
对于每用户许可,我使用:
WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent();
if (currentIdentity != null)
{
SecurityIdentifier userSid = currentIdentity.User.AccountDomainSid;
Console.WriteLine(userSid);
}
Run Code Online (Sandbox Code Playgroud)然后将获得的OS序列号或SID的散列存储在数据库中,与应用程序序列相关联; 每次程序启动时,它都会查询服务器,发送OS SN/SID和应用程序序列的散列.
这样做是对的,还是完全错的?它会在每台Windows机器上运行吗?(例如,使用主板串口是错误的)
piracy ×10
android ×2
licensing ×2
obfuscation ×2
protection ×2
security ×2
.net ×1
anti-piracy ×1
c# ×1
cocoa-touch ×1
cracking ×1
dotfuscator ×1
html5 ×1
ios ×1
iphone ×1
javascript ×1
windows ×1
wmi ×1