当前位置: 首页 > news >正文

利用安装程序防止软件非法拷贝

利用安装程序防止软件非法拷贝
每个用户都不希望自己开发的软件被别人轻易的拷贝使用,自然而然想起了要对软件进行加密。本文主要介绍一种通过安装程序来拷贝软件,防止软件非法拷贝的方法。经过实践证明这种方法非常适用于需要把软件安装到硬盘上才能使用的情况。
一、工作原理
通过在被加密的软件中设置一个特殊的单元,由一个安装程序将被加密的软件装入指定的硬盘(C、D、E等)分区上。在拷贝装入硬盘的过程中,把被加密的软件在硬盘中首簇号填写到其指定单元中。同时在被加密的软件中嵌入检验程序,当被加密的软件在硬盘上运行时,检验程序首先判断被加密的软件在硬盘的首簇号与其本身程序中指定单元的内容是否相同。若不同,则认为是该软件是非法拷贝得到的,终止软件的运行。如果相等,则认为该软件是通过安装程序正常安装得到的,允许软件继续运行。
本方法使用了一些DOS中断调用对文件进行操作的深层知识,如INT21H中断的11H,1AH,3CH,3DH,3EH,3FH,40H,42H号功能调用和文件控制块(FCB)数据格式等。在此作一简单介绍,更为详细的使用方法请参阅资料。
1、INT 21H中断功能调用
①INT 21中断11H号功能
作用:在指定盘的当前目录下查找匹配的文件名
调用:AH=11H
DS:DS=文件控制块段:位移
返回:AL=00,成功,找到匹配的文件名
AL=0FFH,失败,未找到匹配的文件名
②INT 21中断1AH号功能
作用:置盘传输区地址
调用:AH=1AH
DS:DX=盘传输区段:位移
返回:无
③INT 21中断3CH号功能
作用:创建文件
调用:AH=3CH
CX=文件属性,00H:标准,01H:只读,02H:隐含,04H:系统
DS:DX=文件说明段:位移
返回:成功
进位标志=清
AX=文件描述字
失败
进位标志=置
AX =错误代码,3:路径未找到,4:无描述字可用,5:拒绝访问
④INT 21中断3DH号功能
作用:打开文件
调用:AH=3DH
AL=存取模式,000:读,001:写,010:读/写
DS:DX=文件说明段:位移
返回:成功
进位标志=清
AX=文件描述字
失败
进位标志=置
AX =错误代码,1:功能号无效,2:文件未找到,3:路径未找到,
4:无描述字可用,5:拒绝访问
⑤INT 21中断3EH号功能
作用:关闭文件
调用:AH=3EH
BX=文件描述字
返回:成功
进位标志=清
失败
进位标志=置
AX =错误代码,6:描述字无效
⑥INT 21H中断3FH号功能
作用:读文件
调用:AH=3FH
BX=文件描述字
CX=所读字节数
DS:DX=段:缓冲区位移
返回:成功
进位标志=清
AX=实际读字节数,0:文件结束
失败
进位标志=置
AX =错误代码,5:拒绝访问,6:无描述字可用
⑦INT 21H中断40H号功能
作用:写文件
调用:AH=40H
BX=文件描述字
CX=写的字节数
DS:DX=缓冲区段:位移
返回:成功
进位标志=清
AX=实际写字节数,0:盘满
失败
进位标志=置
AX =错误代码,5:拒绝访问,6:无描述字可用
⑧INT 21H中断42H号功能
作用:移动文件指针
调用:AH=42H
AL=方式码,0:从文件开始绝对字节位移
1:从当前位置的字节位移
2:从文件尾的字节位移
BX=文件描述字
CX=最有效一半位移(高字)
DX=次有效一半位移(低字)
返回:成功
进位标志=清
DX=最有效一半位移(高字)
AX=次有效一半位移(低字)
失败
进位标志=置
AX =错误代码,1:功能号无效,6:描述字无效
2、文件控制块(FCB)数据格式
驱动器号,“文件名 扩展名”
对于驱动器号来说,1:A驱,2:B驱,3:C分区,4:D分区,等等依次类推。
对于文件名和扩展名来说,按8.3格式构造文件,总共11个字符,文件名不够8个字符用空格补齐。
例如,DB 4,'MY_RUN COM',21 DUP(?)
定义一个D盘上文件名为MY_RUN.COM的文件控制块
二、实现方法
下面给出两段程序,一个是安装程序,另一个是检验程序。工作过程简图如下:

