-
-
[讨论]我写的一个数据加密与软件保护方案大家看一下给点建议
-
发表于:
2005-3-24 21:04
4736
-
[讨论]我写的一个数据加密与软件保护方案大家看一下给点建议
老师让我帮他的软件保护一下,我不太会,希望个位指点一下,谢谢,好多只是设想不知道实现起来容不容易呢......
一. 数据加密解密部分(Encryption Arithmetic):
用本软件的大小即字节数(加壳后的大小)作为明文计算出其MD5摘要,此摘要为128位,而DES(或采用Rijndael算法)为56位密钥,用软件摘要再与自己事先约定的信息“一起”再做一次MD5运算(在软件中把他们联合起来,此联合过程运算法则一定要安全,因为它是密钥),把所得摘要作为DES的密钥。为充分利用摘要信息,用128位中的112位对原始数据进行两次DES运算,其结果即为密文,放到数据库中。把软件大小做为MD5前消息中的一部分有利于保护软件,防止破解人员对软件进行脱壳处理!
读数据时,先取此时运行软件字节数大小,并压入堆栈或某一寄存器中,再执行其他操作。如先把获得的软件大小与我们发布是的大小做比较,比较相等后,把此字节信息与预约定信息联合(如前所述),产生密钥解开密文。此解密过程要保证不被解密者截获,把整个解密过程放在一个模块中,如密封在一个函数中(对函数密封请参考软件保护部分)
为考虑可以修改本公司的数据而其他公司的数据不可写,则把数据分为A,B两部分,A块表示本公司数据,其属性为可读可写,对本公司来说是可见的,因此无须加密。而B块为其他公司的资料,为可读不可写属性,B块存储的是我们事先已经按上述加密方法加密好的密文。因此我们要根据不同公司为其做不同的程序包。
二. 软件保护部分(protection):
因为B块数据是以DES加密了的数据,而DES的密钥有56位,但我们采用MD5散列值的112位加密两次,即密钥空间为2112,而用耗资100万美圆的密钥搜索机搜索一个56位DES密钥都需要3个多小时,因此可以排除搜索密钥的群举攻击,此算法的关键是如何在应用程序中保护密钥算法问题。
软件保护拟先采用ASProtect对软件加壳,把一部分密钥MD5前的信息放在壳里,以解决脱壳问题,或干脆在壳中加一关键代码让其脱壳后无法正常运行。
软件保护主要应对动态跟踪和静态反汇编。
1) 动态跟踪:
在关键函数的入口处用GetTickCount()函数读取系统自开机以来跳过机器周期点数,在函数出口处再用GetTickCount()计算函数运行时间,若过长则说明正被解密者调试 ,立即执行软件自毁程序,同时毁掉数据库,为此要防止其动态跟踪,可有如下解决办法。 首先可以把关键算法嵌入到系统进程里去,隐蔽性较强。其次,可以检测当前系统是否有调试器正在运行,如用CreateFileA()或_lopen()获取驱动器程序的句柄,以下为常见调试器句柄所用到的字符串:
SoftICE:“\\.\SICE”,9X版本,“\\.\NTICENT”版本
FileMon:“\\.\TRW”
“\\.\TRW” “\\.\TRWDEBUG” “\\.\ICEDUMP”
检测用户态的调试器用NT中的API函数EwQueryInformationProcess()和NtQueryInformationProcess(),可以检测到使用Win32 Debug API的拥护模式调试器。
2) 静态模式:
拟采用花指令技术克服W32Dasm等反汇编根据,由于不同的机器指令包含的字节数并不相同,有单字节指令有多字节指令,对于多字节指令反汇编软件要确定指令,即第一字节的起始位置,也就是要定位操作码,这样才能正确反汇编这条指令,否则就可能反汇编出另一条指令,因此在程序中加一些无用的字节来干扰反汇编软件,此即为花指令技术,构造出巧妙的花指令可以让反汇编软件反汇编出意想不到的指令出来。这样就可以解决静态反汇编
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)