最近两周一直忙于项目中一项数据加密.其中涉及到软件加密部分很具有技巧特点.觉得很有意思,今天拿来分析一下.
其实在这所谈的软件加密我们无需把这个范围定义太过广泛. 简单着重一个点来看. 行业里软件经过多个版本更迭已经趋于一个成熟的产品在流入市场时, 这时我们就面对一个问题:版权和核心数据保护. 目前国内关于软件版权意识依然不是特别浓厚, 因为只有在牵扯到实际利益时有些人才意识到版权和核心数据保护重要性.
本篇的目的本来是想谈谈在加密算法设计中涉及多重策略使用, 大多是算法在保密性设计上多重规则. 但这个需要一定密码学基础才能直接能看懂.所以本篇暂且来先讲讲软件加密过程中使用各种实用的技巧. 如下我会演示目前在软件加密中所采用各种技巧和原理. 而一个好的加密算法和加密策略的设计也是因为适用场景,范围不同而不同. 当然这也是仁者见仁智者见智.
对与软件的加密保护,有些加密技巧的实现并不需要你了解太多的汇编和系统底层的知识也能做到. 其实无论你的软件采用何种方式来加密.大多是情况下都会归结为某些条件判定.在各种条件下触发不同内部数据操作,当然如果加密程度较高软件产品, 条件发生变化后他们就不直接动的是判定数据,而是下一个条件判定策略的改变. 这意味解密过程的因素是依赖多方面的.
当然定义这些固定行为操作依然依赖的是不同语言的Code来实现. 我们在此不必考虑如何消除这些代码Code,这些执行代码必然会以各种形式存在不同地方正确执行. 我们把核心转向如何有效隐藏和保护这些代码.
<1.1>技巧一:有迷惑性的代码
通常来说,开发人员和解密者都具有很好逻辑思维能力.其实一般情况下大多是同行. 开发人员为了执行代码的效率和空间会不同重构剔除无用代码和逻辑. 是执行这段代码看起来简洁. 其实解密者也是这么理解开发人员的. 他可以通过分析程序中每一段指令来追索编程人员的保护思路. 也就是我们常说各种”逆向工程”方式获取加密逻辑. 如果开发人员在编写这段逻辑是加入大量无用代码. 故意把程序复杂化. 毕竟开发人员使用都是第四代高级语言.而解密者能看到的是汇编代码. 想搞清楚那些代码使用的,那些代码是无用的 并不是意见简单的事情.啊
<1.2>技巧二: 虚假的检查
上面方式其实只是在量上加大解析的难度. 其实有时还是难免被机器程序模拟通信过程. 那么对于已经入侵进来的人. 虚假判断可以抓到他们访问记录.
在程序中故意把返回结果和一些错误的答案进行比较. 比较结果肯定是错误的. 如果发现在通信过程中这个比较结果是正确的, 则这个时候可以证明有人在模拟我们检查逻辑. 正在试图破解软件. 反击的手段可以有多重选择.
<1.3>技巧三: 设置输入和输出迷宫
类似我们常在某些关键设备中设定USBKey身份识别系统验证,它内部原理.就是在一定程度上增加了输入和输出的迷宫.
现在USBKey在于设备进行通信时采用密文数据方式. 即使有设备能够模拟USB通信方式截取到通信数据,依然是密文形式. 同时作为软件开发商为了安全起见定义一套自己的加密的规则和算法,对数据输入输出进行再次加密.这样即使USBKey 丢失数据依然不会外流.
<1.4>技巧四: —计时功能
对于这个计时功能, 特别是在商业软件中使用最为广泛. 因为这里面涉及到一个试用期限问题. 我还记得在04年破解一个软件时只需要修改一下XP系统时间既可以在安装时自动破解成功. 后来才发现原来这款软件设置的加密规则时间戳的设置时即时的.
开发商可以在第一次运行,把系统时间记下来.创建一个起始时间文件存储.类似软件试用期 为30天. 在起始时间上加上30天期限 作为结束时间存储为文件格式.
当下一次用户使用软件时判断,如果两个数据时间文件都不存在进行创建. 第一次创建成功后, 下一次用户再来使用软件.时则 起始时间数据文件更新成当前系统时间,这时要比较新的时间是否比开始时间文件中时间要早,. 防止用户修改系统时间.然后再与结束时间比较. 看是否在范围内.这样就完整实现时钟功能.
本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/763846