加解密入门基础知识

不少人都想学习解密,这东西刚入门时会让人沉迷进去,能够饭不吃、觉不睡。出现这种现像,也许是解密知足了人们的猎奇内心吧。但掌握这方面技术,对自身的 提升确实有好处。能够经过跟踪软件,提升本身的调试技能,而且能了解他人程序思路,使本身写出更好的程序。研究解密技术有助于掌握一些系统底层知识,系统 底层知识绝对是构造起大型软件的坚实基础。许多程序发展,都经历了这一锻炼过程的。 而大多数人可能认为解密是一门高深的学问。形成这种缘由是之前这方面 的技术资料缺少,从而将“解密”这一技能“神”化了。初学者通常不知从何下手,因为没方向,花费了大量时间和精力,走了很多弯路。这里就给对这方面感兴趣 的读者指明一个方向。
 
讨论前,先了解一下计算机中的程序。高级语言编写的程序,会编译成机器语言在CPU中执行,如Visual C++等。因为机器语言与汇编语言是一一对应 的,所以就可将机器语言转化成汇编语言,这个过程称之为反汇编。而汇编语言可能读性是比较好的,这样就可分析程序流程,解析其功能了,这个过程就是解密 (俗称破解)。也就是说,解密的基础是创建在汇编语言级别上的,所以想涉足这一领域的朋友,汇编语言必定得学好。汇编语言是大学计算机的必修课,这方面的 书籍品种不少,虽然大多书本是以DOS汇编为讲解平台,但对理解汇编指令功能是没影响的。php

等汇编学好了,此时通常的破解文章己能看懂了,但为了水平提升的更快些,建议再掌握Win32编程。Win32程序设计就是API方式的Windows编 程,学习Windows API将使您更深刻地了解Windows工做方式。此类书籍有Charles Petzold著的《Windows程序设计》 (以VC来说解)。另外一本是罗云彬著的《Windows环境下32位汇编语言程序设计》,它以MASM汇编为讲解平台。html

学习解密其实很累的,需花费大量的时间,并且常常会碰壁,三五天毫无进展是极为日常的事情。这时你可能有点想退却,其实你不要着急,只要你认真学习,成功 就在眼前。没有人是生来就什么都会的,若是你有问题,就大胆的去问你周围的人。学解密的秘诀就是勤奋+执着!记住并能作到这两点,你会变得很优秀的。
 
等你解密入门后,建议再看看Matt Pietrek、Jeffrey Ritcher等大师的专著,这些书是每一个程序员都应该阅读的: 《Windows 95 System Programming Secrets》(中文译名《Windows 95 系靳程式设计大?秘》), 《windows高级编程指南》,《Windows2000编程技术内幕》,《Win32系统编程―Windows 2000应用程序开发指南》等。这 样,你就对系统底层有必定的了解了。到了这个水平后,就可朝软件加密这块发展了,例如编写本身的加壳软件等。程序员

软 件的加密与解密是一个迷人的研究领域,它几乎能够与任意一种计算机技术紧密结合――密码学、程序设计语言、操做系统、数据结构。而因为这样或者那样的原 因,对于这一领域的关注程度一直还处于低温状态。而这两本书相信会为更多对知识怀有渴望的朋友多开辟一条走向这个领域的道路,而且进而推进这个领域的不断 发展。 算法

第一课 逆向分析基础知识
 
1.1 调用约定 
 
在分析汇编代码时老是要遇到无数的Call,对于这些Call,尽可能要根据Call以前传递的参数和Call的返回值来判断Call的功能。传递参数的工做必须由函数调用者和函数自己来协调,计算机提供了一种被称为栈的数据结构来支持参数传递。
 
当参数个数多于一个时,按照什么顺序把参数压入堆栈。函数调用后,由谁来把堆栈恢复。在高级语言中,经过函数调用约定来讲明这两个问题。常见的调用约定有:
 
http://bbs.pediy.com/upload/bbs/faq/call.gif 
 
 
【例】按__stdcall约定调用函数test2(Par1, Par2) 
 
 
push par2 ; 参数2
push par1 ; 参数1
call test2;
{
push ebp ; 保护现场原先的EBP指针
mov ebp, esp ; 设置新的EBP指针,指向栈顶
mov eax, [ebp+0C] ; 调用参数2
mov ebx, [ebp+08] ; 调用参数1
sub esp, 8 ; 若函数要用局部变量,则要在堆栈中留出点空间

add esp, 8 ; 释放局部变量占用的堆栈
pop ebp ; 恢复现场的ebp指针
ret 8 ; 返回(至关于ret; add esp,8)
}
 
 
其堆栈调用示意图:
 
