|
; O( L; \% e, H9 B! ~$ S
! c0 T) N% R" H' J% P! ?. k
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
, ~7 d; L/ a' x. l; @+ b一、通过改变文件时间来限制软件的试用次数 7 U( L0 f" x/ Z$ j+ q, X# f
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
& [( E( b% `( H& v) R二、示例程序中所涉及的中断
' D: [- w" B2 r1 Z& X1.中断21H的功能3DH
: V) b: F' c& B 用途:打开文件用于读。写或补 充。 ; s7 z9 `8 R" G' s# Z3 F' X7 l! b
调用寄存器:AH=3DH,AL=00H,DS X=文件名;
% b/ _) A H9 V% X' Y* G: h1 I, b/ i 返回寄存器:CF 复位--成功,AX=文件把柄。
7 b2 }/ H h* H/ ~/ _, l1 f CF 置位--出错,AX=错误代码。 - D, {# B5 v0 b
2.中断21H的功能3EH
( o I. C0 ~9 h' D# Q, ^2 `& ?& L7 ] 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 ( A8 A" L; `3 w& S
调用寄存器:AH=3EH,BX=文件把柄;
' o5 X( K' ~ A% Y1 c 返回寄存器:CF 复位--成功,AX被破坏,
% t3 P7 V; ~! { CF 置位--出错,AX=错误代码。
1 z- ^* q& }) F* W, s* m& a 3.中断21H的功能57H、子功能00H
* v7 ]; V( E- X C 用途:读出文件被最后修改的日期和时间。 * ^7 M8 O, n: d* Y3 K& G5 T
调用寄存器:AX=5700H,BX=文件把柄;
7 p$ z# J5 W$ f' l7 M) B 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, # j- }8 N9 U, a
CF 置位--出错,AX=错误代码。 & D- V+ a1 \* I' [9 {
4。中断21H的功能57H、子功能01H * q. ], L7 f5 M) _) S; v! W, x
用途:将文件最后被修改过的日期和时间信息变 成指定值。
6 U( j3 B1 F$ R0 ]! w 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
( a$ Q- |6 T9 ] w6 B1 Y' ?5 X 返回寄存器:CF 复位--成功, 2 n8 D6 S4 H9 f" N, U
CF 置位--出错,AX=错误代码。 ) y, Q+ o* t8 c0 l ] |; n
三、示例程序 8 k) \( T3 M/ R+ I" e1 v6 ]! N0 A
#include <sidio.h>
: D: t0 U( N) F& X* \/ f- i#include <dos.h> / ~1 `! x; A: T
#include <conio.h> 6 u$ N3 M, G% j6 T% q7 C P% U
int count( )
) M' J" F5 F2 n1 X2 H* }{
1 J5 w$ ?7 R' @4 W* o0 p/ t6 y5 } union REGS inregs,outregs; 2 ?, k# K! ?0 ^6 J/ c# d
strut SREGS segs;
/ ]) s3 S5 Y; ?. ~) Z unsigned handle; * ]7 Z% v. b1 J$ U
unsigned times; ' h7 S* U9 E6 f5 C; _9 j( H
/ * 打开文件 * / ) R9 R' Z4 a+ I
inregs.h.ah =0x3d;
# N& `8 f5 ?6 G* E3 Y inregs.h.al =0;
3 a' W6 u! Q6 }3 j7 h- L scgread(& segs); ' ~! y- n! ^" z7 E
inregs.x.dx ="test.exe"; ; {0 X. J4 Q; J& k& i; t$ a9 n
intdosx(& inregs, & outregs, & segs);
) K7 J$ [ f4 V- | if(outregs.x.cflag) return(0);
" U% h( f; U4 S* H4 l8 ^# } else
5 S/ ^6 t9 R) h* R2 B- | {
) B# `# a) Y0 T% U. h) y; Z / * 读取文件日期时间 * /
0 u# ^' o$ k0 v; P& y* k5 h handle = Outregs.x.ax; 5 }/ v7 u8 f6 K/ t; q. j" y6 X
inregs.x.ax = 0x5700; a1 V9 [/ X+ I, G4 _6 ?
inregs.x.bx = handle; & ^ H, R6 f- v; X+ B
intdosx(& inregs, & outregs, &segs); * v* V- Z1 ^ c6 g1 H* ^0 i+ H0 m
times = (outregs.x.cx &0x7e0)> > 5; 1 L* j2 ~: z% A3 s/ c0 R& G8 \; @
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * /
0 |9 S' n3 c, t: Z. F3 W/ j3 R {
0 C- k8 U/ O! `( | inregs.x.ax = 0x5701;
! R( [7 X b& q6 F$ h3 P L) Y inregs.x.bx = handle; ' e( X! C+ D6 k* N
inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * /
4 |& ?4 z& h$ h8 P: y1 r: J8 B Q; A, ] inregs.x.dx = outregs.x.dx; ! n2 \; ^( W1 }* X# V, `: w- q
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / # d+ a9 m; y+ M
return(2); 3 c4 L* P3 E0 J) C' v2 e
} " U$ I+ {. |/ ^3 Q
else return(1);
1 l6 z5 |6 ^( d. R5 B / * 关闭文件 * / ; ?! n7 @2 x# r) d0 ~1 Z
inregs.h.ah = 0x3e;
# }. P/ l# a$ o3 c inregs.x.bx = handle; ; J; u7 [6 C! v8 ^
intdosx(& inregs, & outregs, & segs); 1 y, M A3 |3 h# ]# a$ Y8 m
}
: ~+ f- I$ O6 r" p6 J& l3 t}
# ^+ A' x# x6 W2 w$ t; L* A- h- Mmain() 0 S2 z8 K, b' Z% W3 `! y1 k! j. p
{ ! y# \; q* r0 l' A
int flag; . D" A1 z+ T& R0 F* u1 O
flag = count(); 0 S; w4 z6 u$ c+ S& V8 e% `( t
if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); 4 j J9 r& d; b1 I0 a* V6 \
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 6 N7 M, a" c" \! C
if(flag==2) printf("此软件为试用版,欢迎试用!\n");
& @. B1 H' z9 W" _- k9 L. r} 6 ]3 u: m- j7 T6 [
|