|
* q) v* y* t# k# N$ V! u
v6 b x P* [0 y0 `/ t" q 软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
8 T1 r( |' q4 I4 I- [1 f+ M U/ C一、通过改变文件时间来限制软件的试用次数 , I4 \. c: z9 |. p/ w% w2 W
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。 2 V4 I* t% W7 R/ M5 ]; S
二、示例程序中所涉及的中断 : l: e1 F) D. g- O3 q/ H
1.中断21H的功能3DH / q# \0 D- q( j7 }
用途:打开文件用于读。写或补 充。 8 ^* V5 S) z" G8 p" n- W3 A
调用寄存器:AH=3DH,AL=00H,DS X=文件名; % ~( W4 g/ b7 a8 Z" C
返回寄存器:CF 复位--成功,AX=文件把柄。
( @# {6 S: w* H$ S& L7 v' q CF 置位--出错,AX=错误代码。 4 H1 Z6 U1 r1 r0 n* C! O" ^5 x
2.中断21H的功能3EH + |2 [$ ?$ {5 m) {/ L
用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
% `% t# ~) x9 t 调用寄存器:AH=3EH,BX=文件把柄;
$ L+ N+ x1 s3 U6 j 返回寄存器:CF 复位--成功,AX被破坏, # I+ A$ N, {& X) A
CF 置位--出错,AX=错误代码。
9 t8 l' x: W' j$ E 3.中断21H的功能57H、子功能00H 9 C' Q; I5 A9 j! D1 x, A7 D. K! c7 J
用途:读出文件被最后修改的日期和时间。 0 }, E/ W; F! i
调用寄存器:AX=5700H,BX=文件把柄; : |/ J2 q( O! A& [- T9 N! r
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, 2 n6 B, \' L- H9 U. h1 P- O
CF 置位--出错,AX=错误代码。 ) e- ^& u( U+ H
4。中断21H的功能57H、子功能01H , }5 N% j. d4 R/ A4 {$ j
用途:将文件最后被修改过的日期和时间信息变 成指定值。 ; { p& @9 d h) C
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
0 `- e/ U& A& D( K5 [" [ 返回寄存器:CF 复位--成功, 3 Q6 F0 p6 z$ g6 x! a1 I
CF 置位--出错,AX=错误代码。
6 o2 c' }2 h* I$ u+ |# j9 M3 M* U三、示例程序
4 x6 \# y4 Q* X2 n#include <sidio.h>
1 Z. @2 E; k; ~0 g#include <dos.h>
# h/ |- t' L( M+ o. O& `#include <conio.h> 1 I- x0 C1 ^8 @4 }
int count( )
6 S- s. p8 b1 X4 m{
. s4 G7 r. m4 Z, i union REGS inregs,outregs;
5 Z$ [# _7 ~( i# n" \ L+ n strut SREGS segs;
' g3 {& t: Y9 P# i" K0 P! U unsigned handle;
3 w# r1 H7 Q$ B9 _2 `1 F `: k0 e6 H% _2 [ unsigned times;
3 E! L% O0 `7 B2 O / * 打开文件 * /
1 F) k% O4 Z) A$ M5 B inregs.h.ah =0x3d; : a" J$ r- {0 T- A- q, F# ]
inregs.h.al =0;
# ~4 ~' p3 ?, i3 \. t0 [ c scgread(& segs);
" B2 \+ q7 P# \. o# Q6 d7 @1 ] inregs.x.dx ="test.exe"; . d8 \! G0 h4 T H. c
intdosx(& inregs, & outregs, & segs); ! e0 H k2 x5 r% ~0 [
if(outregs.x.cflag) return(0); 5 a9 x ]( |9 l( l
else 9 N! O4 o2 S6 E: T: e/ X W
{ / A$ [/ D0 C/ U& w
/ * 读取文件日期时间 * /
) q9 g3 D/ ?- M handle = Outregs.x.ax; 4 ?+ L4 C7 D8 I3 K$ T9 z
inregs.x.ax = 0x5700;
& Q1 `/ {# |! r$ p inregs.x.bx = handle;
1 ?5 J5 T3 {0 L' b1 _: U- X intdosx(& inregs, & outregs, &segs); / k+ C0 K8 G" z* k0 B
times = (outregs.x.cx &0x7e0)> > 5;
& r/ L- S8 f, b& ^ T& E6 u! x if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * /
/ n2 d6 v& p Z. u' ~' S { 0 F/ {7 f; g3 {; }$ ?
inregs.x.ax = 0x5701; + I& S g' l2 i! u
inregs.x.bx = handle; ( S5 H8 s) q1 `
inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / ( y& [7 S, x0 Z) ~" y
inregs.x.dx = outregs.x.dx; 2 A# J% D. g% K; z" i
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
4 W+ Q# v! X# o return(2); 8 z* O5 a8 F! D! L, J% T
} ! i+ Z; o5 d6 X- A/ Z
else return(1);
* d# ~1 f1 c9 p5 Z / * 关闭文件 * / : o+ W1 E; g/ J
inregs.h.ah = 0x3e;
v# L6 E9 j- b6 @. B0 q4 [. ? inregs.x.bx = handle; 5 E# ?; n( ^6 j9 M
intdosx(& inregs, & outregs, & segs);
! _5 m% K9 o5 e$ J9 M0 Z2 Z } 9 a! ?) \* `, N& q' R( m
}
- k! T9 J9 a: u0 R) a4 hmain() / \) x3 b% ?3 [! ^. X# R/ C
{ / c/ f7 q7 N6 {8 k3 D
int flag; ( g, t, D3 I3 m
flag = count();
! M8 J+ }9 _) q( j6 u' o4 C if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); * o2 N {+ S3 [1 t
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 5 K- U6 I- a m1 P, Y9 h2 @* ~
if(flag==2) printf("此软件为试用版,欢迎试用!\n");
; r9 n* i+ ?) O7 h/ d7 B$ `} ' Z! ] u5 q% e
|