http://bbs.pediy.com/upload/bbs/faq/callesp.gif 
 
 

1.2 局部变量 
 
在子程序内部说明的变量称为局部变量,局部变量的做用域是其所在的子程序。从汇编角度来看,局部变量就是一个临时堆栈缓存,用完释放。
例如这个实例: 附件:local.zip 
 
其反汇编代码以下(红体字为局部变量):
 
00401000 >/$ 6A 04 push 4 ; /Arg2 = 00000004
00401002 |. 6A 03 push 3 ; |Arg1 = 00000003
00401004 |. E8 16000000 call 0040101F ; \Add.0040101F
00401009 |. 8BD8 mov ebx, eax
0040100B |. 6A 00 push 0 ; /ExitCode = 0
0040100D \. FF15 00204000 call [<&KERNEL32.ExitProcess>] ; \ExitProcess
 
 
0040101F /$ 55 push ebp ; 保护现场原先的EBP指针
00401020 |. 8BEC mov ebp, esp ; 设置新的EBP指针,指向栈顶
00401022 |. 83EC 04 sub esp, 4 ; 分配局部变量全部空间
00401025 |. 8B45 0C mov eax, [ebp+C] ; 调用参数2
00401028 |. 8B5D 08 mov ebx, [ebp+8] ; 调用参数1
0040102B |. 895D FC mov  [ebp-4] , ebx ; 参数1放局部变量里
0040102E |. 0345 FC add eax, [ebp-4] ; 参数2与局部变量相加
00401031 |. 83C4 04 add esp, 4 ; 释放局部变量全部空间
00401034 |. 5D pop ebp ; 恢复现场的ebp指针
00401035 \. C2 0800 retn 8
 
 
1.3 返回值 
 
在调试程序时,不要见Call就跟进,在Call以前所作的全部PUSH动做以及对寄存器的操做均可能是在给函数传递参数,而函数的返回值通常都放在EAX里面,固然这个值多是一个指针,指向一个数据结构。从汇编角度来看,主要有以下形式:
 
1)经过寄存器返回函数值;
2)经过参数按引用方式返回函数值;
3)经过全局变量返回函数值;
4)经过处理器标志返回函数值;
通常状况下,由retrun操做符返回的值放在EAX寄存器之中,若是结果超过这个寄存器的位容量,那么该结果的高32位会加载到EDX寄存器中。 若是 返回一个含有几百个字节的结构或者一个近似大小的对象,编译器会在不告诉程序的状况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。
 
 
1.4 启动函数 
 
在编写Win32应用程序时,都必须在源码里实现一个WinMain函数。但Windows程序执行并非从WinMain函数开始的,首先被执行的是启 动函数相关代码,这段代码是编译器生成的。启动代码完成初始化进程,再调用WinMain。标准编译器一般包含启动代码在内的库文件源码,例如 Visual C++中,启动代码存放在CRT\SRC\crt0.c文件中。
全部的C/C++运行时启动函数的做用基本都是相同的:检索指向新进程的命令行指针,检索指向新进程的环境变量指针,全局变量初始化,内存堆栈初始化等。当全部的初始化操做完毕后,启动函数就调用应用程序的进入点函数。
调用WinMain以下所示:
GetStartupInfo (&StartupInfo);
Int nMainRetVal = WinMain(GetModuleHandle(NULL),NULL,pszCommandLineAnsi,(StartupInfo.dwFlags&STARTF_USESHOWWINDOW)?StartupInfo.wShowWindow:SW__SHOWDEFAULT);
当进入点返回时,启动函数便调用C运行库期的exit函数,将返回值(nMainRetVal)传递给它,进行一些必要处理,最后调用系统函数ExitProcess退出。 其余一些编译器,如Delphi、BorLand C++开发包中都有相应的启动代码。
在绝大数状况下,咱们对启动代码并不须要关心。 对于逆向分析人员来讲,首要的任务是找到Winmain函数。 
 
