|
9 G( S& V! Z; U # u- a8 c/ n2 \9 H+ a4 n
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 * x; D9 K' o' ^ {7 j, u! d5 q. D3 Y! t
一、通过改变文件时间来限制软件的试用次数
; h H6 g9 l7 t 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
7 _$ H3 W( d# A: s5 v/ S3 p二、示例程序中所涉及的中断 6 i& c- U# A& n8 M# n/ U/ n
1.中断21H的功能3DH 6 z; ~/ h& p8 s/ m
用途:打开文件用于读。写或补 充。 % b' I+ J/ W+ I! j" e
调用寄存器:AH=3DH,AL=00H,DS X=文件名; : W$ o! W: {, r
返回寄存器:CF 复位--成功,AX=文件把柄。 - o. e: b: M% ^& ]0 B' \' p, d. C
CF 置位--出错,AX=错误代码。
6 K. c8 B% y: j( ]( ~1 ?, F, K5 Y* X 2.中断21H的功能3EH
. G+ v6 A2 H- N- P$ ~9 [ 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
$ O: B1 q* w3 g& v% L" z! G 调用寄存器:AH=3EH,BX=文件把柄; 8 d2 [9 ^, n# v, d$ p# N' n
返回寄存器:CF 复位--成功,AX被破坏,
7 i& I' I0 a" X0 _' }& Z CF 置位--出错,AX=错误代码。 $ P- I' c8 A2 Q9 K6 X ?
3.中断21H的功能57H、子功能00H 9 e. c4 s- E" v. ^$ v) P; [
用途:读出文件被最后修改的日期和时间。
$ L; `# Y% I4 q/ _& m$ O% U8 ]2 o1 F 调用寄存器:AX=5700H,BX=文件把柄; 1 ?: A" t7 U+ d
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, # @! I7 @( W5 U6 g0 `
CF 置位--出错,AX=错误代码。 % N# x$ @" |/ Z+ |7 y2 J
4。中断21H的功能57H、子功能01H
" J+ f6 N# t# j; l, Y! }6 k+ e 用途:将文件最后被修改过的日期和时间信息变 成指定值。
7 A; B7 Q# d; d+ ~ 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; ; I9 P* Z T$ a& y
返回寄存器:CF 复位--成功,
2 B8 {& G# C Q1 A) i0 d CF 置位--出错,AX=错误代码。
* `# j0 ~ w) `6 }: [6 f三、示例程序
; p$ S' f# }, B' q7 q#include <sidio.h>
4 T3 G7 q: b0 Y2 R! O#include <dos.h> # Q: g5 {/ W5 S% A9 y
#include <conio.h>
5 h$ H. o. d! M7 J/ R, Mint count( )
5 ?. Y, \& I! W0 y{ 5 W# T: g* e$ K0 Z0 K/ Z* a
union REGS inregs,outregs;
( a2 f. i) D; D" {* z4 G( ?; | strut SREGS segs; / W3 i, q9 O) u# N: R
unsigned handle; 7 l8 y& h l, b7 J# T6 t! J: a
unsigned times;
5 P" W1 H7 U& s+ c' n6 O& ] / * 打开文件 * / 5 M, A) K6 H$ Y8 F5 K! e/ Z+ |$ ^& m
inregs.h.ah =0x3d;
& A7 ^( {$ Y2 h# M' x+ H3 ` inregs.h.al =0;
! H7 V2 h% Z6 }2 Y l scgread(& segs); 3 \- r0 e/ N2 j p4 Q( O1 s7 X' d# \
inregs.x.dx ="test.exe"; / E7 ]) c- y, c. O) t6 {9 l) I
intdosx(& inregs, & outregs, & segs);
( b( `+ M3 t" H0 l7 h if(outregs.x.cflag) return(0); 9 A( A4 K+ v$ x# v) X4 o: {
else * j) i. X" c9 o" T
{
* f$ H0 Q0 j4 R4 G8 T# e / * 读取文件日期时间 * /
* b; P8 E$ H' T8 J A6 T handle = Outregs.x.ax;
/ V2 m3 O; I* _7 ]' e inregs.x.ax = 0x5700;
% _. w$ j- n) H; l0 C; l( Y inregs.x.bx = handle;
1 J% X8 @4 _9 n# M intdosx(& inregs, & outregs, &segs);
' q+ B; k" R. ~% D times = (outregs.x.cx &0x7e0)> > 5;
5 w; O$ t5 S% r) n6 L2 L3 _ if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / ) S e" D7 i/ y" l
{
; G8 } ^; p; I) Z* g4 l inregs.x.ax = 0x5701; $ I3 a5 @* E w, i" a& m5 Z0 y" Z. {
inregs.x.bx = handle;
- K/ w6 `5 S: ?2 Y$ ]" c inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / 7 i; ^; ` n# c3 l* r
inregs.x.dx = outregs.x.dx;
8 A2 b4 h* q, O0 E0 S! ~ intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
% O& k3 K; h5 F$ ]7 ~. Y return(2); 6 G3 N# t- L/ m/ v' i# ?$ o& q
} " t8 {# v/ V( X5 E; l3 H- M! O
else return(1);
" [$ i3 o4 Y( L, W. ~: j( n / * 关闭文件 * /
@% P G `! B @4 X( _- ?& L. D5 ^ inregs.h.ah = 0x3e; - r1 Y3 E3 G/ a4 M+ a
inregs.x.bx = handle;
' \4 l+ c5 q6 ] X intdosx(& inregs, & outregs, & segs);
+ A# @ P+ S+ e8 b" ]' C }
0 M$ B5 l, C% W( k* |, q$ `4 w}
, ^+ J# o' l: S2 ~. `) lmain()
+ r. T5 S4 X ?' f* v{ 0 N2 Q- M" S2 i; [0 R
int flag; 2 r! R) r% i- C8 R% O5 K
flag = count();
+ f4 k# \- }8 [) F t if(flag==0) printf("此软件为试用版,请勿任意修改!\ n");
8 T3 d/ r) a' z4 Z if(flag==1) printf("此软件为试用版,您的试用次数已满!\n");
# g0 R# m! t! _0 C) u' L6 A4 H if(flag==2) printf("此软件为试用版,欢迎试用!\n"); 3 [0 ^* o% G6 G. O/ V
}
; h, x) _ U8 S |