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

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 shawls 的 blog

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

每个用户都不希望自己开发的软件被别人轻易的拷贝使用,自然而然崐想起了要对软件进行加密。本文主要介绍一种通过安装程序来拷贝软件,崐防止软件非法拷贝的方法。经过实践证明这种方法非常适用于需要把软件崐安装到硬盘上才能使用的情况。
一、工作原理
通过在被加密的软件中设置一个特殊的单元,由一个安装程序将被加崐密的软件装入指定的硬盘(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下调试通过。
四、使用方法

本文关键:安装程序软件,非法,拷贝
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top