WinMain函数原型以下:
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例的句柄
HINSTANCE hPrevInstance, // 前一个实例的句柄 
LPSTR lpCmdLine, // 命令行的指针 
int nCmdShow // 窗口的显示状态
); 
其中参数hInstance通常经过GetModuleHandleA函数进行获取的,这对识别WinMain函数有些帮助。另外,对WinMain的调 用一般放在启动函数代码结尾部分,后面一般跟着诸如exit或XcptFilter以内的两、三个函数。例以下面这段代码:
.text:004010DC push eax ; nShowCmd
.text:004010DD push [ebp+lpCmdLine] ; lpCmdLine
.text:004010E0 push esi ; hPrevInstance
.text:004010E1 push esi ; lpModuleName
.text:004010E2 call ds:GetModuleHandleA
.text:004010E8 push eax ; hInstance
.text:004010E9 call WinMain(x,x,x,x)
.text:004010EE mov [ebp+var_60], eax
.text:004010F1 push eax ; int
.text:004010F2 call _exit
 
许多开发人员能够获得启动源代码的状况下对启动代码进行修改,这样,程序的执行可能不是从WinMain开始,而是从任何其余的函数开始。
 
1.5 API函数 
 
如今不少讲Windows程序设计的书都是讲基于MFC库和OWL库的Windows设计,对Windows实现的细节都鲜有讨论,而调试程序都是和系统 底层打交道,因此有必要掌握一些Win32 API函数的知识,这样咱们可快捷地找出程序调用错在哪?是哪一个参数出了问题。
Windows程序模块包括KERNEL、USER和GDI,其中KERNEL完成内存管理、程序的装入与执行和任务调度等功能,它须要调用原 MS?DOS中的文件管理、磁盘输入输出和程序执行等功能;USER是一个程序库,它用来对声音、时钟、鼠标器及键盘输入等操做进行管理;GDI是一功能 十分丰富的子程序库,它提供了图形与文字输出、图象操做和窗口管理等各类与显示和打印有关的功能。上述KERNEL、USER和GDI模块中的库函数可被 应用程序调用,也可被其余程序模块调用。把包含库函数的模块称为输出者(export)。你应明白为何跟踪软件时常常在KERNEL32!.text和 USER32.text等系统领空转的问题吧。
 
这里列出几个常常碰到的Win 32 API函数,它们都是存在Windows系统核心文件KERNEL32.DLL中和视窗管理文件USER32.DLL中。
Windows函数是区分字符集的:A表示ANSI,W表示Wide,即Unicode (Wide character-set),前者就是一般使用的 单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的状况。然后者是双字节方式,方便处理双字节字符。Windows的全部与字 符有关的函数都提供两种方式的版本。尽管你编程时使用GetWindowText,但实际上编译程序会根据设置自动调用GetWindowTextA或 GetWindowTextW。函数的最后一个字母告诉咱们函数是使用单字节仍是双字节字符串。
 
一、 Hmemcpy函数
void hmemcpy(hpvDest, hpvSource, cbCopy) 
void _huge* hpvDest; // 目的数据地址 
const void _huge* hpvSource; // 源数据地址 
long cbCopy; // 数据大小 (Bytes) 
这个函数在KERNEL32.DLL中,它很经常使用,俗称万能断点,但通常的编程书籍上不多提到,缘由它是底层的东西,没有特殊须要,通常不直接调用。但的确它是颇有用的!有意思的是它执行的操做很简单,只是将内存中的一块数据拷贝到另外一个地方。
注意:此函数只在Windows 9x系统上有效,在Win NT/2K系统上相关的函数是memcpy,但在Win NT/2K上不一样于Windows 9x上,不多再调用memcpy来处理数据了,用此函数设断基本上什么也拦不住。
 
二、 GetWindowText函数
此函数在USER32.DLL用户模块中,它的做用是复制指定窗口中的字符到缓冲区。函数原型:
int GetWindowText(
HWND hWnd//欲获取文字的那个窗口的句柄 
LPTSTR lpString //预约义的一个缓冲区,至少有cch+1个字符大小;随同学口文字载入 
int nMaxCount//lpString缓冲区的长度
);
16位:GetWindowText
32位:GetWindowTextA,GetWindowTextW
 
三、 GetDlgItemText
此函数在USER32.DLL用户模块中,它的做用是返回对话框中某一个窗口的标题或文字。函数原型:
UINT GetDlgItemText(
HWND hDlg, // 对话框句柄
int nIDDlgItem, //控制标识符
LPTSTR lpString, / 预约义的一个字符缓冲区
int nMaxCount// 字符缓冲区的长度
);
16位:GetDlgItemText
32位:GetDlgItemTextA,GetDlgItemTextW
 
