摘要:通过分析几种常规软件破解的方式,以破解出发,并提出了编写应用程序需要注意和改进的地方。
关键词:软件破解技术;加壳软件;逆向工程
1引言
软件破解主要从两个方面人手,第一是脱掉保护软件的壳,现在的软件出厂一般都使用了加密壳、压缩壳、伪装壳、多层壳等技术,脱掉软件的壳是能进行跟踪调试的前提条件。第二是根据软件的注册性质决定采取什么对策进行序列号推算,暴力破解等。
2.1壳概述
在一些计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序,它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。当加壳后的文件执行时,壳一这段代码先于原始程序运行,它把压缩、加密后的代码还原成原始程序代码,然后再把执行权交还给原始代码。软件的壳分为加密壳、压缩壳、伪装壳、多层壳等
类,目的都是为了隐藏程序真正的OEP(人口点,防止被破解)。
2.2加壳软件
作者编好软件后,编译成exe可执行文件。有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名等,即为了保护软件不被破解,•通常都是采用加壳来进行保护。若需要把程序压缩小一些,从而方便传输,于是,需要用到一些软件,它们能将exe可执行文件压缩。另外在黑客界给木马病毒等加壳以躲避杀毒软件。能实现上述功能的这些软件称为加壳软件,如ASPACK,UPX,PEcompace等。
2.3侦壳软件
侦测壳和软件所用编写语言的软件为侦壳软件。脱壳之前必须要查它的壳的类型。常用侦壳软件有peid,fi等。
2.4脱壳软件
常用的脱壳工具如下:
(1)文件分析工具(侦测壳的类型):Fi,Get-Typ,peid,pe—scan;
(2)OEP人口查找工具:peid;
(3)调试工具:SoftICE,TRW,ollybdg;
(4)Dump工具:IceDump,TRW,PEditor,ProcDump32,lmrdPE;
(5)PE文件编辑工具:PEditor,Proc.Dump32,LordPE;
(6)重建ImportTable工具:ImportREC,Re-Virgin。
2.5手动脱壳方法
软件脱壳有手动脱壳和自动脱壳之分,下面仅介绍手动脱壳。
手动脱壳的主要步骤是寻找人口点,转储(dump)程序,修复引人函数表(ImportTable),修复pe文件。现在的壳分压缩壳,加密壳,伪装壳,多重壳。压缩壳的目的是使文件由大小变小,便于在网上传播。并有一定的保护作用,他人无法反汇编加壳程序;加密壳的目的是用各种手段保护软件壳不被脱掉、跟踪,文件大小不是它的目的,有时候甚至变大;伪装壳其实也还是一种加密壳,只不过它先是伪装成一些开发工具的头部,如VC,使得侦壳工具无法准确地侦察出它加壳的种类;多重壳技术是采用多种壳加密技术,不光加一层壳,加多重不一样的壳达到保护的目的。
判断加壳程序和普通程序很容易,用Ollydbg(简称Od)载入程序,没加壳软件无任何提示。加密壳有些Od载人时会提示压缩,用运行后,Od提示程序异常。普通加壳Od载人时一般都会发现,提示软件被加壳,是否继续分析。若脱壳没有脱干净,Od载人时也会提示加壳。手动脱壳时,用OUdbg载人程序,脱壳程序里面就会有很多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想办法跳出循环圈。单步跟踪,找到程序的人口地址。这就是动态
调试脱壳的基本思想。
开始用Od载人程序,一般有壳的话都会弹出一个人口警告,属于正常现象,此时,如果先用peid等软件探察过提示没有加壳,软件是用c++编写的,那么如果弹出入口警告极有可能表示程序的壳是经过伪装的。这里有几个小窍门,如果使用aspack或upx加的壳,人口指令一般都是pushad,用于保护现场,记住这个小窍门有可能成为脱掉多层壳的捷径。然后开始单步跟踪调试,这也是逆向工程最常用的方法。接下来的步骤就是一路前进,保证不要往后退,对于简单壳,遇到回跳指令,可直接点击其下一条指令然后强行跳转到那里,但是这只是很简单的情况,一般来说这种情况程序都要跑飞,如此就只有再看前面是否忽略可以跳出循环的地方。
3软件保护机制
3.I常见软件保护模式
3.I.I序列号保护模式
数学算法一直都是加密的核心,但在一般的软件加密中,它似乎并不太为人们关心,因为大多数时候软件加密本身实现的都是一种编程的技巧,但近几年随着序列号加密程序的普及,数学算法在软件加密中的比重似乎是越来越大了。但是当今有名的加密算法如RSADES,MIM,MD5S是为了加密密文或密码用的,与序列号加密多少有些不同。一般序列号算法都是软件作者自己创造的,对于数学不可逆要求不是太高,所以一般都比较简单。破解方法:
一般软件用序列号方式,都是输入字符串,如用户名,再生成正确序列号,所以我们就可以利用处理字符串的消息断点,如WM—GETrEXT和WM—COMMAND等,拦截住软件算号程序对字符串进行的处理,从而让我们有机会一步一步用调试器(如Ollydbg等)跟踪调试,找出序列号的正确算法。
3.1.2时间限制
有些程序的试用版运行都有时间限制,运行一段时间就会停止,如一个月。显然这些程序中在安装时就记住了当前安装的时间,然后每次运行的时候就和安装时间比较,看是否过期。破解方法:
你只需动态跟踪程序,在几个常用时间函数处设下断点,然后将其汇编语句改变即可,如:MOVeCX1e;把3O放人eCX,即一个月MOVeax,[esp+10];把用过天数放到eaxCMPeax,ecx,⋯所以此时只需把“MOVeax,[esp+lO]”改为”MOVeax,1”即可,常见时间函数如下:GetSystemTimeGetIz~alTimeSystemTimeTo-FileTim、SetTimer。
3.1.3KeyFile保护
KeyFile(注册文件)是一种利用文件来注册软件的保护方式。KeyFile一般是一个小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件,其内容是一些加密过或未加密过的数据,其中可能有用户名,注册码等信息。破解方法:破解过程一般就是建立一假keyf'de取代真keytile,然后用调试工具去破解,和以前大同小异。常用破解kele函数如下:ReadFile、Create-FileA、——l0pen()、FindFirstFileA()等。
3.1.4功能限制的程序
这种程序一般是DEMO版或菜单中部分选项是灰色。有些DEMO版本的部分功能里面根本没有,而有些程序功能全有,只要注册就正常了。破解方法:破解思路几乎一致,主要就是找到程序调用函数点,其常见函数如:EnableMenuItem、EnableWindow。
3.1.5cd检测
简单且最常见的光盘保护就是程序在启动时判断光驱中的光盘上是否存在特定的文件,如果不存在则认为用户没有正版光盘,拒绝运行。在程序运行中一般不再检查光盘的存在与否。破解方法:可采用静态分析,如将游戏光盘拿出来,记下屏幕上显示的字符串,然后用W32dasm用串式数据参考功能查找相应代码进行分析。相关函数有GetDrivetype(a)、GetLogicalDrives、GetI~-givalDriveStrings,GetFileAttributesA,GetFileSize,GetLastError、ReadFile等。
3.2改进意见
逆向工程的作用不是破解软件等程序对程序员造成损失,它的作用在于发现程序保护甚至程序本身的不足之处,然后提出改正。可采用以下改进方法提高软件破解难度。
(1)一般不要用一目了然的名字来命名敏感函数和文件,如keyiile,liscence等。
(2)程序中出现明文提示尽可能普遍化或加密,以免静态调试工具搜索到。
(3)少用一些众所周知的系统函数来进行操作,如获取时间等。
(4)注册算法最好有严格的数学根据,加强不可逆性,使之无法直接破解,采用比较成熟的密码学算法。
(5)注册码最好采用一机一码形式,也就是采用读取机器内部特征编号等来作为序列号演算的seed,如使用硬盘编号与网卡mac相结合的方式,尽可能防止一个序列号泛滥的情况。
(6)试用版最好与正式版分开封装,即试用版没有的功能只做按钮,而不放相应的事件代码,使得编译的程序根本没有此项功能。
(7)采用keyfile方式尽可能将keyfile结构设计得复杂点,在程序中不同地点对keyfile中不同部分进行检查。
(8)最好序列号算法不在程序中,多采用联网注册方式,并且数据传输时要加密。
4结束语
通过以上对一般软件保护破解的分析,如果多采用改进意见中提出的方式就可使软件破解难度加大,也可对一个序列号泛滥情况起到一定防止作用。
搜论文知识网致力于为需要刊登论文的人士提供相关服务,提供迅速快捷的论文发表、写作指导等服务。具体发表流程为:客户咨询→确定合作,客户支付定金→文章发送并发表→客户接收录用通知,支付余款→杂志出版并寄送客户→客户确认收到。鸣网系学术网站,对所投稿件无稿酬支付,谢绝非学术类稿件的投递!