硬盘 内存 软盘
┌──────┐ ┌──────┐
├──────┤ ① ├──────┤
│ 目录区 │←──────────────┤ │
│ 首簇号 ├─┐③ ┌──────┐ │ 安装程序 │
├──────┤ └─→│ 缓冲区 │ ② ├──────┤
│ 数据区 │ │ │←──┤被加密的文件│
│被加密的文件│←───┤被加密的文件│ │(含检验程序)│
│(含检验程序)│ ④ │(含检验程序)│ ├──────┤
├──────┤ ├──────┤ │ │
│ │ │ │ │ │
└──────┘ └──────┘ └──────┘
①通过安装程序将软盘上被加密的软件拷贝到硬盘上,这样可以在硬盘的目录区中产生一个目录项,并给该文件确定一个首簇号。
②将软盘上的被加密的文件送入到内存缓冲区中。
③把硬盘上的被加密的文件的首簇号送入到内存缓冲区被加密的文件中的指定单元。
④把内存缓冲区中的被加密文件的内容再保存到硬盘上被加密的文件中。
三、一个演示实例
;****MY_INST.ASM****
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 100H
BEGIN:
MOV DX,OFFSET DIME_2;打开A盘上MY_RUN.COM文件
MOV AL,2
MOV AH,3DH
INT 21H
PUSH AX;保存文件句柄
MOV BX,AX
MOV CX,0FFF0H
MOV DX,OFFSET DIME_0;把A盘上MY_RUN.COM读到内存
MOV AH,3FH
INT 21H
POP BX
PUSH AX;保存文件句柄
MOV AH,3EH;关闭文件
INT 21H
MOV DX,OFFSET DIME_1;在D盘上建立MY_RUN.COM文件
MOV CX,20H
MOV AH,3CH
INT 21H
PUSH AX;保存文件句柄
MOV DX,OFFSET DIME_0
POP BX
POP CX
PUSH BX
MOV AH,40H;将内存中MY_RUN.COM内容写入到D盘MY_RUM.COM
INT 21H
POP BX
MOV AH,3EH
INT 21H;关闭文件
MOV DX,OFFSET DIME_3
MOV AH,1AH;设置磁盘传输地址
INT 21H
MOV DX,OFFSET DIME_4
MOV AH,11H;查找目录项
INT 21H
MOV DX,OFFSET DIME_1
MOV AH,3DH
MOV AL,02H
INT 21H;打开文件
PUSH AX;保存文件句柄
MOV BX,AX
MOV AX,4200H
MOV CX,0
MOV DX,WORD PTR DIME_5;移动文件指针到MY_RUN.COM的指定单元
INT 21H
POP BX
MOV AH,40H
MOV DX,OFFSET DIME_3+1BH;缓冲区第26、27字节为该文件在硬盘的首簇号
MOV CX,2
INT 21H;把MY_RUN.COM文件的首簇号写入到文件中
MOV AH,3EH
INT 21H;关闭文件
MOV AX,4C00H
INT 21H;返回DOS
DIME_0 DB 7000H DUP(?);开辟一个数据区,存放被加密文件
DIME_1 DB "D:MY_RUN.COM",0
DIME_2 DB "A:\MY_RUN.COM",0
DIME_3 DB 40H DUP(?);保留40H字节的内存缓冲区
DIME_4 DB 4,"MY_RUN COM",21 DUP(?);文件控制块数据形式
DIME_5 DW 0064H
CODE ENDS
END BEGIN