四、 MessageBox函数
此函数是在USER32.DLL用户模块中,它的做用建立、显示和操做信息框。函数原型:
int MessageBox(
HWND hWnd, //窗口句柄
LPCTSTR lpText, // 信息框中文字的地址
LPCTSTR lpCaption, // 信息框标题地址
UINT uType // 信息框类型
);
16位:MessageBox
32位:MessageBoxA,MessageBoxW
 
学习API函数最好的资料就是《Windows程序设计》这本书,下面列出其余一些参考资料:

其余资料  
Win32头文件 

 
 

 

 

第三课 动态分析技术
 
所谓动态分析是利用调试器,如OllyDBG一步一步地单步执行软件。常见的调试器有SoftICE,OllyDBG(简称OD)等。SoftICE是一 款经典的调试工具,运行在Ring0级,能够调试驱动。但平时调试的程序都是Ring3级,所以推荐你们用OllyDBG,这款工具上手容易,功能十分强 大,如今论坛上的文章基本都是用OllyDBG来说解的。 
 
3.1 OllyDBG调试器

 
OllyDBG工具下载  
点击此处下载OD 

 

 
名词解释  
1.所谓领空,其实是指:在某一时刻,CPU 的 CS:IP(EIP) 所指向的某一段代码的全部者所在的区域。
 

 
3.2 Olldbg常见问题
 
Q: OD中如何运行到光标所在处?
A: 将光标移到目标位置,按F4.
 
Q: 如何用OD修改可执行程序?
A:直接在反汇编代码区更改,这时可使用汇编代码更改,而后选中修改后的汇编代码,右击-->复制到可执行文件-->保存文件.
 
Q:OD中的代码乱码,如:
004365E0 >db 68 ; CHAR 'h'
004365E1 >db A4
004365E2 >db 7A ; CHAR 'z'
004365E3 >db E5
004365E4 >db B8
004365E5 >db E8
004365E6 >db BB
 
A:OD右键,"分析/从模板中删除分析",如不行,按Ctrl+A从新分析
 
 
Q:OD为何删除了断点,从新加载的时候,这些断点都会从新出现
A:设置ollydbg.ini,将配制文件里改为以下:Backup UDD files=1 (by kanxue)
 
Q:如何还原到OD到分析前的状态?
A:右键 分析/从模块中删除扫描
 
Q:什么是UDD?
A:OllyDbg 把全部程序或模块相关的信息保存至单独的文件中,并在模块从新加载时继续使用。这些信息包括了标签、注释、断点、监视、分析数据、条件等等
 
Q:OD的数据窗口显示一个下划线,是什么意思?
A:重定位加下划线[Underline fixups],几乎全部的DLL和一部分程序都包含重定位,这样就能够在内存中的不一样基地址加载模块了。当该项开启时,CPU反汇编窗口或CPU数据窗口中的重定位地址都将添加下划线。(xing_xsz)
 
Q:若是已经知道某一CALL的具体做用,可否把后面全部相同的CALL都改为函数名形式?
A:好比 CALL 110000 此中已经知道110000是一个核心计算
则以下操做,让光标停在CALL 110000 这个语句上,按回车键
会跳到110000的地址上去显示,以后让光标停在110000上,按
shift 和; (分号) 其实就是完成一个:(冒号)的动做,输入
名称,这回全部的调用110000处,都会显示CALL 你刚才输入的
名称了.(nig回答)
 
Q:用OD调试一些加壳程序,如Themida等,可能你会发现下断后(包括硬件断点),程序跑到断点时,OD会出现假死现像。
A:打开OD配置文件ollydbg.ini,你会发现:Restore windows= 123346 //这个Restore windows可能会是一个很大的值
如今只须要将Restore windows=0,从新用OD调试程序,假死问题就消失了。 (kanxue)
 
Q:ollydbg中如何调用pdb文件? 
A:
pdb文件是VC++调试编译生成的文件。由编译器直接生成。
pdb文件要配合源文件使用。不一样的源文件pdb文件不一样。
用OD装入可执行文件后,点击CPU窗口中的注释段可出现源码。
不过不是全部的源码均可以显示的。VC++6.0如下均可以显示。
还有一种不显示的缘由是缺乏路径。点击OD主菜单的[查看]->[源文件]
若是[源码]段出现(缺乏)字样的话,说明此路径的源码是看不了的。设置正确的路径就能够了。
(nantz回答)
 
