能力值:
( LV13,RANK:970 )
|
-
-
6 楼
收稿日期:2004 - 03 - 08 ;修订日期:2004 - 05 - 11
作者简介:于淼(1978 - ) ,男(蒙古族) ,河南开封人,硕士研究生,主要研究方向:软件理论; 孙强(1963 - ) ,男,安徽合肥人,副教授,主要
研究方向:软件理论.
文章编号:1001 - 9081(2004) 08 - 0137 - 03
对加壳技术的改进:超粒度混杂技术
于 淼,孙 强
(华东师范大学计算机科学技术系,上海200062)
(platinicslug @sohu. com)
摘 要:首先介绍过去的一些软件保护技术,分析它们的不足之处,然后介绍目前应用最广泛的
加壳技术和它的弱点。最后提出了改进的方法:超粒度混杂技术的原理、算法和具体的实现。
关键词:软件保护;加壳技术;超粒度混杂
中图分类号: TP311. 53 文献标识码:A
Improvement of shell technology : hyper2granularity2immingl ing technology
YU Miao , SUN Qiang
(Department of Computer Science and Technology , East China Normal University , S hanghai 200062 , China)
Abstract : Traditional shell protection methods were analyzed to have some shortcomings. To overcome these
shortcomings , an improved method , hyper2granularity immingling technology , was proposed. The principle , algorithm and
implementation of this method were given.
Key words : software protection ; encryption shell protection ; hyper2granularity2immingling
0 引言
软件保护技术主要有以下几种:序列号(注册码) 保护方
式,加密狗方式(串口狗、并口狗、USB 狗、钥匙盘) , KeyFile 保
护方式,功能限制保护方式和时间限制保护方式等。其中加
密狗方式强度较高,但有额外的硬件开销;注册码保护方式使
用得极为广泛,它仅仅以注册码区分合法与非法用户,这样就
给软件的传播、试用带来了极大的方便,但是同时也增加了保
护的难度;其余的几种保护方式一般配合注册码保护方式使
用。因此本文中主要讨论此种方式。
目前国内外很多软件的保护方式还是很简单,如有些软
件仅仅在注册表内[ 1 ] ,或硬盘上生成一些标志,这种方法很容
易用一些系统记录软件(如:RegSnap 等) 记录每次注册表或
硬盘的变化,然后把注册表或硬盘上相应的数据项恢复到初
始状态即可免费无限次使用;还有一些软件利用系统的一些
特征,如CPU 的ID 号、CMOS 的一些字段[ 2 ] 、硬盘的序列号、
网卡MAC 地址[ 3 ]等生成注册码,然后在用户端通过比较注
册码来区别合法用户与非法用户。但是这些方法都存在一个
明显的缺点:比较和跳转指令过于明显,很容易用调试软件
(如soft2ice ,TRW2000 ,OllyDbug 等) 跟踪到上面所说的比较
和跳转位置,然后把跳转的地址改为程序继续执行的位置即
可破解。
1 传统的加壳技术
1. 1 传统的加壳技术简介
从上面的介绍可以看到,即使生成与检查注册码的机制
再复杂,如果可执行程序可以被任意修改,解密者还是可以通
过上述的方法破解软件,也就是说如果没有方法防止代码被
跟踪和修改,上面所述的所有方法都是空谈。这样就使加壳
软件纷纷诞生,如著名的ASPack , UPX , PECompect 等。加
壳软件是一段专门负责目标软件不被非法修改或反编译的程
序。一般先于目标程序运行拿到控制权,然后完成一些保护
任务后,再把控制权交给目标软件。
加壳软件一般把目标程序的可执行文件(这里以Win32
平台的PE 格式为例) 的入口点( Entry Point) 指向自己的壳,
并把原来的可执行文件进行压缩、加密,然后把它作为自己的
一个数据块放回文件中。当加了壳的程序运行时,壳首先执
行,它会首先检测内存或系统中是否有常见的反汇编软件(如
W32Dasm) 和调试软件(如soft2ice) ,如果有,则终止运行,然
后利用花指令反- 反汇编,利用Windows 的SEH(Structured
Exception handling) 反跟踪。如ASPack 就利用了26 个SHE
反跟踪,并在这部分完成一些关键性的工作,如被保护的代码
的解密解压缩及IAT ( Import Address Table) 的还原与重定
向。最后跳转到被保护的程序的入口点(Original Entry
Point ,OEP) ,接下来就是执行被保护的代码。
现在的加壳软件用到了很多新技术,如:反跟踪技术、反
调试技术、反dump 技术和高强度加密技术(如用RSA 加密重
要代码和输入表) 。这样就使目标程序得到了很好的保护,也
就使软件的安全性大大提高。
1. 2 针对传统的加壳技术的攻击方法
但是在传统的加壳软件保护下,还是有很多攻击方法,下
面简述一下基本过程:首先跟踪程序查找原入口点OEP 并且
暂停目标软件的运行。这时,壳已经把被保护的程序解压缩,
解密,还原成可执行代码,准备把控制权交给被保护的程序。
也就是说此时被保护的程序已经脱去了保护它的壳,内存里
的代码就是我们需要的东西。接下来就可以抓取内存中的代
第24 卷第8 期
2004 年8 月
计算机应用
Computer Applications
Vol. 24 No. 8
Aug. 2004
© 1995-2005 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
码(dump) ,并修正OEP 使之指向真正的入口点、修复块表,
最后重建输入表。当然实际的加壳软件都十分复杂,但是仍
有很多壳被成功破解,包括一些很著名的壳,如:ASProtect 。
2 超粒度混杂技术
2. 1 原理
从上面的破解过程可以看到,使用传统的加壳软件生成
的壳在OEP 处和目标软件有一条明显的界限,这条界线使它
们无论在内存空间还是在逻辑功能上都明显地分隔开了。所
以说OEP 是破解者的首要攻击目标。若使保护的软件的代
码与壳的代码充分混杂,就可以大大增加软件的安全性。即:
把目标代码分解成多个充分小的模块,分别保护。使用这样
的保护方法,虽然表面上看起来与传统加壳软件没有太大的
不同,但是在实际效果和实现难度上已经有了质的飞跃。
逻辑模块可以分为三种级别:最低级别,根据程序的结构
化定理,任何proper 程序都可以化成顺序结构、循环结构和选
择结构,所有这些结构都组成一个模块;中级别,把每个函数
或过程组成一个模块;高级别,对于大型的软件必然有很多文
件,其中每个可执行文件或动态链接库文件组成一个模块。
大多数传统的加壳软件都是第三种粒度级别,少数优秀
的加壳软件能通过SDK实现中粒度级别。本文中所说的超
粒度混杂技术就是使用第一种粒度级别。
1) 保护效果
在任何时间点上,内存中都没有被完全解密的目标软件。
也就是说壳与目标软件之间没有明显的分界线。脱壳的方法
只有一直跟踪程序,分次把目标软件dump 出来,然后再组合
在一起,但这样的难度很高,尤其当模块数充分小时跟踪和分
析的工作量已经接近或超过开发目标软件的工作量,这使得
破解工作不再有意义。
2) 实现难度
虽然反跟踪反调试的基本方法没有变,但由于模块粒度
的减小使加壳软件的开发难度大大增加。比如:由于有多个
壳,所以必须考虑加密的方式与密钥的存放位置;同时由于模
块的嵌套,跳转指令的地址等问题也必须得到考虑。
3) 执行效率
显然随着粒度的减小,安全性必然上升但同时软件的执
行速度也会随之下降。这是由于每个模块都要进行加密与解
密,而且嵌套造成的迭代大大增加了这种速度上的代价。所
以模块划分过小会带来软件的执行效率低下,实际使用时,应
提供对粒度大小的选择机制。
2. 2 实现形式
使用超粒度混杂技术的加壳软件可以有以下两种具体实
现形式:嵌入式保护方式和自动分析的保护方式。
2. 2. 1 嵌入式保护方式
开发者开发软件时把加壳软件的标记嵌入到要保护部分
的开头和结尾,在编译生成执行文件时编译器会把标记根据
位置插入到生成的目标软件中,当然这时候的目标软件是不
可运行的。然后加壳软件扫描目标软件生成各个区块,同时
删除标记,最后重建目标软件。总之分为标记、加壳、运行三
个步骤。
1) 标记
用户只要在编写源程序时在想要保护的模块前后加上模
块的开始和结束标志就行了。
2) 加壳
a) 对编译器生成的目标代码,检查用户定义模块标记的
合法性。模块标记可以由以下文法描述:
< 模块标记> →< 开始标记> *< 结束标记>
< 开始标记> →< START > < 标识符>
< 结束标记> →< END > < 标识符>
< 标识符> →< 标识符> < 字母> 0 < 标识符> < 数字> 0
< 字母>
< 字母> →A0B0*0Y0Z
< 数字> →0010*0809
b) 定义系统变量
int level ; 记录嵌套的深度
ADT stack{
数据对象:D = {ai| ai ∈ElemSet , i = 1 ,2 , *,n ,n ≥0 }
数据关系:R1 = { < ai - 1 , ai > | ai - 1 , ai ∈D , i = 1 ,2 , *,n }
约定an 端为栈顶, a1 端为栈底
基本操作:
Push( &S , e) ;
初始条件:栈S 已经存在;
操作结果:插入的元素e 为新的栈顶元素
Pop ( &S , &e) ;
初始条件:栈S 已经存在且非空;
操作结果:删除S 的栈顶元素,并用e 返回其值
**
}ADT Stack
/ / ImageTable 用来存放各个模块的信息
typdef struct ImageTableType{
Type1 ModuleName ; Type2 StartAddress ;
Type2 EndAddress ; Type2 BufferHeader ;
struct ImageTableType 3 next
} ImageTableType , 3 ImageTable
level = 1 ;stack. count = 0 ; / / 变量的初值
c) 在ImageTable 中登录各个模块:
while (level ! = 0)
{ / / 获取指定文件中的模块标记,名称以MarkPointer 返回,
/ / 地址以MarkAddressPointer 返回
GetModuleMark (" Filename" , &MarkPointer ,
&MarkAddressPointer) ;
If ( Type ( 3 MarkPointer) == StartMark)
/ / 遇到的是模块的开始标记
{ Push( &stack , 3 MarkPointer) ; / / 把当前模块标记压栈
Push ( &stack , 3 MarkAddressPointer) ;
/ / 把当前模块标记的地址压栈
level ++ ;
} / / 嵌套层次加一
else
/ / 遇到的是模块的结束标记,证明嵌套到了最内层,可以开始登录
{ Pop ( &S , &StartAddress) ; / / 获取要处理模块的开始地址
Pop ( &S , &ModuleName) ; / / 获取要处理模块的名称
/ / 获取要处理模块的结束地址
EndAddress = 3 MarkAddressPointer ;
/ / 把本模块的信息记录在ImageTable
RecordImageInfo ( ImageTable , ModuleName , StartAddress ,
EndAddress , NULL) ;
Level - - ; } / / 本模块处理完毕,嵌套层次减1
}
8 3 1 计算机应用2004 年
© 1995-2005 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
d) 修改跳转指令:
/ / 寻找文件中的所有跳转指令,用J ump InstructionPointer 返回地
/ / 址,并修改
while (ScanJ ump Instruction ( ImageTable , &J ump InstructionPointer)
{ / / 模块内的跳转指令修改为使用间接寻址方式
/ / 基址为模块首址StartAddress
/ / 模块外的跳转指令修改为使用段间间接寻址方式
ModifyJ ump Instruction (J ump InstructionPointer , StartAddress) ;
}
e) 生成模块并重建可执行文件:
/ / 分配缓冲区,缓冲区的头指针为BufferHeader
AllocateBuffer ( &BufferHeader , SizeOf Image) ;
BufferPointer = BufferHeader ;
/ / 在缓冲区内增加反跟踪反调试的保护代码,并使指针后移,这
/ / 和传统的方法类似
AddProtectionCode ( &BufferPointer) ;
AddSelfAchieveCode ( &p) ; / / 增加自解压代码,并使指针后移
AddCRCCode ( &p) ; / / 增加CRC 代码,进行完整性校验
CreateKey( &Key) ; / / 随机生成加密密钥
Encrypt ( &StartAddress , &Key , &p) ;
/ / 根据生成的密钥把模块加密
CreateConfuseInstruction( &p) ;
/ / 随机生成一些无用代码。并且保证本部分不可进入
StoreKey( &p , &Key) ;
/ / 把密钥藏在无用代码的某一特定部分
AddZeroShell ( ImageTable) ;
/ / 整个目标程序处理完毕,增加0 层外壳
ReBuildExecuteFile ("NewFileName" ) ; / / 重新生成可执行文件
3) 运行
图1
加壳后的目标软件如图1 (c) 所示,其执行过程如下:
a) 壳0 首先执行,它相当于传统保护方法中的壳,其中
不包含任何原软件的代码,仅仅进行反跟踪、反调试任务,然
后根据当前情况决定下一个执行模块I。
b) 模块I 开始执行时,首先对自己的先序区块J 进行压
缩、加密和CRC 校验(防止被修改) 。接下来的任务仍然是反
跟踪与反调试,在此任务结束后就可以执行其保护的原软件
的模块了。最后同样是决定下一个执行区块K , 把自己的区
块号I 和控制权交给区块K。
c) 依次类推,程序不断执行,直到执行完毕。
2. 2. 2 自动分析的保护方法
这种方法由加壳软件自动分析目标软件的逻辑结构,然
后划分各个区块进行保护。但这样对加壳软件要求很高,实
现起来比较困难。这种方法要结合编译器,在语义分析阶段
选择一些语法结构,插入标记构成模块。但对于一些不规范
的程序或由于控制结构过于复杂,会产生模块标记交叉的错
误,可结合中粒度的保护方式使用。
3 结语
当然仅仅有加壳软件是不够的,软件保护是一个整体,每
个方面都不能忽视,如注册码的生成算法不能过于简单,尽量
使用成熟的密码学算法;在联网进行注册码的传输时要注意
信道的安全性。总之在注意软件的整体安全性的基础上,使
用良好的加壳方法能大大提高软件保护的效果。
参考文献:
[ 1 ] 薛亮,刘路放,冯博琴. 使用注册表和网卡实现软件保护[J ] . 计
算机工程, 2001 ,27 (12) :149 - 150.
[2 ] 张柏元, 郑有材. 注册码软件保护技术研究[J ] . 电脑与信息技
术, 2002 , (5) :18 - 20.
[3 ] 李涛, 欧宗瑛. 利用加密技术和网卡进行软件保护[J ] . 计算机
应用, 2000 ,20 (1) .
[4 ] Richter J . Programming Applications For Microsoft Windows
[M] . Microsoft Press , 2000.
[5 ] Schneider B. Applied Cryptography [M] . John Wiley & Sons ,
1996.
[ 6 ] Robbins J . Debugging Applications[M] . Microsoft Press , 1999.
(上接第132 页)
包加以控制。由于检测响应及时,因此不但能保护受害者免
受DDoS 攻击,而且还能及时保护同时流向受害者的数据包
和攻击源到受害者的网络带宽资源,同时可以改善遭受攻击
时的网络性能。由于很难模拟网络的动态特性,因此检测方
法的有效性还有待在实际网络中作进一步的检验和改进。
参考文献:
[ 1 ] Garber L. Denial2of2Service Attacks Rip the Internet [J ] . Comput2
er , 2000 ,33 (4) :12 - 17.
[ 2 ] Lee RB. CE2L20032003 , Taxonomies of Distributed Denial of Ser2
vice Networks , Attacks , Tools , and Countermeasures [ R ] . De2
partment of Electrical Engineering , Princeton University , 2003.
[ 3 ] Wang HN , Shin KG. Transport2Aware IP Routers : A Built2In
Protection Mechanism to Counter DDoS Attacks[J ] . IEEE Trans
Parallel Distrib Syst , 2003 , 14 (9) : 873 - 884.
[ 4 ] J ung J , Krishnamurthy B , Rabinovich M. Flash crowds and denial
of service attacks : Characterization and implications for cdns and
web sites[A] . ACM[C] , 2002.
[ 5 ] Peng T ,Leckie C , Ramamohanarao K. Detecting Distributed De2
nial of Service Attacks Using Source IP Address Monitoring[ EB/
OL ] . http :/ / www. ee. mu. oz. au/ pgrad/ taop/ research/ detection.
pdf ,2002 - 11.
[6 ] Wang HN , Zhang D , Shin KG. Detecting SYN Flooding Attacks
[A] . INFOCOM[C] , 2002.
[ 7 ] Basseville M , Nikiforov IV. Detection of Abrupt Changes : Theo2
ry and Application[M] . Prentice Hall , 1993.
[8 ] Mahajan R , Bellovin S , Floyd S , et al . Controlling High Band2
width Aggregates in the Network [ R] . ACIRI and AT &T Labs
Research , 2001.
[ 9 ] Krishnamurthy B , Wang J . On Network2Aware Clustering of Web
Clients[A] . SIGCOMM[C] , 2000. 97 - 110.
9 3 1 第8 期于淼等:对加壳技术的改进:超粒度混杂技术
© 1995-2005 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
|
能力值:
( LV6,RANK:90 )
|
-
-
8 楼
最初由 hcjsj 发布 小弟本人准备在自己学位论文里面写关于"加密与解密"的论文.但不知该写哪方面的(具体的一个论题).今年后半年开题报告,明年正式答辩.请各位献个良策,我该向哪个方面努力!推荐几本参考书!小弟再这里先谢谢各位了!
"加密与解密"涉及的问题很多,看看看雪的书就知道了...要是你也来个全面介绍,就没有什么意思了. 的确应该选出其中你感兴趣的主题来重点写,并且给出 你自己的观点, 还有要看你是学什么学科的,是从技术的,还是历史的,社会的...角度来重点写? 论文大概要有多少页呢?
加密方面比较难深入的研究,除非你已经非常了解,因为由于商业机密,一般会的人都不肯轻易谈,nbw提供的文章很好,另外还有看雪论坛新出的书.(不过从保护角度来谈总是比较难的)
解密方面,从网上能找到的资料不少,特别是技术方面的, 但我觉得,还可以谈谈以下的内容,以丰富一下主题.
-解密的圈子,这些cracker一般是由些什么人组成,他们在干什么,为什么...他们的哲学是什么.cracker们通过写文章,crackme, challenge互助来提高水平,他们很多不是为了盗窃软件而破解.
-简单的介绍每种保护方式,列出一串目录:什么叫nagsceeen, keyfile, dongle,time limite, checksum , cd check, antidump, anti debug....给出简单的解释和图片.
-工具,象上面那样,列出一大串主要的,并给出简单的解释和图片.
-可以谈谈在破解的圈子中发生些什么事情,可以从DEMO开始谈起,好像看雪的书上的前言中有谈到.
-可以谈到一些中外的破解组织,CCG, FCG, BCG,TMG, CORE, UCF, DAMN...以及导师人物:+orc, TKC....( CCG的创始人之一Sunbird翻译过TKC的自传,很值得一读.)
-一些被认为是不可破的程序,它们最终被破了.为什么?
-可以谈谈破解者与使用破解补丁者之间的关系.还有强调一下破解本身和盗版是很不同的.
-可以谈一下法律方面的问题:到底解密本身是合法还是违法的呢? 为什么?
-最后,选取你感兴趣的一个技术主题来重点写,要是你是想谈技术的. 最初由dlk0222发布 我也想着毕业的时候来这么一篇论文呢不过我的侧重点可能在网络盗版方面不过现在一塌糊涂不知道该从那里着手希望大伙给个建议
-附上一篇我以前翻译的文章,与盗版有关,但是从另一个角度来谈盗版的,可能与你的主题有一点点关系.另外还有几篇网上收集的关于warez, oday的文章.
-最好能写一下破解本身和盗版是很不同的一件事,这在很多人的脑子里是分不清的.
-网上的盗版业一般很有组织,与一两个cracker自己闹着玩很不同, 从秘密组织到制做破解补丁和keygen,到发放都是很有规划性的,除了cracker,ODAY里还有些人是专门负责把"产品"发放到专门的网址(所谓的cracking scene),然后流放到astalavista, keygen us这样的服务器上存放.
-身在oday和 warez团体里的cracker和一般没有参加这些团体的cracker是很不一样的,在oday里的cracker讲究快,因为一个新版的软件出来后,所有的团体总是争先把他们破解出来.听说在TMG里的一个搞keygene的,一年能出1000个keygen,厉害吧?!虽然有的软件的算法几年也没变,他们只需要把以前的帖上去就行了, 但我还是很惊讶他们的速度.有的cracker进了ucf,tsrh这样的团体后,就象机器一样不断的keygen. (可以找ROR组织了解一下,要是他们愿意谈的话...)
-可以谈一下法律方面的问题
以上是忽然想起来的一点意见...
|