;****MY_RUN.ASM****
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 100H
BEGIN:
JMP START
DIME_1 DB 40H DUP(0);保留40H字节的缓冲区
DIME_2 DB 4,"MY_RUN COM",21 DUP(0);文件控制块数据格式
DIME_3 DB 0,0
START:
MOV AH,1AH
MOV DX,OFFSET DIME_1;设置数据传输地址
INT 21H
MOV AH,11H
MOV DX,OFFSET DIME_2;查找目录项
INT 21H
MOV DI,OFFSET DIME_3
MOV SI,OFFSET DIME_1+1BH;目录项第26、27字节为该文件首簇号
MOV CX,2
CLD
REPZ CMPSB;比较该文件在D盘中实际首簇号与该文件DIME_3单元的值是否相等
JZ EXIT1 ;相等,转
MOV AH,09H;不相等
MOV DX,OFFSET MSG2;警铃提示
INT 21H
MOV AX,4C00H;终止程序运行,返回DOS
INT 21H
EXIT1:
MOV AH,09H
MOV DX,OFFSET MSG1;显示正确信息,继续运行程序
INT 21H
MOV AX,4C00H
INT 21H
MSG1 DB "Copyright Is Good",0DH,0AH,'$'
MSG2 DB 07,07," Copyright Is Invalid",0DH,0AH,0DH,0AH
DB "COPYRIGHT BY 607 SOFTWARE GROUP 1999",0DH,0AH,'$'
CODE ENDS
END BEGIN
本文的两段程序MY_INST.ASM和MY_RUN.ASM,在TURBO MASM V2.0下编译、连接生成COM文件,DOS6.22下调试通过。
四、使用方法
使用时将含有MY_INST.COM和MY_RUN.COM的文件的软盘插入到驱动器A中,运行MY_INST.COM文件把软盘上的MY_RUN.COM拷贝到硬盘(如D分区)的当前目录下。&127;当在硬盘上运行MY_RUN.&127;COM文件,&127;&127;如果检验程序提示“COPYRIGHT IS GOOD”表示该程序是通过软盘上的安装程序MY_INST.COM安装到硬盘上的。如果通过COPY命令或其他工具将软盘上的MY_RUN.COM拷贝到D盘上运行,&127;则检验程序警铃提示&127;“Copyright &127;Is &127;Invalid”&127;&127;,“COPYRIGHT BY 607 SOFTWARE GROUP 1999”,表示该程序是通过非法拷贝得到的。
五、结束语
最后,想要说的是,上述介绍的方法只是一个演示的例子,旨在起到抛砖引玉的作用。具体应用中用户可以把检验程序MY_RUN.COM嵌入到自己想要加密的软件中,安装程序使用MY_INST.&127;COM。为了更好对软件进行保护,通常还应考虑以下方面的问题。①为了加强安全性,可以在被加密的软件中多处设置“首簇号”来进行检验。②为了防止复制安装程序,可以在安装程序本身所具有的功能完成后,把自身销毁。可采用向其中填写杂乱无章数据的方法,来破坏安装程序的功能。③可以结合在安装软盘上制作密钥技术,当被加密软件或安装程序运行时检查软盘的密钥,这样也可以防止对安装程序的复制。

相关文章:

  • 如何永久关闭win10更新
  • 利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验
  • 关于指针和内存的几个问题
  • 使用STM32CubeMX配置STM32串口
  • 浅谈C++函数的参数
  • 使用STM32CubeMX新建Keil工程
  • 使用QT新建工程并成功编译
  • 旅游整理
  • 简单几步向Android Studio导入Eclipse工程
  • Xmind免费安装使用教程
  • 今天日志
  • Ubuntu下JetBrains 系列软件的免费安装教程
  • 笑傲江湖与三层交换、路由......
  • 清华镜像源安装tensorflow
  • MSNShell效果,来个养眼的......
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【知识碎片】第三方登录弹窗效果
  • Android 控件背景颜色处理
  • java2019面试题北京
  • Java到底能干嘛?
  • Java教程_软件开发基础
  • Redis字符串类型内部编码剖析
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • WebSocket使用
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 反思总结然后整装待发
  • 给第三方使用接口的 URL 签名实现
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 推荐一个React的管理后台框架
  • 携程小程序初体验
  • 走向全栈之MongoDB的使用
  • #include
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (12)Linux 常见的三种进程状态
  • (31)对象的克隆
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (十六)串口UART
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转载)从 Java 代码到 Java 堆
  • (轉貼) UML中文FAQ (OO) (UML)
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .“空心村”成因分析及解决对策122344
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net反混淆脱壳工具de4dot的使用
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .Net中间语言BeforeFieldInit
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /etc/sudoer文件配置简析
  • @property @synthesize @dynamic 及相关属性作用探究
  • @SentinelResource详解
  • []串口通信 零星笔记