Q:运行A.exe,其会调用B.exe,若是用OD再附加B.exe,OD会死掉
A:
1.OD菜单,设置OD为即时调试器;
2.将B.exe的入口改为CC,即INT 3指令,同时记下原指令
3.运行A.exe,其调用B.exe,会致使异常,OD会自动启动加载B.exe,此时你将INT 3指令恢复原指令。
4.到这步,你己能够任意调试B.exe了(kanxue)
 
Q:用ollydbg调试的时候,断住kernel32.dll系统函数,而后”执行到用户代码“,就能够回到被调程序的代码。但有时候却回不来,不知道这又是为何?
A:
多半是杀毒软件(如卡巴对LoadLibraryA)Hook API入口代码进入ring 0了,OllyDbg不能单步跟踪,这种状况下只要看堆栈返回地址,在返回地址上下端点,F9执行就能够了。(cyclotron回答)
 
Q:OD的“复制可执行文件”后面没有 “全部修改”的菜单
A:OD识别代码段范围失败后, 没有复制all modifications的选项, 由于这个是复制代码段内的修改的。(曾半仙回答)
 
Q:OD里的patch窗口怎么用?
A:patch窗口用来保存你在调试的程序中修改过的代码的。好比你前面调试了一个程序,在OD中把某处的JE改为了JMP,OD会在patch中记录这 个修改,你下次再从新载入程序时,就能在OD的patch窗口中看到你原来改动的代码。按空格键就能够激活patch,就是在OD中还把原来位置的JE改 成JMP。这个只是在OD中做更改,并无实际保存到文件,主要是比较方便在OD中修改程序时测试。(CCDebuger回答)

 

3.3 Olldbg脚本教学
 
这部分有点难度,新手能够跳过,等水平提升后回头再学习。

 

 

第四课 静态分析技术
 
所谓静态分析即从反汇编出来的程序清单上分析,从提示信息入手进行分析。目前,大多数软件在设计时,都采用了人机对话方式。所谓人机对话,即在软件运行过 程中,须要由用户选择的地方,软件即显示相应的提示信息,并等待用户按键选择。而在执行完某一段程序以后,便显示一串提示信息,以反映该段程序运行后的状 态,是正常运行,仍是出现错误,或者提示用户进行下一步工做的帮助信息。为此,若是咱们对静态反汇编出来的程序清单进行阅读,可了解软件的编程思路,以便 顺利破解。 经常使用的静态分析工具备W32DASM、C32Asm和IDA Pro等。
 
4.1 认识PE格式
 
在Win32平台上(包括Windows 95/98/ME/NT/2000/XP/2003/CE),可执行文件是 PE(Portable Executable)格式。PE文件使用的是一个平面地址空间,全部代码和数据都被合并在一块儿,组成一个很大的结构。文件的内 容被分割为不一样的区块(Section,又称区段、节等),块中包含代码或数据。
http://bbs.pediy.com/upload/bbs/unpackfaq/pe.gif 
 
刚接触这块的朋友只须要简单了解一下PE格式,更具体的PE格式请参考脱壳基础知识入门(2006年版) 
 
PE相关名词解释以下:
1.入口点(Entry Point)
程序在执行时的第一行代码的地址应该就是这个值。
 
2.文件偏移地址(File Offset)
PE文件在磁盘上储存时,各数据的地址称文件偏移地址(File Offset)。用十六进制工具(例如Hex Workshop、WinHex等)打开文件显示的地址就是文件偏移地址。
 
3.虚拟地址(Virtual Address,VA)
因为Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。与实地址模式下的分段地址相似,虚拟地址也可写成"段:偏移量"的形式,这里的段是指段选择器。
 
4.基地址(ImageBase)
文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。在Windows NT中,缺省的值是10000h;对于 DLLs,缺省值为400000h。在Windows 9x中,10000h不能用来装入32位的执行文件,由于该地址处于全部进程共享的线性地址区域, 所以Microsoft将Win32可执行文件的缺省基地址改变为400000h。
 
5.相对虚拟地址
相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。即:相对虚拟地址(RVA)=虚拟地址(VA)-基址(ImageBase)。
 
4.2 虚拟地址和偏移量转换
 
  在OllyDBG,IDA和W32Dasm下显示的地址值是虚拟地址(Virual Address,VA)。而十六进制工具里,如:Hiew、Hex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 。
 
  其转换原理是由于PE文件在磁盘上的数据结构与在内存中的结构是一致的,以下图:
