|
5 c O$ m6 m n0 q( F# @' r3 ?7 {
; g+ m, ?( @7 x+ [+ ?4 f0 ~ 软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
4 H! a9 V! Y% j- N6 E一、通过改变文件时间来限制软件的试用次数
* H" Y+ \ c8 Q! r 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
0 c# k! W3 x/ A; J二、示例程序中所涉及的中断 + m- q( T# A2 ~* C6 y p$ E
1.中断21H的功能3DH 3 j0 }7 i+ j5 ^2 w* `
用途:打开文件用于读。写或补 充。 2 E" a* T* D- F5 w
调用寄存器:AH=3DH,AL=00H,DS X=文件名;
6 c1 [1 O2 \9 T. L 返回寄存器:CF 复位--成功,AX=文件把柄。 ' M$ f) x) r5 `8 N/ t
CF 置位--出错,AX=错误代码。
" O) Z% j2 X% [& a: d0 H 2.中断21H的功能3EH
/ n1 N% {! y) a/ L F" T 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
1 G9 F. q, d9 R9 M0 V 调用寄存器:AH=3EH,BX=文件把柄;
% z- s0 g- i6 U0 D7 @$ w) V; T( u 返回寄存器:CF 复位--成功,AX被破坏,
; h8 N6 {9 \+ L6 [1 A$ C3 A3 C CF 置位--出错,AX=错误代码。
' r6 m0 w9 h7 [) {) I 3.中断21H的功能57H、子功能00H
% J1 P* _/ b; P: g1 a4 o 用途:读出文件被最后修改的日期和时间。
8 k' A) E$ J: _ 调用寄存器:AX=5700H,BX=文件把柄;
) \5 v4 a4 N! n 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
7 Q) M. \4 d- ?) J( J CF 置位--出错,AX=错误代码。 ( R3 [2 ]: V4 o' Q
4。中断21H的功能57H、子功能01H
, p8 ?4 o, L5 P8 M& z: _ 用途:将文件最后被修改过的日期和时间信息变 成指定值。 ) S; @! K# x l9 T! c A
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; 1 Y: P8 p% y$ \
返回寄存器:CF 复位--成功,
' f( x, {) s6 S. A) I CF 置位--出错,AX=错误代码。
- g3 a+ }0 e2 ^+ C1 f7 h# ]三、示例程序 ( p) R- Y- X$ O2 k4 {- B( z' L
#include <sidio.h> # V3 _2 [. C* {8 G( h c4 a r
#include <dos.h> : p! T+ n2 ?6 ^) j9 U
#include <conio.h>
# X6 Y( e# v9 v& z; ]# Rint count( ) ' ^4 o. S8 |& q% q
{ ; `3 N: x: K* X
union REGS inregs,outregs;
% c' o6 F0 x8 h( R strut SREGS segs;
: H3 R0 _ v( p unsigned handle;
6 _0 u1 @; G1 _- u2 B- b) d unsigned times;
0 i, u$ Q+ e, o* p / * 打开文件 * /
5 N5 K4 h3 Y9 E/ {( @ inregs.h.ah =0x3d; 0 \2 M7 t& v- q5 F: z$ D( Y$ R
inregs.h.al =0; 6 ^3 c' P5 I7 M4 _/ {4 W
scgread(& segs); ! s: L2 o, f4 H) Y- o
inregs.x.dx ="test.exe";
& T+ y' N/ P$ t! v( | intdosx(& inregs, & outregs, & segs);
/ K6 u h* M" d0 S. [ if(outregs.x.cflag) return(0); % M" p% S! K( k) T5 C
else , m. \8 ?: b4 F( p- _8 q7 l( S) U* ^
{
7 a" Z7 i9 J( [/ m$ J / * 读取文件日期时间 * /
# B+ h3 g$ O( V* R% m+ D handle = Outregs.x.ax; * s, [9 O6 |+ Y7 F5 [
inregs.x.ax = 0x5700; 9 @" j8 j- C0 P5 P. _8 R i+ ]" p- a
inregs.x.bx = handle; E; w8 I l; W* ]$ Z
intdosx(& inregs, & outregs, &segs);
. N! [0 d2 ?* F* t+ t times = (outregs.x.cx &0x7e0)> > 5;
+ @ G9 j# F' N s( ^ if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / " q, J0 Z. }9 G; V8 ]3 r/ L- n
{ 0 x* R9 [% b% ]
inregs.x.ax = 0x5701;
( b6 J7 y& b5 s inregs.x.bx = handle;
% |3 H d" z: l, J4 M inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / * y5 Q+ C& H' X! P: R/ ^: C2 ]; K$ ^
inregs.x.dx = outregs.x.dx; 4 W+ P" f" ^% j
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / 4 D4 `- Q0 z" o# ^0 x! r
return(2); ( K6 d4 N; q; @, H
} . ^/ S# X+ R* c6 E0 Y0 n1 t
else return(1);
1 W5 b% t: x. ^# K5 g! J! ~6 a / * 关闭文件 * /
' h$ }7 \' a: b5 W$ \( f inregs.h.ah = 0x3e;
5 f7 v( Q" e" y! J. w% J inregs.x.bx = handle; & W8 O% V1 ^: V- A( Z
intdosx(& inregs, & outregs, & segs); / G. L1 l0 Z( i: \: X# W
}
; I+ S& A f8 S, W( ~) L* k' F}
. a6 m1 F* p; E7 \! wmain()
" g; o! ?# d4 s+ k/ ` V- ]{
: f E2 T! r* R int flag; + K' s; r: z6 g2 J- D7 V, Q
flag = count();
/ r& B/ N( y/ Z7 L if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); # W* y/ W) g. l V- a' v: I" A
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 7 f. c6 A. {* X* Q
if(flag==2) printf("此软件为试用版,欢迎试用!\n"); ' B# \% I3 }) w* U
}
- s+ i' u3 i: k, h |