第十三章 软件反跟踪技术
软件反跟踪技术
软件分析技术概述
加密反跟踪技术
– 跟踪技术
– 反跟踪技术
执行程序结构
静态跟踪、防静态分析、反防静态分析
软件反跟踪技术
动态跟踪、防动态跟踪
– 破坏 debug的基本方法
– 主动检测跟踪法
– 代码加密法
– 其他防跟踪方法
– 小结
– 软件防跟踪编程技巧
反跟踪程序例子
常用工具介绍
软件分析技术概述
在进行软件的破解、解密以及计算机病毒
分析工作中,一个首要的问题是对软件及
病毒进行分析。
这些软件都是机器代码程序,对于它们分
析必须使用静态或动态调试工具,分析跟
踪其汇编代码。
软件分析技术概述
从软件使用说明和操作中分析软件
– 欲破解软件,首先应该先使用该软件,了解一下功能
是否有限制,最好阅读一下软件的说明或手册,特别
是自己所关心的关键部分的使用说明,这样也许能够
找点线索。
静态反汇编
– 所谓静态分析即从反汇编出来的程序清单上分析。
– 大多数软件在设计时,都采用了人机对话方式,所以
提示信息入手进行分析。
– crack时常用的静态分析工具是 W32DASM和 HIEW等。
软件分析技术概述
动态跟踪分析
– 虽然从静态上可以了解程序的思路,但是并不
可能真正了解地了解软件的细节,如静态分析
找不出线索,就要动态分析程序
– 另外,碰到压缩程序,静态分析就无能为力了,
只能动态分析了
– 所谓动态分析是利用 SOFTICE或 TRW2000一
步一步地单步执行软件。
软件分析技术概述
为什么需要动态跟踪分析?
– 许多软件在整体上完成的功能,一般要分解成若干模
块来完成,而且后一模块在执行时,往往需要使用其
前一模块处理的结果,这一结果我们把它叫中间结果。
如果我们只对软件本身进行静态地分析,一般是很难
分析出这些中间结果的。
– 有许多软件在运行时,其最初执行的一段程序往往需
要对该软件的后面各个模块进行一些初始始化工作,
而没有依赖系统的重定位。
– 有许多加密程序为了阻止非法跟踪和阅读,对执行代
码的大部分内容进行了加密变换,而只有很短的一段
程序是明文。加密程序运行时,采用了逐块解密,逐
块执行和方法
软件分析技术概述
如何进行动态跟踪分析?
– 对软件进行粗跟踪
所谓粗跟踪,即在跟踪时要大块大块地跟踪,也就是说每次遇
到调用 CALL指令、重复操作指令 REP,循环操作 LOOP指令
以及中断调用 INT指令等,一般不要跟踪进去,而是根据执行
结果分析该段程序的功能。
– 对关键部分进行细跟踪
对软件进行了一定程度的粗跟踪之后,便可以获取软件中我们
所关心的模块或程序段,这样就可以针对性地对该模块进行具
体而详细地跟踪分析。
一般情况下,对关键代码的跟踪可能要反复进行若干次才能读
懂该程序,每次要把比较关键的中间结果或指令地址记录下来,
这样会对下一次分析有很大的帮助。
软件反跟踪技术
软件分析技术概述
加密反跟踪技术
– 跟踪技术
– 反跟踪技术
执行程序结构
静态跟踪、防静态分析、反防静态分析
加密反跟踪技术
跟踪技术
– DOS中的动态跟踪调试软件 DEBUG
– 单步中断和断点中断
– 通过对单步中断和断点中断的合理组合,可以
产生强大的动态调试跟踪功能,这就对磁盘加
密技术造成了巨大的威慑,所以破坏单步中断
和断点中断,在反跟踪技术中就显得十分必要,
成为反跟踪技术中的 "必修课 "。
反跟踪技术
作为反拷贝技术的保护者反跟踪技术是整
个磁盘加密技术中最能显示技术水平的部
分,如果它稍有漏洞就会影响到整个磁盘
加密技术的可靠性。
反跟踪技术
一个有效的反跟踪技术应该具有 3大特性,
– 重要程序段是不可跳越和修改的
PROLOK的解密过程是通过修改判读指纹的程序段
来实现的,这其实是激光加密系统中反跟踪技术的
一个败笔,一个有效的反跟踪技术应该对加密系统
中的某些甚至全部程序段进行保护,如果这其中有
内容被修改,将导致出错
主要方法有累计、累或和异或和程序段等方法
同时还要保证重要程序段一定要被执行,方法主要
有加密程序分段加密,运行时逐层解密,逐层清除
的方法,即只有运行了重要的程序段,才能将下一
层程序代码从密码形式转换成明码形式
反跟踪技术
– 不通过加密系统的译码算法,密码不可破译,
为塑造一个封闭的加密系统,杜绝使用外调自编子
程序甚至手工转换密码,规定只能由加密系统的译
码程序来转换密码 ;
– 加密系统是不可动态跟踪执行的
动态跟踪是对加密系统的窥视,所以反跟踪技术应
该绝对禁止对加密系统的动态跟踪。
软件反跟踪技术
软件分析技术概述
加密反跟踪技术
– 跟踪技术
– 反跟踪技术
执行程序结构
静态跟踪、防静态分析、反防静态分析
执行程序结构
在微机上主要可执行程序是 COM格式与 EXE格式。
COM文件结构是程序在一个段中,无堆栈,长度
小于 64k,在程序头预留 100h字节,在偏移为
100h处是可执行代码。
COM文件加载过程为,
– 在可用内存低端建立程序段前缀 psp,长度 100h
– Psp上方读入 com文件
– Pc= psp+ 100h
执行程序结构
Exe文件结构包括,
– 文件头
格式化区
重定位表
– 程序体
代码段
数据段
堆栈段
Exe文件的长度可以大于 64k。
Exe文件头格式为,
偏移量 意义 偏移量
意义
00h-01h MZ,为 EXE文
件标记
0eh-0fh 堆栈段的段值
(SS)
2h-03h 文件长度除 512
的余数
10h-11h SP
04h-05h 文件长度除 512
的商
12h-13h 文件校验和
06h-07h 重定位项的个数 14h-15h 被装入模块入口
IP值
08h-09h 文件头除 16的商 16h-17h 被装入模块入口
的 CS
0ah-0bh 程序运行所需最
小段数
18h-19h 第一个重定位项
的位移
0ch-0dh 程序运行所需最
大段数
1ah-1bh 覆盖号
1ch 可变保留区
执行程序结构
Exe文件装载过程是
– 确定内存起始段
– 确定长度
– 读 exe文件到内存
– 根据重定位表对内存的 exe文件体进行重定位
取出重定位项中的段值
段值加起始段=实际段值
加偏移量得到程序体的一个字
取出该字,加上起始段值
写回内存原来位置
– 初始化寄存器
– 控制权转移,开始执行
软件反跟踪技术
软件分析技术概述
加密反跟踪技术
– 跟踪技术
– 反跟踪技术
执行程序结构
静态跟踪、防静态分析、反防静态分析
静态跟踪、防静态分析、反防静态分析
静态跟踪,使用反汇编程序将可执行程序
转换为汇编程序,阅读汇编程序以获得原
始信息的方法。
防静态跟踪是将关键代码变形,使得反编
译结果不知所云的技术。防静态分析,必
须防止从反汇编的程序清单入手分析的方
法,必须防止用户对代码的静态分析与阅
读。
静态跟踪、防静态分析、反防静态分析
防静态分析技术主要有,
– 将程序放在隐蔽的位置:将程序某段或者某字
节放置到其他位置,使得反汇编结果无法正确
运行。而在正常运行中,有合适的机制将真实
的代码拼凑完整。例如 EXE头文件转移,再如
文件头放在特殊的地方。
– 对程序代码进行变换:以密文形式存在执行文
件中。被加密的程序不能执行,必须先解密,
关键在于密码对代码段的加密。
静态跟踪、防静态分析、反防静态分析
反防静态分析是针对防静态分析而应用的技术,
主要使用动态跟踪方法,通过跟踪程序的运行,
寻找真实判定正版处的跳转,修改代码,使得先
解密,忽略判定条件,直接执行程序体。
一种较为高级防静态分析方法,是后续模块需要
前面的模块运行结果,仅仅看代码是无法了解程
序控制流,这样可以防止破解者阅读程序。另外
的方法还有程序自行初始化,不使用系统重定位
的方法,也破坏汇编代码的解释。
软件反跟踪技术
动态跟踪、防动态跟踪
– 破坏 debug的基本方法
– 主动检测跟踪法
– 代码加密法
– 其他防跟踪方法
– 小结
– 软件防跟踪编程技巧
反跟踪程序例子
常用工具介绍
动态跟踪、防动态跟踪
动态跟踪是使用 1号 3号中断,跟踪执行程
序运行的方法。
防动态跟踪,是在使用 debug,codeview,
soft-ice,trw2000进行动态跟踪时,使得跟
踪方法难以进行。
破坏 debug的基本方法
抑制跟踪中断
– DEBUG的 T和 G命令分别要运行系统的单步中
断和断点中断服务程序,在系统向量表中这两
个中断的中断向量分别为 1和 3,中断服务程序
的入口地址分别存放在 0000:0004和
0000:000C起始的 4个字节中。
– 因此,当这些单元中的内容被修改后,T和 G命
令将无法正常执行
破坏 debug的基本方法
– 具体实现方法,
将这些单元作为堆栈使用
在这些单元中送入软件运行的必要数据 ;
将软件中某个子程序的地址存放在这些单元中,当需要调用时
使用 INT1和 INT3指令来代替 CALL指令 ;
放入惩罚性程序的入口地址。
封锁键盘输入
– 在加密系统无须从键盘或屏幕输入, 输出信息时, 关
闭这些外围设备, 以破坏跟踪调试软件的运行环境,
改变键盘中断服务程序, BIOS的键盘 I/O中断服务程序的入口
地址
禁止键盘中断
禁止接收键盘数据
不接受指定键法 ( 比如 T,P,G等 DEBUG键 )
破坏 debug的基本方法
设置显示器的显示性能
– 当加密系统无需在屏幕上显示信息时,可以通过各种
方法关闭屏幕,这样可使解密者无法得到跟踪调试软
件返回的任何信息,以阻止解密者对加密系统的破译,
封锁屏幕显示,可以重新设置屏幕特性,将前景和背景色彩置
成同一种颜色,使解密者在跟踪期间无法看见调试信息
通过获取屏幕信息的检查加密系统是否处于被监控状态
修改显示器 I/O中断服务程序的入口地址
定时清屏
直接对视屏缓冲区操作
破坏 debug的基本方法
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;死循环
S2:LEA 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开始计算 。
软件反跟踪技术
动态跟踪、防动态跟踪
– 破坏 debug的基本方法
– 主动检测跟踪法
– 代码加密法
– 其他防跟踪方法
– 小结
– 软件防跟踪编程技巧
反跟踪程序例子
常用工具介绍
反跟踪程序例子
示例程序是破坏单步中断和带断点的中断的反跟
踪程序,可以将此程序安排在加密程序的适当位
置上。
当程序没有被执行时,计算机的跟踪功能不变,
而当程序被执行后,系统的跟踪功能被修改。如
果此时再使用跟踪命令,不论是单步跟踪是带断
点跟踪,都会对正常程序的运行造成混乱,甚至
造成系统的死锁。
这样,只要加密程序被执行,跟踪行为就被阻止。
反跟踪程序例子
编写原理,
– 因为跟踪调试程序软件不外乎使用计算机单部
及断点的中断功能,具体是调用 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的陷阱
作业
学习 COM/EXE格式,设计防静态跟踪的执
行程序
实现 2种以上防动态跟踪方法