http://bbs.pediy.com/upload/2005/4/image/rva-va.gif 
具体见:http://bbs.pediy.com/showthread.php?s=&threadid=18022 
 
  在实际操做时,使用 LordPE等工具很容易进行File offset与VA的转换。LordPE打开目标文件,点击FLC按钮,打开以下图的对话框,填入相应地址,点击DO按钮便可转换:
http://bbs.pediy.com/upload/bbs/Newbie/offset.gif 
 
4.3 文件类型分析
 
 文件分析是静态分析程序的第一步,经过相关工具显示欲调试文件的信息,如它是用什么语言写的,是否加壳等。经常使用的文件分析工具备PEIDFileInfo等。有关壳的相关知识等入门后,再参考相关教学,如 脱壳基础知识入门(2006年版) 。若是查到文件有壳,此时静态分析是没意义的,但能够用OD动态调试,分析程序算法。
 
1.PEiD
 
PEiD的GUI界面操做很是方便直观。它的原理是利用查特征串搜索来完成识别工做的。各类开发语言都有固定的启动代码部分,利用这点就可识别出是何种语 言编编译的。一样,不一样的壳也有其特征码,利用这点就可识别是被何种壳所加密。下面PEiD识别出这个软件是用Asprotect 1.2x加的壳。
http://bbs.pediy.com/upload/bbs/unpackfaq/peid.gif 
 
2.FileInfo
 
FileInfo(简称Fi)另外一款不错的文件检测工具。
FI的具体用法 
 
 
 
4.4 W32Dasm简介
 
W32Dasm简介 
 
 
4.5 IDA pro操做
 
IDA简易教程 
IDA里的中文字串 
 
4.6 keymaker内存注册机
 
Q:什么是某个软件的中段地址,指令长度,第一字节,这些数据怎么获得,这些数据在内存注册机中怎么应用?
A:
青色表明着注册码的保存模式
绿色的是中断地址,中断地址通常选择注册码保存模式的下一句,或下几句地址,但必须保证程 序中断到这个地址时注册码保存的值没有被任何东西修改或改变。以下面的例子,中断地址能够选在00401205和00401207,但不能选在 0040120C这个地址,由于00401207这个Call事后会修改eax的值。
红色的是中断的第一个字节
红色加上蓝色的字节就是指令长度,以下面的例子选的中断地址是00401207,这个地址上有5个字节,因此指令长度是5

00401205      50               PUSH EAX           ;eax中保存着真注册码
00401206      52               PUSH EDX           ; edx中保存着假注册码
00401207      E8 68 FF FF FF   CALL 00401174      ; 比较真假注册码
0040120C      85 C0            TEST EAX,EAX       ; 测试注册码真假结果
0040120E      75 42            JNZ SHORT 00401252 ; 假则跳向错误,真则不跳编程

 

第五课 常见保护的攻击 


5.1 序列号方式 

  软件验证序列号的过程,其实就是验证用户名和序列号之间的数学映射关系。这个映射关系是由软件的设计者制定的,因此各个软件生成序列号的算法是不一样的。这是最多见的一种保护方式。
windows

 

5.2 警告(NAG)窗口 
   Nag的本义是烦人的意思。Nag窗口是软件设计者用来不时提醒用户购买正式版本的窗口。
api

NAG窗口  
  警告(NAG)窗口  

 

5.3 时间限制 
   这类保护的软件通常都有时间段的限制,例如试用30天等。当过了共享软件的试用期后,就不予运行。只有向软件做者付费注册以后才能获得一个无时间限制的注册版本。
缓存

时间限制  
  时间限制  

 


5.4 Key File保护  
   KeyFile(注册文件)是一种利用文件注册软件的保护方式。
网络

Key File保护   
  Key File保护  

 


5.5 功能限制的程序   
   这种程序通常是DEMO版或菜单中部分选项是灰色。有些DEMO版本的部分功能里面根本就没有。而有些程序功能全有,只要注册后就正常了。
数据结构

功能限制的程序    
  功能限制的程序  

 


5.6 CD-check   
   最简单也最多见的光盘保护就是程序在启动时判断光驱中的光盘上是否存在特定的文件,若是不存在则认为用户没有正版光盘,拒绝运行。在程序运行的过程中通常再也不检查光盘的存在与否。

CD-check   
  CD-check  

 

5.7 重启验证 


5.8 网络验证

摘自:http://bbs.pediy.com/showthread.php?p=224481#post224481

相关文章
相关标签/搜索