在进行软件的破解、解密以及计算机病毒分析工作中,一个首要的问题是对软件及病毒进行分析。这些软件都是机器代码程序,对于它们分析必须使用静态或动态调试工具,分析跟踪其汇编代码。
从软件使用说明和操作中分析软件
欲破解软件,首先应该先使用该软件,了解一下功能是否有限制,最好阅读一下软件的说明或手册,特别是自己所关心的关键部分的使用说明,这样也许能够找点线索。
静态反汇编
所谓静态分析即从反汇编出来的程序清单上分析。大多数软件在设计时,都采用了人机对话方式,所以提示信息入手进行分析。crack时常用的静态分析工具是W32DASM和HIEW等。
动态跟踪分析
虽然从静态上可以了解程序的思路,但是并不可能真正了解地了解软件的细节,如静态分析找不出线索,就要动态分析程序.另外,碰到压缩程序,静态分析就无能为力了,只能动态分析了.所谓动态分析是利用SOFTICE或TRW2000一步一步地单步执行软件。
为什么需要动态跟踪分析?
许多软件在整体上完成的功能,一般要分解成若干模块来完成,而且后一模块在执行时,往往需要使用其前一模块处理的结果,这一结果我们把它叫中间结果。如果我们只对软件本身进行静态地分析,一般是很难分析出这些中间结果的。
有许多软件在运行时,其最初执行的一段程序往往需要对该软件的后面各个模块进行一些初始始化工作,而没有依赖系统的重定位。 有许多加密程序为了阻止非法跟踪和阅读,对执行代码的大部分内容进行了加密变换,而只有很短的一段程序是明文。加密程序运行时,采用了逐块解密,逐块执行和方法。
如何进行动态跟踪分析?
对软件进行粗跟踪
所谓粗跟踪,即在跟踪时要大块大块地跟踪,也就是说每次遇到调用CALL指令、重复操作指令REP,循环操作LOOP指令以及中断调用INT指令等,一般不要跟踪进去,而是根据
执行结果分析该段程序的功能。
对关键部分进行细跟踪
对软件进行了一定程度的粗跟踪之后,便可以获取软件中我们所关心的模块或程序段,这样就可以针对性地对该模块进行具体而详细地跟踪分析。
一般情况下,对关键代码的跟踪可能要反复进行若干次才能读懂该程序,每次要把比较关键的中间结果或指令地址记录下来,这样会对下一次分析有很大的帮助。
加密反跟踪技术
跟踪技术
DOS中的动态跟踪调试软件DEBUG
单步中断和断点中断
通过对单步中断和断点中断的合理组合,可以产生强大的动态调试跟踪功能,这就对磁盘加密技术造成了巨大的威慑,所以破坏单步中断和断点中断,在反跟踪技术中就显得十分必要,成为反跟踪技术中的"必修课"。
反跟踪技术
作为反拷贝技术的保护者反跟踪技术是整个磁盘加密技术中最能显示技术水平的部分,如果它稍有漏洞就会影响到整个磁盘加密技术的可靠性。
一个有效的反跟踪技术应该具有3大特性:
1)重要程序段是不可跳越和修改的
PROLOK的解密过程是通过修改判读指纹的程序段来实现的,这其实是激光加密系统中反跟踪技术的一个败笔,一个有效的反跟踪技术应该对加密系统中的某些甚至全部程序段进行保护,如果这其中有内容被修改,将导致出错主要方法有累计、累或和异或和程序段等方法同时还要保证重要程序段一定要被执行,方法主要有加密程序分段加密,运行时逐层解
密,逐层清除的方法,即只有运行了重要的程序段,才能将下一层程序代码从密码形式转换成明码形式;
2)不通过加密系统的译码算法,密码不可破译:
为塑造一个封闭的加密系统,杜绝使用外调自编子程序甚至手工转换密码,规定只能由加密系统的译码程序来转换密码;
3)加密系统是不可动态跟踪执行的
动态跟踪是对加密系统的窥视,所以反跟踪技术应该绝对禁止对加密系统的动态跟踪。
三、执行程序结构
在微机上主要可执行程序是COM格式与EXE格式。
COM文件结构是程序在一个段中,无堆栈,长度小于64k,在程序头预留100h字节,在偏
移为100h处是可执行代码。
COM文件加载过程为:
在可用内存低端建立程序段前缀psp,长度100h
Psp上方读入com文件
Pc=psp+100h
Exe文件结构包括:
文件头
格式化区
重定位表
程序体
代码段
数据段
堆栈段
Exe文件的长度可以大于64k。
Exe文件装载过程是
确定内存起始段
确定长度
读exe文件到内存
根据重定位表对内存的exe文件体进行重定位
取出重定位项中的段值
段值加起始段=实际段值
加偏移量得到程序体的一个字
取出该字,加上起始段值
写回内存原来位置
初始化寄存器
控制权转移,开始执行
静态跟踪、防静态分析、反防静态分析
静态跟踪,使用反汇编程序将可执行程序转换为汇编程序,阅读汇编程序以获得原始信息的方法。
防静态跟踪是将关键代码变形,使得反编译结果不知所云的技术。防静态分析,必须防止从反汇编的程序清单入手分析的方法,必须防止用户对代码的静态分析与阅读。
防静态分析技术主要有:
将程序放在隐蔽的位置:将程序某段或者某字节放置到其他位置,使得反汇编结果无法正确运行。而在正常运行中,有合适的机制将真实的代码拼凑完整。例如EXE头文件转移,再如文件头放在特殊的地方。
对程序代码进行变换:以密文形式存在执行文件中。被加密的程序不能执行,必须先解密,关键在于密码对代码段的加密。
反防静态分析是针对防静态分析而应用的技术,主要使用动态跟踪方法,通过跟踪程序的运行,寻找真实判定正版处的跳转,修改代码,使得先解密,忽略判定条件,直接执行程序体。
一种较为高级防静态分析方法,是后续模块需要前面的模块运行结果,仅仅看代码是无法了解程序控制流,这样可以防止破解者阅读程序。另外的方法还有程序自行初始化,不使用系统重定位的方法,也破坏汇编代码的解释。
动态跟踪、防动态跟踪
动态跟踪是使用1号3号中断,跟踪执行程序运行的方法。
防动态跟踪,是在使用debug,codeview,soft-ice,trw2000进行动态跟踪时,使得跟踪方法难以进行。
破坏debug的基本方法
抑制跟踪中断
DEBUG的T和G命令分别要运行系统的单步中断和断点中断服务程序,在系统向量表中这两个中断的中断向量分别为1和3,中断服务程序的入口地址分别存放在0000:0004和
0000:000C起始的4个字节中。
因此,当这些单元中的内容被修改后,T和G命令将无法正常执行
具体实现方法:
将这些单元作为堆栈使用
在这些单元中送入软件运行的必要数据;将软件中某个子程序的地址存放在这些单元中,当需要调用时使用INT1和INT3指令来代替CALL指令;
放入惩罚性程序的入口地址。
封锁键盘输入
在加密系统无须从键盘或屏幕输入、输出信息时,关闭这些外围设备,以破坏跟踪调试
软件的运行环境:
改变键盘中断服务程序、BIOS的键盘I/O中断服务程序的入口地址
禁止键盘中断
禁止接收键盘数据
不接受指定键法(比如T,P,G等DEBUG键)
设置显示器的显示性能
当加密系统无需在屏幕上显示信息时,可以通过各种方法关闭屏幕,这样可使解密者无法得到跟踪调试软件返回的任何信息,以阻止解密者对加密系统的破译:
封锁屏幕显示:可以重新设置屏幕特性,将前景和背景色彩置成同一种颜色,使解密者在跟踪期间无法看见调试信息
通过获取屏幕信息的检查加密系统是否处于被监控状态
修改显示器I/O中断服务程序的入口地址
定时清屏
直接对视屏缓冲区操作
DEBUG等跟踪调试软件在运行时大量地使用了DOS提供的各类中断,不仅如此,比DEBUG功能更强大,甚至针对反跟踪技术设计的高级反反跟踪调试软件也调用了DOS中断,典型的例子就是使用其它中断来代替断点中断的反反跟踪技术。
破坏中断向量表显然可以从根本上破坏一切跟踪调试软件的运行环境,以达到"以不应万变"的最终目的
主动检测跟踪法
当解密者利用各种跟踪调试软件对加密系统分析执行时,势必会造成许多与正常执行加密系统不一致的地方,如运行环境、中断入口和时间差异等等。如果在反跟踪技术中对不一致的地方采取一定的措施,也同样可以起到保护加密系统的目的。
实现这种方法的关键在于以下两个方面:一是检测加密系统是否被跟踪,二是检测到被跟踪后如何进行处理,前一个方面的实现主要依靠加密者对DOS内核和跟踪调试软件的深入了解,后者则一般是一种死循环、启动机器或提示非法跟踪并停止运行的程序, 乃至惩罚性程序。
定时检测法
一个程序在正常运行和被跟踪运行时,所花的时间是大不相同的,可以想象一个被跟踪运行的程序往往要花费极长的时间,反跟踪技术抓住这个特点,根据执行时间的长短来判断是否被跟踪。
偶尔检测法
在加密系统中加入判断时间的功能,并且当时间满足某一条件时再对加密系统中的关键部位进行判断,如果关键部位不存在或发现了变化则可判定加密系统已经被破坏,应立即做出相应的反应
利用时钟中断法
在反跟踪技术中利用时钟中断可以定时检查前台任务执行的情况,如果发现前台的程序被非法跟踪调试,可以立即采取相应的措施,也可以对中断向量表作定时检查、计算程序执行时间、密文的译码操作和前面说到的定时清屏等等
PSP法
每个程序在执行时都必须建立对应的程序段前缀PSP,当程序未被跟踪执行时,PSP中14H与16H开始的两个字节是相同的,当被跟踪运行时,这些内容就不会相同。
中断检测法
一个执行的程序如未被跟踪,则INT1和INT3的入口地址相同,且都为哑中断,如被跟踪则相反,所以通过检测INT1和INT3的入口地址即可判断是否被跟踪。
设置堆栈指针法
跟踪调试软件在运行时,会产生对堆栈的操作动作,比如:保存断点。因而在反跟踪技术中对于堆栈指针的运用就显得相当重要了,比如对堆栈指针的值进行设计,并力求使设计的结果具备一定的抗修改性,以免解密者通过再次修改堆栈指针的值来达到继续跟踪的目的。
将堆栈指针设到ROM区:
只读存储区ROM是无法保存数据的,堆栈指针如果指向ROM区域,势必不能保存数据,这将会使跟踪调试无法继续进行下去。
设在程序段中:堆栈指针如果设在将要执行的程序段中,那么任何的堆栈操作都会破坏程序代码,使程序不能正常运行。
设在中断向量表内:
INT1和INT3是反跟踪技术一定要破坏的中断,所以将堆栈指针设在内存的低地址段内,既可以进行少量的堆栈操作(跟踪调试软件一般需要大量的堆栈来存放
数据),还可以破坏单步和断点中断的入口地址。
将堆栈指针移作它用:
如果确认没有堆栈操作的话,可以将堆栈指针拿来做其它用途,如保存经常要更换的数据,这样就可以使堆栈指针的值经常更换,从而使它根本无法保
存数据。前提条件:
要保证将要执行的程序段不能进行有效的堆栈操作;
在要进行堆栈操作时,必须首先恢复正确的堆栈指针。
软件防跟踪编程技巧
代码加密法
对程序分块加密执行
为了防止加密程序被反汇编,加密程序最好以分块的密文形式装入内存,在执行时由上一块加密程序对其进行译码,而且在某一块执行结束后必须立即对它进行清除,这样在任何时刻内不可能从内存中得到完整的解密程序代码。
这种方法除了能防止反汇编外还可以使解密者无法设置断点,从而从一个侧面来防止动态跟踪。
对程序段进行校验
对一个加密程序的解密工作往往只是对几个关键指令的修改,因此对程序段特别是关键指令的保护性校验是十分必要的,这样可以防止解密者对指令进行非法篡改。具体方法有累计、累减、累或和异或和程序段等方法。
迷惑、拖垮解密者
在加密系统中多多设置专门针对解密者的"陷阱"
设置大循环
废指令法:在加密程序中设置适当的无用程序段
程序自生成技术:程序的自生成是指在程序的运行过程中,利用上面的程序来生成将要执行的指令代码,并在程序中设置各种反跟踪措施的技术
指令流队列法
CPU为了提高运行速度,专门开辟了一个指令流队列,以存放将要执行的指令(流水)在程序正常执行时,其后续指令是存放在指令流队列中的,而跟踪调试程序时因为它牵涉到动态修改程序指令代码(包括后续指令)的原因,所以无论后续指令是否被存放在指令流队列中,被修改的指令都将被执行(包括后续指令),这一点和程序正常执行时是相反的,因为正常执行时,CPU只从指令流队列中读取指令,即使后续指令刚刚被正在执行的指令修改过。
举例
JMP S2
S1:JMP S1;死循环
S2EA SI,S1
LEA DI,S3
PUSH CS
PUSH CS
POP DS
POP ES
CLD
LOD SW
STO SW
设计在S3处存放S1处的指令,如果在正常执行时,由于S3处的其它指令已经被存入指
令流队列中,所以它会正常运行,反之则执行S1处的死循环指令。
逆指令流法
指令代码在内存中是从低地址向高地址存放的,CPU执行指令的顺序也是如此,这个过程是由硬件来实现的,而且这个规则已经被人和跟踪调试软件牢牢接受。针对这个方面逆指令流法特意改变顺序执行指令的方式,使CPU按逆向的方式执行指令,这样就使得解密者根本无法阅读已经逆向排列的指令代码,从而阻止解密者对程序的跟踪。
其他防跟踪方法
混合编程法
因为高级编译语言的程序可读性本身就较差(如编译过的BASIC、COBOL程序等),如果再将几种高级语言联合起来编写使用,一定会极大的降低程序的可读性。
自编软中断13技术
由于反拷贝技术制作的指纹一般都存在于软盘上,所以现在的磁盘加密系统都存在着一个明显的外部特征:即都要通过调用INT13来判断软盘上指纹的真伪,于是必须恢复中断表的内容,这就过早地暴露了自己的弱点
内存翻卷技术
对内存进行数据存取,采用内存翻卷:进行寻址操作时,如果数据地址的值超过地址空间,则从0000:0000开始计算。
小结
反跟踪程序例子
示例程序是破坏单步中断和带断点的中断的反跟踪程序,可以将此程序安排在加密程序的适当位置上。
当程序没有被执行时,计算机的跟踪功能不变,而当程序被执行后,系统的跟踪功能被修改。如果此时再使用跟踪命令,不论是单步跟踪是带断点跟踪,都会对正常程序的运行造成混乱,甚至造成系统的死锁。
这样,只要加密程序被执行,跟踪行为就被阻止。
编写原理:
因为跟踪调试程序软件不外乎使用计算机单部及断点的中断功能,具体是调用INT 01H和INT 03H实现的,而INT 01H是单部中断,INT 03H是断点中断。本程序通过修改INT 03H的中断处理功能,但是仍保留单部中断功能。
常用工具介绍
SoftICE
是目前公认最好的跟踪调试工具。使用它可以很容易的跟踪一个软件、或是监视软件产生的错误进行除错。你甚至可以用他来替代C语言的调试器——如果你不喜欢使用C语言自己的调试器的话。其有几种平台的版本,DOS,WINDOW3.1,WIN95/98/2000/NT。
Trw2000
是中国人自己编写的调试软件,完全兼容SOFTICE各种指令,但现在许多软件能检测SoftICE存在,而TRW2000在这方面就好多了。TRW2000有它自己的独特方面,是针对破解软件优化的,Windows下的跟踪调试程序,跟踪功能更强;可以设置各种断点,只是断点种类更多;它可以象一些脱壳工具一样完成对加密外壳的去除,自动生成EXE文件,只是留给用户更多的选择;在DOS下的版本为TR。
Wdasm8.93
反汇编的工具。它可方便反汇编程序,能静态分析程序流程,也可动态分析程序,操作简单、是破解必备工具之一。
Hiew
一个十六进制工具,它除了普通十六进制的功能外,它还有个特色,能反汇编文件,并可以用汇编指令修改程序。
Smartcheck
VB程序执行时从本质上讲是解释执行
VB的exe是伪代码,程序都在vbXXX.dll里面执行
SmartCheck的出现,大大方便了我们,它可将VB程序执行的操作完全记录下来,使我们轻而易举的破解大部分VB程序。
十六进制编辑器HIEW就是一种是十六进制工具
注册表监视工具
侦测文件类型工具
这样的工具有TYP、gtw或FileInfo等。这是一个能侦测你的软件是被哪一种「壳」给加密了(就好像侦测你的文件档是被zip、rar、arj哪一个给压缩了一样,如果连被哪种软体加了壳都不晓得,那要剥壳就难很多)。一般配合PROCUDUMP使用。
PROCDUMP
脱壳工具,可剥许多壳,你使用的许多软件都是压缩过的,用该工具很方便把它们还原,然后再修改,并可自己编写脚本文件,以便能脱壳新版的壳。
IceDump
配合SOFTICE而使用的,可抓取内存的数据,以重建EXE文件,脱壳必备工具之一。
crackcode2000一种全新的注册机工具,它可以从另一进程的内存中取出你想要的注册码
ERU是windows安装盘自带的小工具,备份注册表等一些windows重要的配制文件
filemon
文件监视工具,可监视系统文件运行状况,如哪个文件打开,哪个文件关闭,在哪个文件读取了数据等,破解时非常有用,以便了解程序在启动、关闭或验证注册码是做了哪些手脚。
EXESCOPE
资源修改器eXeScope可以说是EXE及DLL等执行文件的解析终结工具,它有执行文件(EXE,DLL等)的解析与显示功能;提取资源到外部文件;资源的重新写入;记录文件的记录及其再编辑(成批编辑)等功能。是汉化软件的常用工具,当然破解软件时也很有用。
Frogsice
softice加强软件。它并不是简单的将SICE隐藏,而是让你可以配合SICE避过现在流行的各种加密、保护软件里面的各种防止SICE的陷阱。