软件保护原理与实现.doc_第1页
软件保护原理与实现.doc_第2页
软件保护原理与实现.doc_第3页
软件保护原理与实现.doc_第4页
软件保护原理与实现.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

0、理解函数与实现 见“理解函数调用”一、软件防拷贝:从一台机器拷贝到另一台机器失败 回忆:从一个软盘或光盘拷贝到另一个软盘或光盘失败(做记号)。避免软件的克隆。 原理:利用机器上的部件的个性。例如CPU的ID,硬盘的序列号,网卡MAC地址等。 完成者:安装程序。 过程:安装程序将部件的个性值保存在某个位置,然后完成安装; 应用程序启动时读部件的个性并与安装程序设定的部件的个性值进行比较,相等则继续运行,否则退出。 部件的个性值藏在哪里:注册表(优点:好操作;缺点:重装系统后数据软件不能运行)。磁盘保留扇区(优点:隐藏好,但杀毒软件可能不让;缺点:完全格式化后软件不能运行);文件内部(最好),单独一个文件(要使用一些随机数据)。举例:利用分区的序列号保证软件只能在该分区运行。1)、设计安装程序 setup.exe 2)、在被保护程序中设置分析代码 举例:“取CPU和硬盘ID值”二、防止文件名被修改、所在目录被移动:检测文件名与目录名方法:先保存当前程序的文件名与全路径,运行时比较。1.方法1 char pBufMAX_PATH; /存放路径的变量 GetCurrentDirectory(MAX_PATH,pBuf); /获取程序的当前目录 strcat(pBuf,); strcat(pBuf,AfxGetApp()-m_pszExeName); strcat(pBuf,.exe); /获取程序的全文件名2.方法2 /函数返回应用程序所在的路径 CString CClientApp:ReturnPath() CString sPath; GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath.ReleaseBuffer (); int nPos; nPos=sPath.ReverseFind(); sPath=sPath.Left(nPos); return sPath; 三、利用扇区防拷贝软件设计 1、目的:保护公司设计的软件不会被非法复制。 2、原理:分析磁盘结构,在磁盘上寻找保留扇区(系统未使用,不会被覆盖的)扇区。安装程序使用底层办法将某个密码写入扇区。被保护程序启动时读该扇区密码,与设定的密码相同,则正常运行,否则退出。 3、步骤:设计安装程序,负责分析磁盘、寻找保留扇区、写入密码;设计被保护程序,负责读指定扇区的密码并进行比较。本处利用了物理硬盘的第60磁道写入密码“hello”。四、检测父进程反调试【防止调试】见“软件注册与保护2检测父亲进程保护自己”。反调试措施是软件开发者为防止开发的软件被破解或关键代码被他人非法攫取的一种手段。反调试措施很多,检测父进程反调试是DOS时代就有的技术,但Windows下未提供直接的解决方法,在目前流行的介绍软件保护技术的书籍中也未作介绍。1. 原理 一般情况下,在资源管理器下用鼠标双击或运行cmd.exe用键盘输入exe文件名来执行一个可执行文件。前者建立进程的父进程为explorer.exe,后者为cmd.exe。如果要防止受保护的可执行文件被分析调试,在其被执行时,可以检测它的父进程是否为explorer.exe或cmd.exe,若是,则当前进程没有被调试,否则可能被调试,需要采取一定的反调试措施。在DOS下分析当前进程的父进程时,可以到程序段前缀PSP中去找,对于DOS程序的exe文件,PSP在代码段的前一个段,紧靠代码段,若是com文件,则在IP寄存器099H区域。PSP的大小为100H字节。检测Windows程序的父进程比DOS复杂得多,微软没有提供现成的函数。但从几个其它用途的函数从侧面可以实现。函数Process32First和Process32Next用于列举当前正在内存中的进程,它们要用到一个结构PROCESSENTRY32。该结构中有两个字段th32ProcessID和th32ParentProcessID,分别描述一个进程的ID值和该进程的父进程的ID值。从父进程ID值可以获取父进程的路径名。如果发现父进程的文件不是explorer.exe或cmd.exe,则可以采取反分析措施。 反分析措施可以有两种方法。一种是当前进程退出,使其无法继续分析下去。另一种是破坏某些关键字节,让其调试出现错误。2. 检测父进程实现技术以一个简单的对话框程序来分析其过程。1) 包含相应文件#include #include psapi.h #pragma comment(lib, psapi)因为Process32First等函数包含在tlhelp32.h中,GetModuleFileNameEx函数包含在文件psapi.h中。2) 枚举所有进程的ID值BOOL CFatherPApp:InitInstance() DWORD id=GetCurrentThreadId();GetModuleFileName(NULL,fname,256); HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap = INVALID_HANDLE_VALUE) AfxMessageBox(无法创建进程的快照n); return 0; PROCESSENTRY32 pe32 = 0; pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hProcessSnap, &pe32) AfxMessageBox(无法获得进程列表n); CloseHandle (hProcessSnap); return 0; do DisplayProcessInfo(pe32.th32ParentProcessID,1); DisplayProcessInfo(pe32.th32ProcessID,0); while (Process32Next(hProcessSnap, &pe32); CloseHandle (hProcessSnap);3) 获取父进程的文件名到infather对象并分析是否是explorer.exe或cmd.exe char fname256; CString in,infather;void DisplayProcessInfo(DWORD pid,BOOL father) CString inf; CString in; HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid); char FileNameMAX_PATH; if (hProcess) if (GetModuleFileNameEx(hProcess, NULL, FileName, MAX_PATH) if(father)infather=FileName; else inf=fname; if(!father) /分析子进程in=FileName;in.MakeLower();inf.MakeLower();if(in=inf) /MessageBox(0,infather,显示父进程,MB_OK); infather.MakeLower(); if(infather.Find(explorer.exe,3)=-1|infather.Find(cmd.exe,3)=-1) /*采取反分析措施*/ CloseHandle (hProcess); 3. 反分析措施退出当前进程用函数ExitProcess实现。另一种办法是破坏后面的代码,使其调试出错。例如,设紧接上面的代码的后面有代码,分别使用标号startpos和endpos进行标记,则在高级语言中插入汇编代码进行破坏,代码如下:_asmmov ebx,offset startposmov ecx,offset endpossub ecx,ebxagain:dec byte ptrebxloop again4. 测试程序应该在cmd.exe和explorer.exe下可以执行,但不能被其它进程调用。以反汇编工具W32dasm.exe作试验,图1左边为开始调试时的状态,内存中建立了fatherp.exe进程。图的右边为继续调试后的状态,进程fatherp.exe已经退出。 图1 对进程进行调试 5防调试措施的进一步提高 上面的方法可能有些作用,但如果调试软件将自己的文件名改为cmd.exe或explorer.exe不就可以欺骗了吗?解决的方法是可以采用类似“病毒特征码”的方法。受保护文件中首先保存那些调试工具的特征码,在找到父进程后,分析父进程对应的文件中有无特征码,有则采取反分析措施。 6. 时间检测反调试:估计关键代码的运行时间。见“时间检测反调试”五、光盘上数据保护1、光盘在光驱中的工作原理如图1 图1光盘工作原理磁盘上有磁道,都为同心圆,而光盘上叫光道,为一种由外而内的螺旋线组成。光道被分成扇区。光道与磁道相比,光道的密度以及光道上的数据密度都远远大于磁道。目前常见的CD光盘格式大致可分为音乐CD(CD-DigitalAudio,即CD-DA)、数据CD(即CD-ROM)和扩展类CD(CD-ROM Extended Architecture,即CD-ROM XA)。这三种格式的主要区别在于每扇区的字节数,CD-DA为2352字节/扇区、数据CD为2048字节/扇区、扩展类CD为2336字节/扇区。正因如此,这三种格式光盘的数据容量存在明显的区别(以标准的74分钟光盘计算): 音乐CD的容量为:746075235210241024=746.93(MB); 数据CD的容量为650.39(MB); 扩展类CD的容量为:746075233610241024=741.85(MB)。目前唯一通用的光盘文件系统遵守由国际标准化组织于1985年颁布ISO-9660标准。因此,如果想让刻录好的光盘能被所有的CD-ROM驱动器都顺利读取的话,最好使用ISO-9660或与其兼容的文件系统。ISO-9660目前有Level 1和Level 2两个层级。Level 1与DOS相兼容,文件名采用传统的8.3格式,而且所有字符只能是26个大写英文字母、10个阿拉伯数字及下划线。Level 2则在Leve l的基础上加以改进,允许使用长文件名,子目录可达32层,但不支持DOS。 除此之外,还有微软公司自行定义的光盘文件系统Joliet和Adaptec公司自行定义的文件系统Romeo。对于光盘,需要知道以下名词: Sector (扇区):扇区是光盘上存储数据的最小逻辑单位。 Track(轨):为光盘的单位名词,是由相同模式的扇区组成。在音乐光盘上,一轨代表一个音乐曲目,而对数据光盘,单一文件或数以千计的文件,只有一轨。对于混合型模式或扩展型模式光盘,音乐与数据由于它们的模式不同而分为多轨。 Bootable CD-ROM(启动光盘):将硬盘或软盘的开机数据和操作系统刻录到光盘上,制作成的CD-ROM。 Image File(镜像文件):根据ISO 9660的规定,刻录软件所建立的文件必须必须与CD-R 上的逻辑位置排列一致,在刻录前将数据在硬盘内制作成镜像文件Image file,记录了有关要刻录的文件信息再刻录到光盘,成功率很高。2、最简单方式UINT GetDriveType(LPCTSTR lpRootPathName) 判断一个磁盘驱动器的类型,返回值:0 驱动器不能识别 1 指定的目录不存在2 DriveRemoveable3 A Fixed Disk (HardDrive)4 Remote Drive(Network)5 Cd-Rom驱动器6 RamDisk在使用该函数时要注意,参数要使用如 ”C:”,而不能使用 “C:”,即要加上双斜杠。(3) DWORD GetFileAttributes(LPCTSTR lpFileName )获取指定文件的属性,lpFileName为文件全路径名,返回值为文件属性。属性有 FILE_ATTRIBUTE_ARCHIVE,FILE_ATTRIBUTE_COMPRESSED,FILE_ATTRIBUTE_DIRECTORY,FILE_ATTRIBUTE_ENCRYPTED,FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_NORMAL,FILE_ATTRIBUTE_READONLY(只读),FILE_ATTRIBUTE_SYSTEM等。光盘上文件为不可修改属性的只读。 光盘文件全部是只读属性,且不能修改。2、演示:保证程序只能在光驱上执行。原理:取当前程序的路径,GetCommandLine比较方便。 判断盘符是否为光驱GetDriveType,是则继续,否则退出。注意:代码应放在程序初始化部分3、思考:1) 对付虚拟光驱SetFileAttributes 设置文件属性(虚拟光驱还行吗) WriteFile 应该失败(虚拟光驱还行吗) 2) U盘窥探者原理:偷U盘上数据六

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论