|
( i6 v V- e# c. E3 k % S7 G! l4 K! c1 v. ~) W
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
! E* [7 `5 E5 B: f一、通过改变文件时间来限制软件的试用次数
( e- Y' z; ?9 M 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。 # u) Z( @0 L+ y l( n, @% U) v
二、示例程序中所涉及的中断
; `+ r g d$ b1 N" d C: F1.中断21H的功能3DH
% b9 r) r6 ~; k5 \7 ^ 用途:打开文件用于读。写或补 充。 3 B. Z; `8 I' e
调用寄存器:AH=3DH,AL=00H,DS X=文件名;
2 S% |1 _2 G' ^7 m4 [ 返回寄存器:CF 复位--成功,AX=文件把柄。
1 Y4 A/ r8 a, q* F$ F9 ?7 i CF 置位--出错,AX=错误代码。
" v2 p' H& S) E' `+ ?4 ^4 n 2.中断21H的功能3EH
8 ~* I! F" O; Y) ^( ]+ G* W: X 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 ( H. A- g1 r8 H# u8 x
调用寄存器:AH=3EH,BX=文件把柄; 3 Y" X3 o: K) J; G) B) r. E; B
返回寄存器:CF 复位--成功,AX被破坏, ( C" x! p& x! I6 s& ^3 `
CF 置位--出错,AX=错误代码。 7 b0 a2 i3 S A+ u
3.中断21H的功能57H、子功能00H
3 i7 T/ U( ~* V4 G, ~5 P 用途:读出文件被最后修改的日期和时间。
6 X6 @2 b: F. z+ I0 D 调用寄存器:AX=5700H,BX=文件把柄; % G5 g% v+ B5 _! l0 |5 R
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
0 S2 t. [; a ~8 ] CF 置位--出错,AX=错误代码。 % p/ e y/ j9 N3 s. l$ \- F3 P$ |8 L
4。中断21H的功能57H、子功能01H
# k- M. O( [: B& S4 F \, G6 e5 N: _ 用途:将文件最后被修改过的日期和时间信息变 成指定值。
, ?3 T# ^: l. D, P% O 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
s; Z' B8 h% L! e( [8 h 返回寄存器:CF 复位--成功,
# i4 H9 }' t/ V! U; C9 p0 c+ u; s CF 置位--出错,AX=错误代码。
- o! J) W7 e& B+ G$ B三、示例程序 - n2 U* }+ E5 R3 U& o5 k1 T
#include <sidio.h> ! m: K' F9 z4 e+ w) |: h# g# w" U ^
#include <dos.h>
7 }4 W: B# }4 M( T#include <conio.h> ( ]+ q- `- ~9 B3 O
int count( )
* |% l$ R; s4 u; h! N{ $ {' \* A: i: N! o U \
union REGS inregs,outregs; . c9 y, @& S- _5 a5 B8 c5 W
strut SREGS segs;
' j' }" r! B; l; z+ F unsigned handle; ' P( c' a: K- x2 I5 f) S9 |: d
unsigned times;
, s2 K3 H+ e% l# O / * 打开文件 * / & d3 E" P% b: h
inregs.h.ah =0x3d; . A! _, l0 e) _5 a: q
inregs.h.al =0; 0 a* Q% g( ^4 o a- S
scgread(& segs);
) f$ E/ p9 _/ Y6 W7 s inregs.x.dx ="test.exe"; 5 ~9 o# m/ g* z, F
intdosx(& inregs, & outregs, & segs); % z9 P' b, y& b$ f
if(outregs.x.cflag) return(0); + t- U0 M" A" [% q. ?
else
4 Z/ s; f% ]0 n1 e8 q {
0 a& |/ _4 D, p2 j9 g+ p$ V / * 读取文件日期时间 * /
O; [8 A$ R/ h) x4 N) L handle = Outregs.x.ax; . Z$ j5 P0 L$ l$ w0 N" F6 i
inregs.x.ax = 0x5700;
$ ~& W* B+ o3 }3 \ inregs.x.bx = handle; ' D2 I& F2 i5 L2 ~& Z
intdosx(& inregs, & outregs, &segs); ! w& e7 J% R$ ~$ Z- M2 k
times = (outregs.x.cx &0x7e0)> > 5; ! i8 T3 O% B. p+ B4 Z& Q' A" X; m$ Q
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * /
8 Y" K4 ~6 o! O: ]4 D2 \ { $ n! m i" Z* v9 s' R$ S/ B! h* w$ s' A
inregs.x.ax = 0x5701; 5 ^. t3 g( g. e6 h# S5 ^+ s) l# b! V
inregs.x.bx = handle;
( Q7 {6 O3 U J+ U- L inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / ' |- ? P+ P" b% {7 Q* {
inregs.x.dx = outregs.x.dx;
: e6 j/ A P3 z6 @# q1 G intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
2 ?/ X# B5 c0 @4 _1 h return(2); : B! Y* n- M8 m$ I! q2 N1 e6 C- D
}
- ~8 ]! o* Z& E else return(1);
; X5 e- H( c. F- S$ }9 l$ T" R / * 关闭文件 * /
- H$ u: {/ y6 X3 F+ @8 O6 L inregs.h.ah = 0x3e; & A, C1 C% M. ], {
inregs.x.bx = handle;
* y7 [6 Y2 R+ d, p( | R intdosx(& inregs, & outregs, & segs);
5 F0 \# c6 B3 e( \9 x } 0 T' _) G2 c) p/ e' M
}
9 D6 ]! b7 N. M2 z' J! h8 Omain() 9 E3 b3 H/ S& C' \
{
: `5 Q) _8 r0 V- i; R3 ~/ ]7 l int flag; , y. {6 i1 y+ p3 K
flag = count();
: f) X$ C, x- T$ _* M if(flag==0) printf("此软件为试用版,请勿任意修改!\ n");
) |4 U0 A& O6 b& { if(flag==1) printf("此软件为试用版,您的试用次数已满!\n");
1 |: i; g0 V0 Z2 { if(flag==2) printf("此软件为试用版,欢迎试用!\n"); / N; f% g6 A* I3 z3 z e- Z
} * B( |; Y' _2 U, p
|