|
) @' z, j2 P1 N% ? U) N# J }
0 O( y3 Y0 g) z7 c# T8 { 软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
* S+ y6 N. A. ]1 q一、通过改变文件时间来限制软件的试用次数 6 {' V5 K, s" A o9 r# S
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
. S! d+ x/ T7 Y' T4 f二、示例程序中所涉及的中断 $ x% L! S, @! Q* ]# a" O
1.中断21H的功能3DH
5 n( w- \5 j" l: u# G8 g 用途:打开文件用于读。写或补 充。 3 }' O$ G; S- W& x
调用寄存器:AH=3DH,AL=00H,DS X=文件名;
+ R4 }! d$ p5 ~# [ U" |7 s0 X+ b 返回寄存器:CF 复位--成功,AX=文件把柄。
% i {$ {* u% b: J% _ CF 置位--出错,AX=错误代码。
6 h* J. r9 T' N, r0 n/ j4 P 2.中断21H的功能3EH % Y. ^$ d* B' g) ?+ @+ S1 ?
用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
( [. c0 ^0 t7 N# l, u, j. f 调用寄存器:AH=3EH,BX=文件把柄;
! o. a; d. J1 }. }* e4 c 返回寄存器:CF 复位--成功,AX被破坏,
: O' c5 C; y& H$ A8 _: R( T& K CF 置位--出错,AX=错误代码。 . P" g/ w0 v/ O( k! x
3.中断21H的功能57H、子功能00H * O+ c& W' Q# ~& a1 L& X; [
用途:读出文件被最后修改的日期和时间。 / A" M; L$ j9 w2 Y8 }$ Q
调用寄存器:AX=5700H,BX=文件把柄; 7 f# U- Q3 ]' X3 n
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
$ {1 H4 @& E% M9 X( E) ]# Z- P CF 置位--出错,AX=错误代码。 # N' e# {3 [8 m
4。中断21H的功能57H、子功能01H
$ i6 i1 K# F* i 用途:将文件最后被修改过的日期和时间信息变 成指定值。 + Z! k: }! h1 Q$ B2 B+ m
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
- e5 ?) T% @+ Q: \ 返回寄存器:CF 复位--成功, 2 A+ ^ y* J4 N; _: O/ L0 L' I' X
CF 置位--出错,AX=错误代码。 # I W1 u2 Q t' M: \, p2 F
三、示例程序 * ?+ S2 ]8 v' _# z0 y+ D
#include <sidio.h>
, Y2 m' w' X* Q5 x#include <dos.h> , W$ e8 I7 a/ h4 }, S) U; X4 R7 q
#include <conio.h>
& J' l* z( J2 |; a Pint count( ) 1 ^5 k( Q5 ~" n) t" \5 e
{ 4 s+ F( ?# O, {' \
union REGS inregs,outregs;
8 }# i0 i: ~3 ~5 B6 p. g strut SREGS segs;
* U( \" D& V ]7 ? unsigned handle; . U1 X5 J* ], C9 H K
unsigned times;
" F2 t6 r* m# _: g / * 打开文件 * /
( F, q. g" s% P4 m inregs.h.ah =0x3d; g8 y; W/ d: a4 U# w7 V1 b* h
inregs.h.al =0; 9 W3 p% k/ M" ?" M
scgread(& segs); ( J$ V7 R) w; ]9 L
inregs.x.dx ="test.exe";
: \) G8 D+ V: ]. d3 S, k9 W intdosx(& inregs, & outregs, & segs); - }) d0 r' E3 W' |. G) L+ b$ K" u
if(outregs.x.cflag) return(0); 9 i+ V g8 A7 R& H
else
y1 ~1 K$ @# ~* B* D% | { . M$ R* p- p; B( ~* r- }
/ * 读取文件日期时间 * /
1 O& W% A: c3 x# I1 `& t handle = Outregs.x.ax;
1 A. A4 r+ ~7 S1 L inregs.x.ax = 0x5700; 0 U9 o( R ^- b+ E9 q
inregs.x.bx = handle;
$ {9 p# W0 @9 S6 h# s intdosx(& inregs, & outregs, &segs);
( i+ n0 b) W/ {% m1 u times = (outregs.x.cx &0x7e0)> > 5;
2 h5 V8 ] R& e5 |: ~ if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / 7 l' V2 ]. e3 j7 l
{
' I, F$ ^ j' o9 l( _ inregs.x.ax = 0x5701;
: w3 j$ E6 n1 I$ U inregs.x.bx = handle;
# x; M& R; p3 ?) z' e$ E inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / 3 ^8 m d; n4 k u
inregs.x.dx = outregs.x.dx; # m5 }# C! p) b F& J1 V% K
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / " ~4 a% y) J, y2 `) \" A: N
return(2);
% B; L/ R7 r0 T) W1 M1 o N9 }+ M; w" v }
7 E8 n( i/ R) \ \" b; }* q else return(1); * x3 d4 q' l/ z3 U: s* s
/ * 关闭文件 * / * R" ~9 \* c. W8 Q- \# N
inregs.h.ah = 0x3e; 9 f6 |' I+ p( ]- `+ e
inregs.x.bx = handle;
% C/ r/ s& k. }- ~- q7 `8 l/ ? intdosx(& inregs, & outregs, & segs);
7 O" [" Z+ |& n4 d# Q. @7 b }
4 G! r; B- P3 j( j( d5 z} * `2 ~ E5 Q& J( M/ n; B& ~
main() , s: X7 Z6 s% {* h8 _
{ ) ?! d! B9 Z6 Z$ _( R
int flag; 2 J6 R* j8 E+ F- `
flag = count();
, `+ B j* y- O5 B9 Q if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); ; b. j6 x) e# w& E% c- _
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 4 N+ X1 M9 o- c* D* C
if(flag==2) printf("此软件为试用版,欢迎试用!\n"); 7 q7 Z9 w+ a) x; D7 \
}
1 L+ Q, f. {- h0 N |