首页
社区
课程
招聘
[讨论]我写的一个数据加密与软件保护方案大家看一下给点建议
发表于: 2005-3-24 21:04 4736

[讨论]我写的一个数据加密与软件保护方案大家看一下给点建议

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期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
没有看算法部分,只想问楼主 :

使用 CreateFileA 检查 \\.\SICE”,9X ,  \\.\NTICENT  ,
如果破解者用 softice 设断点在 CreateFileA ,你怎样处理 ?

有一些花指令去除工具,你有没有特别的方法应付 ?

另外,楼主说 : “把关键算法嵌入到系统进程里去”
你指的是把算法注入 ring 3 的一般系统进程里,还是 ring 0 里 ?

如果注入一般 ring3 系统进程,这样有甚么实际的反调试作用 ?
2005-3-24 21:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
对于CreateFileA 我没有好的办法,我现在也只想到通过在CreateFileA前发送给另一个进程来监测(打算把进程放到RUNDLL里去),在CreateFileA 后再发送一个信号给此监测进程,如果进程等待时间过长则说明在调试或已经关闭,,,好像挺麻烦的,我也没有好的解决办法.....

至于花指令欺骗其实就是人与人的较量,当然得编写比较好的指令来才行,不过我没这个能力,以前看过一个陷阱程序设计的挺精妙的......有时间研究一下

至于“把关键算法嵌入到系统进程里去”我想难度可能太大,不切实际,,,,,,

感谢楼上的讨论

希望诸位能多给点意见,谢谢.我对加密解密不了解,也是今天从书上找了点"技术" 太老了
2005-3-24 22:11
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
4
按你的说法,"用本软件的大小即字节数(加壳后的大小)作为明文计算出其MD5摘要",这个人家脱壳前先把未脱壳的大小MD5一下,然后再脱壳,找到你说的"事先约定的信息",再MD5,然后做为DES密钥,你的保护就完了
2005-3-24 22:21
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那他得事先知道我"用本软件的大小即字节数(加壳后的大小)作为明文计算出其MD5摘要" ,也就是说他如果不知道的话,就无法算出密钥,当然,"事先约定的信息"要在PE文件里"隐蔽"(加密)起来,关键就是保护密钥,不知道有哪些切实可行的保护方法呢?

还请『密码学』 版主指教
2005-3-24 22:46
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
6
你要想保护密钥就用公钥算法了.
2005-3-24 22:49
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
7
花指令用得好的话可以挡住很多像我一样的菜鸟...
2005-3-24 23:01
0
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
花指令 ,怕怕!
2005-3-24 23:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ASM
9
一.  数据加密解密部分(Encryption Arithmetic):
用本软件的大小即字节数(加壳后的大小)作为明文计算出其MD5摘要:
直接对软件或其内存影像签名

DES(或采用Rijndael算法):
都不建议。找些同样(更高)强度但速度更快、更容易变形的。

建议将签名、加密算法全部变形为f(x,y,z)=z',4种以上算法构成逻辑回路。
如果再能达到不加壳的情况下没有流行工具能扫描出一种内含算法的话,以下
二. 软件保护部分(protection)基本可以随便弄弄就可以了

至于公钥算法,其实实际应用中很难实现理想方案,当然,作为1/4+是可以的
2005-3-25 02:12
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
软件实用是最好的保护方法
2005-3-25 02:51
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢个位的指点,谢谢
顺便说一下,我的软件不是要多好用,主要是为了保护数据不被用户看到,只能被程序调用........数据是机密,呵呵
2005-3-25 11:03
0
游客
登录 | 注册 方可回帖
返回
//