|
/ e0 p5 p) D, _5 ~& p) q6 {5 | ; ?( B+ H' ]: L% K4 S" K5 `
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 * v( ^: P& @% K$ E3 f. `, z8 w
一、通过改变文件时间来限制软件的试用次数 r" \7 A2 @0 F4 Z+ F8 a
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
3 i; n- p+ B6 ?3 Y二、示例程序中所涉及的中断 , b# Q; E8 y! x6 V8 W% r
1.中断21H的功能3DH
8 t& X. X% ?5 I5 u 用途:打开文件用于读。写或补 充。
/ p& h2 i1 Y0 S! R: z6 z5 ~ 调用寄存器:AH=3DH,AL=00H,DS X=文件名; 2 y" c! Y6 o3 ^
返回寄存器:CF 复位--成功,AX=文件把柄。 ) j$ b {5 T* z4 E( O
CF 置位--出错,AX=错误代码。 & V/ `2 s2 K" @4 l
2.中断21H的功能3EH
4 Y' p; O9 ]1 [9 p/ n" V2 D8 W 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
6 h6 u3 V5 O; j, K( }* @0 B/ J$ V 调用寄存器:AH=3EH,BX=文件把柄;
2 [- h" x! E, Q+ S; ^3 K# B- | 返回寄存器:CF 复位--成功,AX被破坏,
( z/ l+ p) I) c& {2 I CF 置位--出错,AX=错误代码。
. { W; O: s" \- v( X1 n$ g 3.中断21H的功能57H、子功能00H
& [2 d7 a/ X8 ^+ l9 } 用途:读出文件被最后修改的日期和时间。
: V5 x( c2 h# r. U: l9 m1 g g 调用寄存器:AX=5700H,BX=文件把柄; # P2 |$ k" w- r7 n
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
: G, `5 {- N$ a) S( v# M, r CF 置位--出错,AX=错误代码。 ' L# ~3 S& J( e9 L8 m
4。中断21H的功能57H、子功能01H
$ h0 c! x7 |! w; m, Y) {# M# ^; l 用途:将文件最后被修改过的日期和时间信息变 成指定值。 5 S& w- V) ~- @7 }- @# G. T2 X
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
6 o9 e& ?" ~: u1 g* @5 q% @ 返回寄存器:CF 复位--成功, ) N9 B3 g8 v5 g7 s3 [8 }& M$ H6 R
CF 置位--出错,AX=错误代码。 : `+ b- w: v& Z) E
三、示例程序 " [; N$ y6 E& ]8 X. c
#include <sidio.h>
5 K% `1 f+ A) m1 \$ G#include <dos.h> 8 ? A" X: m5 |, f$ l& u
#include <conio.h>
) I, C, D* T2 d2 G: j0 P- e4 Iint count( )
% d2 G. K# u( O, g5 W& }4 K{ # ~7 k7 Y+ Q& I3 d# b: j2 @: J* d3 P
union REGS inregs,outregs;
! [6 E& f# l, s: L6 a' e7 f$ X strut SREGS segs;
0 T) n" G2 {, g" Q+ Z unsigned handle; % y/ r# u0 F- `2 s
unsigned times; $ l U$ g/ W1 D1 U
/ * 打开文件 * / 2 u3 t6 x4 D' b1 M5 Y$ F
inregs.h.ah =0x3d; ) \# m3 F6 R/ [" e1 p# a
inregs.h.al =0;
/ S+ H7 r l0 P& x% O scgread(& segs); : V% c# E0 ?# c; M# r, C% U" h& W
inregs.x.dx ="test.exe"; ) g' V K* J! ?& H; Q4 o: O
intdosx(& inregs, & outregs, & segs); ' x' {1 a" _+ `: h& P
if(outregs.x.cflag) return(0); $ X6 x! i, W9 U9 g8 W
else
6 L5 X, @9 x8 b, v/ d7 V$ m# ?1 u1 L {
8 h/ F9 c" Y& t- ] / * 读取文件日期时间 * / # ]6 a Y; b `3 v! Z! r
handle = Outregs.x.ax; , I4 d& O. a* p9 h
inregs.x.ax = 0x5700; 1 M6 R; U8 l* ?* |& E
inregs.x.bx = handle; ( O4 v0 _, t" a& d( v" [
intdosx(& inregs, & outregs, &segs); % }+ U4 y! U$ O U9 E* a% ^
times = (outregs.x.cx &0x7e0)> > 5; . K$ k! z, X! j
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * /
, B1 b$ X( m0 r9 {" v; w0 g { 4 O0 ]) y. T. c6 w5 v8 d
inregs.x.ax = 0x5701;
{# X- h8 i5 R* Z% d6 Z inregs.x.bx = handle;
1 S. N$ h6 R) e( r: y- i inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / $ @; Y" ~4 o+ c% Y% Y ?
inregs.x.dx = outregs.x.dx;
" m9 `' i! J. ~( n intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / : P! G( P6 Y$ h! E, X, M
return(2); " Z/ W& f' h- [% C& d5 o# v
} 8 f( Z- ^. e u- _
else return(1); . a% r8 K$ a! w/ ?, Z
/ * 关闭文件 * / 1 H6 q$ v' I7 F4 L* e4 X" Q
inregs.h.ah = 0x3e;
. J0 P) z5 ^5 i+ J1 H) a. J inregs.x.bx = handle; ' g/ h" ?$ y- F+ ~5 r/ q. w% `
intdosx(& inregs, & outregs, & segs);
' O! e; p4 Q: z6 R2 E } B$ ?. T9 y$ g3 g
} 8 j# j4 u4 g& s" S1 u9 ^+ V
main() / m% H' Q i, d4 H' ?' T8 g
{ - D' r2 Z" A! ]5 V) _) |
int flag;
" v4 j' p0 g( b1 d flag = count(); " ~+ B0 H( I2 d" P8 ^5 D
if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); - b+ k9 Q2 o8 F- I* `0 n5 Z
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); . c" u+ U8 Q' U* d# I2 K, \
if(flag==2) printf("此软件为试用版,欢迎试用!\n"); , A s# M' z. N" l0 [; f
} : ]8 Z- M1 x$ [0 o9 q
|