|
- {2 t$ a- O: v$ Q" r0 o2 c
n0 e! v) D$ \$ W+ m/ S3 K 软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
+ c" M+ U; H6 g! t3 w9 ^1 u一、通过改变文件时间来限制软件的试用次数
, T8 M/ z' @4 B$ k* l, g( } 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。 R8 f# c# m2 w T6 w6 H
二、示例程序中所涉及的中断
7 b9 [8 c6 v- e: F0 a9 [1.中断21H的功能3DH
% M# _" D' p H- _3 H! z/ z 用途:打开文件用于读。写或补 充。
- }+ ^) o% Y4 u8 t 调用寄存器:AH=3DH,AL=00H,DS X=文件名; , }! I: Y1 m& E3 N& G# N
返回寄存器:CF 复位--成功,AX=文件把柄。
" F) p+ R& E; v* S7 B$ w" p: _ CF 置位--出错,AX=错误代码。
4 e# k. L8 l7 \0 e, ]- M9 n 2.中断21H的功能3EH
. C0 F* J! H' q o% Y3 \, y( ] 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
# Y! m2 N" D) v) {8 z: ]. M 调用寄存器:AH=3EH,BX=文件把柄; 4 H+ G: g: S1 O
返回寄存器:CF 复位--成功,AX被破坏,
& y" S8 i+ Y T8 P0 M/ c CF 置位--出错,AX=错误代码。 " t; a. u" e1 T7 r* S% O! q3 a
3.中断21H的功能57H、子功能00H
. u- `- s. q# ]6 D. U 用途:读出文件被最后修改的日期和时间。
! Z7 e* q- W0 n- a 调用寄存器:AX=5700H,BX=文件把柄; ' A- [& B. ?# f- m0 w% t4 [' c
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
1 `3 S8 |) S! L- [/ }4 c; _) e. S CF 置位--出错,AX=错误代码。 # A! j+ M/ a7 k+ ^* T
4。中断21H的功能57H、子功能01H " M, |# \8 ]1 K* [
用途:将文件最后被修改过的日期和时间信息变 成指定值。
3 H& J4 X% n5 b1 b* X6 M9 L 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
+ ]; E; e, M: ]% @9 b 返回寄存器:CF 复位--成功, , D8 _( q! s* J/ Y. @% ~& B2 u; \9 s
CF 置位--出错,AX=错误代码。
3 n; e# C' x ^3 ?+ f" W三、示例程序
: [4 U& ]: G. [2 K+ s; l#include <sidio.h>
8 b; F0 I/ |2 h3 Z5 D' r+ K% g#include <dos.h>
7 R$ P' }3 I7 e" j" J8 u* a/ ^. X#include <conio.h>
! V1 o9 _; U# O+ q" @int count( ) ( b! F7 G5 M+ m d' i
{
8 t* U6 f, J: y* q union REGS inregs,outregs; ( }: N* X/ p1 F* p! \ D
strut SREGS segs;
9 n1 H' Q4 Z2 L& ^, D! N unsigned handle; 8 l& B$ ]0 S, |! @5 Q7 y$ @
unsigned times; ! P; q: k5 M; z' B
/ * 打开文件 * / ' S# r; ~& n+ U2 F& i
inregs.h.ah =0x3d;
% h1 G- |4 {6 N9 a X inregs.h.al =0;
" C% i: D1 j: D7 V scgread(& segs); + _2 f M! C! p b
inregs.x.dx ="test.exe";
; S) v- |$ c- Q" H intdosx(& inregs, & outregs, & segs); ' \$ M c1 ~% \0 l2 e% ~
if(outregs.x.cflag) return(0); ! m6 }6 ] {" q4 D0 n W
else
7 v/ [" } N, |. z1 n% ` { ) Q, `8 C# f( D9 e- V6 R
/ * 读取文件日期时间 * / ; ^8 \5 u! ^4 W& T x9 M( s
handle = Outregs.x.ax;
1 z' ~& ?# i$ k+ b inregs.x.ax = 0x5700;
n. `$ ?( ~# ?5 O/ b inregs.x.bx = handle;
1 w+ L9 _! u$ g6 {- n. w intdosx(& inregs, & outregs, &segs);
" O4 h2 s/ J% B# h5 [0 |1 y times = (outregs.x.cx &0x7e0)> > 5;
# x# U0 f: l- ?; T! ?6 t if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / 7 B2 o+ o8 O2 y+ x. G, Z$ p
{
3 l6 B; k+ D: ]8 s/ H4 k2 a inregs.x.ax = 0x5701; ) s. G8 U3 q" C" ?: A
inregs.x.bx = handle;
r5 y. m; q+ v4 \0 z6 A inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / / U0 Z$ s* e1 G1 [
inregs.x.dx = outregs.x.dx;
1 E! S5 H: X! B3 C# { intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / ( R- ]6 m8 U; s% w) C
return(2); + l b, Z: q3 X d2 [
}
, ]! I2 S4 v" l else return(1);
. s! O, J4 B$ P0 \. O / * 关闭文件 * / " Q! W6 V: B. Z/ Y$ h- B
inregs.h.ah = 0x3e; h+ v2 P( Z, A
inregs.x.bx = handle; 7 w, ~% p/ g! V, J
intdosx(& inregs, & outregs, & segs);
/ ^8 _* n( x! A9 m } # u5 d, T4 l4 z( e
} ( ?4 D/ ^; _& J
main()
" H$ T/ r4 j5 x M, b' J! X! q{ Y( r( g4 P+ G8 B8 s! ~1 `
int flag; + R6 u/ M3 Y5 b& ^- _
flag = count(); . y3 B5 T9 F7 L
if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); 3 X7 W1 C- \' K! W1 ]; h$ S) v
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n");
: C& @" L# z! B4 P' t3 [; J if(flag==2) printf("此软件为试用版,欢迎试用!\n");
# G0 S- U4 x( Q9 p; n( f q} ) U" f9 y9 \( }
|