g3 I9 [' N% n! F/ i$ z
! w" L4 y. o: R4 x- A6 |" t 软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 , H% d, J6 U' X: ^6 A
一、通过改变文件时间来限制软件的试用次数 ( j5 n/ ^: g+ R" Q0 C
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
二、示例程序中所涉及的中断
1.中断21H的功能3DH
用途:打开文件用于读。写或补 充。 ( w8 _- T6 @) w
调用寄存器:AH=3DH,AL=00H,DS
X=文件名; 9 _* n2 h7 q4 k* z+ L# \5 j
返回寄存器:CF 复位--成功,AX=文件把柄。 7 u% E% q4 g. \& z7 u
CF 置位--出错,AX=错误代码。 + c) c( ~7 X n2 j* j) D# X
2.中断21H的功能3EH
用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
调用寄存器:AH=3EH,BX=文件把柄;
返回寄存器:CF 复位--成功,AX被破坏, % X( _: z1 J) J0 |, k
CF 置位--出错,AX=错误代码。
3.中断21H的功能57H、子功能00H 3 n8 n5 H/ i, v# p" y
用途:读出文件被最后修改的日期和时间。
调用寄存器:AX=5700H,BX=文件把柄; 0 W9 U) e z* U, C) J
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
CF 置位--出错,AX=错误代码。
4。中断21H的功能57H、子功能01H 6 z* l3 o2 o% c# j
用途:将文件最后被修改过的日期和时间信息变 成指定值。
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; , r6 W: T2 I+ O/ D/ K) x$ z
返回寄存器:CF 复位--成功, 9 a' ?# M7 U) Y$ z- D4 O% \2 T
CF 置位--出错,AX=错误代码。 & i* G. e8 G, _
三、示例程序
#include <sidio.h>
#include <dos.h> $ p+ b2 p7 {# r! V+ A
#include <conio.h>
int count( )
{ ! c H/ s, g2 \( L
union REGS inregs,outregs;
strut SREGS segs; 5 O: ]' l4 [: ^: k2 s
unsigned handle; ) I/ D: Z2 P4 V1 I. {8 ]: E
unsigned times;
/ * 打开文件 * / ) t8 \3 P; x. g c
inregs.h.ah =0x3d; 9 h3 O& z; r4 Z0 g
inregs.h.al =0; _1 }( N6 x! j
scgread(& segs); . D( l- t' I% H# W
inregs.x.dx ="test.exe"; " {2 A) [+ S9 z( Q( N2 y; a2 F
intdosx(& inregs, & outregs, & segs);
if(outregs.x.cflag) return(0); 3 O' j% {" S" |& R
else
{ 5 Q Q) Z1 I4 {, H
/ * 读取文件日期时间 * / " U' _; A( I2 ]9 R! {# X4 o1 O
handle = Outregs.x.ax;
inregs.x.ax = 0x5700;
inregs.x.bx = handle;
intdosx(& inregs, & outregs, &segs);
times = (outregs.x.cx &0x7e0)> > 5;
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * /
{
inregs.x.ax = 0x5701;
inregs.x.bx = handle; % z7 c! N5 |$ [1 ]. n2 X
inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / # ]# B8 S# X/ t! H8 b! y/ a* N
inregs.x.dx = outregs.x.dx; ) T8 u, M- p3 l
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
return(2);
} * {1 ~9 P- o0 d" W* a3 r, }9 P
else return(1);
/ * 关闭文件 * /
inregs.h.ah = 0x3e; , s1 T6 J0 B. [& F4 H T
inregs.x.bx = handle;
intdosx(& inregs, & outregs, & segs); ?) k% v1 Y3 D! L6 t& j% K
} 0 a2 i: d* q1 I, h; e6 w* T9 M6 |7 ~
} + u% B: L7 P; C7 |& x3 X( ]
main()
{ ) t2 O% f* I k/ W$ T% b; z9 x
int flag; # ~* _1 f8 k, d
flag = count();
if(flag==0) printf("此软件为试用版,请勿任意修改!\ n");
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n");
if(flag==2) printf("此软件为试用版,欢迎试用!\n");
}
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |