|
h5 y: {) N( p$ ]2 Y / Z$ t+ p. Q* T0 j& Y5 Y
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 w' e, {3 S1 ?! O: Z* h
一、通过改变文件时间来限制软件的试用次数 5 R' y# ~& H1 f8 ~
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
. P; \9 l6 q6 n* y2 @1 H3 B( A1 [二、示例程序中所涉及的中断
2 o, O" ?+ ~: O1.中断21H的功能3DH
3 U- v4 d; c! u8 i# J! P 用途:打开文件用于读。写或补 充。 , b9 q' ]; `& v! O Q; u" k
调用寄存器:AH=3DH,AL=00H,DS X=文件名; e* G. X# l* c& _4 p1 C
返回寄存器:CF 复位--成功,AX=文件把柄。 P; h- Y5 z; R( X/ k$ a0 |: V
CF 置位--出错,AX=错误代码。
+ u) L5 r8 i7 P; Q0 Z( r# h# f 2.中断21H的功能3EH
. A% Y& ^* S3 g6 Q, i 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 " ^7 C3 M9 Q& Y- G" }
调用寄存器:AH=3EH,BX=文件把柄;
3 t4 p `$ \ Q; f" ^+ O$ ~ }, `; t 返回寄存器:CF 复位--成功,AX被破坏,
+ |0 i" X6 X: W3 U0 d- x7 O CF 置位--出错,AX=错误代码。
d& a2 D" [/ {5 q( U 3.中断21H的功能57H、子功能00H 9 F$ s! q0 F& P, P7 C
用途:读出文件被最后修改的日期和时间。 1 J& |' n8 ] h$ x
调用寄存器:AX=5700H,BX=文件把柄;
! W$ X. e5 j$ j6 Y+ k 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
8 L5 Q5 X' G0 v( x# K: A CF 置位--出错,AX=错误代码。
4 Q( F+ e3 m, F+ ]" W4 D 4。中断21H的功能57H、子功能01H
* w. @+ d4 b5 c 用途:将文件最后被修改过的日期和时间信息变 成指定值。
0 P# h- q& C3 A. u! p3 T" N6 l 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; 9 d: |# X1 @: i B1 j
返回寄存器:CF 复位--成功, ; q% K! x7 C+ S' q/ a
CF 置位--出错,AX=错误代码。 * j; `) x* h" g) q7 v/ J0 ~
三、示例程序 3 ~) Z- Q J' v
#include <sidio.h> 7 V( x5 b& D7 T+ y7 E4 w; o" P
#include <dos.h>
3 [) R9 j. G3 k) g. s/ Z7 M#include <conio.h> ; X y& N% Z z1 U! z; q7 _( ~
int count( ) ! v: y3 v8 |' ^* C5 r
{
/ T \$ D# S' J, c union REGS inregs,outregs; # V/ @% u, C7 ?! S3 y; P/ b4 N5 }
strut SREGS segs;
* K7 Q! ~. x4 V6 K unsigned handle;
2 M$ U ?7 k1 }# n& Z unsigned times; % [0 y* g2 S) Z- X7 Y
/ * 打开文件 * / 5 I9 ]& G0 O/ v( V' j+ Q$ T
inregs.h.ah =0x3d;
$ j, u- I4 v, x( c inregs.h.al =0; % F3 ?2 x4 Y$ p+ w) j
scgread(& segs); ) O1 Y' R& H* W( E" f0 n
inregs.x.dx ="test.exe"; - b" u7 t$ z' ^' b9 a& O! L3 E
intdosx(& inregs, & outregs, & segs); 6 z# e# l/ j# r4 A1 G
if(outregs.x.cflag) return(0); . ]! z: N' C @, v5 f8 G1 h
else
9 j, u2 |( p7 }5 K3 D) D { ; u4 b2 _: N2 h0 k! z; q1 V. x3 z+ O
/ * 读取文件日期时间 * / 0 p: Y/ d* Z6 @5 C5 ?% x- q( \
handle = Outregs.x.ax;
; @' @( P+ t. w, O/ W0 o# q inregs.x.ax = 0x5700;
& ]0 t/ o+ A, i$ I: z4 P1 B5 O9 E inregs.x.bx = handle;
% C! J, y' {4 d9 S# d$ Q7 i intdosx(& inregs, & outregs, &segs);
S! n- _/ c7 E3 ~ times = (outregs.x.cx &0x7e0)> > 5; # x4 z' a, i2 A/ C
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * /
- e/ w1 Z0 z) X# E9 H; x) g* x { w! K6 p& B2 G/ O3 E
inregs.x.ax = 0x5701; . l4 D. h) ?0 w
inregs.x.bx = handle; ( d5 e1 N4 W9 A+ n, H8 B
inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / $ c, ~/ H' r+ H7 P5 d, S
inregs.x.dx = outregs.x.dx;
& K$ C. M7 p; h0 @2 J+ |8 f* W- F, T intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / - m5 B8 q; n9 V& c4 r' J# ?6 v
return(2); 6 `9 I7 t/ @# U3 t
} 8 E' y6 {2 h) H0 V" `/ G
else return(1); - K. m8 N/ v* ^4 J
/ * 关闭文件 * / + j w8 Z# I& T7 D. S
inregs.h.ah = 0x3e; , i) H! L4 M0 h Z% o/ a; J; B
inregs.x.bx = handle; 6 E& r t9 F7 x ^. x
intdosx(& inregs, & outregs, & segs);
( \( Q3 h' h1 E- T4 [7 n }
/ ?8 `5 L; h! X& O) R}
, _* D" p2 F8 h4 F8 W9 n( ymain()
8 D/ c* D9 u5 T& h' Y0 q& ^{ 2 G T P% q/ D: p9 g( n' K/ N/ X
int flag;
. x' U$ l r+ ]0 U flag = count();
" `1 H' Q z: y if(flag==0) printf("此软件为试用版,请勿任意修改!\ n");
$ L& L" n* L1 l1 C+ w if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 5 k! ?2 d& h% j
if(flag==2) printf("此软件为试用版,欢迎试用!\n");
2 U) [: K# b7 I; I8 X) W- c}
7 T7 |* q% W- T# O ~. V$ J |