|
+ b( e* |' `) a% b; s
0 K+ q3 t9 {* U( g% Y3 s: H
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 6 _. k* x& T& F' S3 x8 _4 u
一、通过改变文件时间来限制软件的试用次数 9 t* V+ H( H- L% H
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
+ z! X- R6 c6 @( d c二、示例程序中所涉及的中断
* W0 j; I n" n* _" y; s1.中断21H的功能3DH
+ |3 v% C2 w2 b5 }5 J! S) c 用途:打开文件用于读。写或补 充。
( ^1 ~7 H! a, B+ v 调用寄存器:AH=3DH,AL=00H,DS X=文件名; * a. B f2 G/ v
返回寄存器:CF 复位--成功,AX=文件把柄。
7 f9 T5 \* ^6 e4 H# ] CF 置位--出错,AX=错误代码。 8 _0 k( o2 \( [$ m9 z4 v; h
2.中断21H的功能3EH
$ c# O2 S8 f) J" Z 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
* I5 Y( p4 E v) r 调用寄存器:AH=3EH,BX=文件把柄; 8 b) C- U8 x: y- ^, Z( k
返回寄存器:CF 复位--成功,AX被破坏, 1 u7 u A5 K8 k5 n1 g j
CF 置位--出错,AX=错误代码。
# N' y/ Z- V, C8 s 3.中断21H的功能57H、子功能00H
5 |! R8 d- o- s4 T7 T: [ 用途:读出文件被最后修改的日期和时间。 ( g2 ]! f' R; W# x& }
调用寄存器:AX=5700H,BX=文件把柄; 6 u1 @$ ?! q$ b. w5 `2 R9 e
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, 2 J& n9 [' Y0 q
CF 置位--出错,AX=错误代码。 : _7 J% {1 e8 w' @
4。中断21H的功能57H、子功能01H
( U, R% P8 l; g' w* I 用途:将文件最后被修改过的日期和时间信息变 成指定值。 " g1 k- c8 F6 S& M4 o
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
8 S' E) Y$ {4 [# `9 v 返回寄存器:CF 复位--成功,
6 Q0 K. D1 p- M4 w! {! l9 T4 D" w CF 置位--出错,AX=错误代码。 ! ]) T& ^* I6 E) n. G( `7 s, W0 ^* C
三、示例程序 - X7 L* M7 I$ X6 c5 A
#include <sidio.h> 4 x' J( L$ X; C0 k$ ?, d6 `$ N
#include <dos.h>
7 F+ |% K- O5 X#include <conio.h> * u& |# R9 G7 Z& H8 ?* `2 a& B
int count( ) / a3 ~, N! k5 M4 K2 o
{ % j7 ]2 Y$ k2 u9 {
union REGS inregs,outregs;
9 ^: e" @: A5 l! {8 W9 v: @ strut SREGS segs;
" S! `3 U* D. @+ U: C) e unsigned handle;
- O" W: B E9 a4 b3 T, j unsigned times;
2 e6 z( B4 M& N2 ~- q- p% { / * 打开文件 * / % u' e* u+ r1 a
inregs.h.ah =0x3d;
- }) X9 h2 Q3 g+ i j4 B Q4 Y4 O inregs.h.al =0;
! d/ S7 i8 x" `% ` scgread(& segs);
7 b; R0 k8 V& V/ ` j* X K inregs.x.dx ="test.exe"; & x3 ]6 S, ]9 i, w% o* h! `
intdosx(& inregs, & outregs, & segs); 5 Y0 u0 w6 M$ A5 ?8 S
if(outregs.x.cflag) return(0);
. ^% d$ p5 O' n4 m else ; W; P6 R5 O3 N5 c/ Q
{ 1 }2 `* `, P/ m# e
/ * 读取文件日期时间 * / 5 _4 s! j1 d! Y B5 v
handle = Outregs.x.ax;
- L2 {5 r0 K! E inregs.x.ax = 0x5700;
7 m5 B0 z6 L9 Z8 B" T: | inregs.x.bx = handle; , ]5 |' Y) x8 S# @/ d4 Q
intdosx(& inregs, & outregs, &segs);
+ i6 ^; H: Y4 V x9 E times = (outregs.x.cx &0x7e0)> > 5; . E3 u5 R$ z& J3 ]( h& _; W. ?
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / : {0 q7 G# O, q" f- c$ n
{
& J6 z& K1 ~4 w inregs.x.ax = 0x5701;
' A& H! ?" y# x9 r inregs.x.bx = handle;
4 e9 ]: G0 ~2 M inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / $ A* E% D$ \' M0 e9 [4 N8 L
inregs.x.dx = outregs.x.dx;
" b) R+ [; L* E3 a: S, V intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
0 K( @( F% J( o( G, r. q return(2); " ?9 X' q9 p4 a: u% K5 u \9 {
} % [7 X# W A# R& |. A0 A
else return(1); 3 M4 K$ v8 ]- V8 }: l Z
/ * 关闭文件 * /
5 {5 Z8 D1 A, `: H7 d inregs.h.ah = 0x3e; 8 G6 O+ S$ ^+ j4 V3 e
inregs.x.bx = handle; f9 S: o2 r$ M+ I4 u
intdosx(& inregs, & outregs, & segs); % J, Y5 [5 E6 x, k& E
} 2 y: j1 k+ U6 S5 S1 |
}
2 L5 p8 ~1 R8 o1 y/ I; b# k+ Cmain() * b+ Q; v/ i2 j2 I. `' N i
{ 9 u6 ] c' R( p6 d. a4 e
int flag;
3 h$ o" s0 J1 C i flag = count();
3 @. ]& M! |; p6 r2 j `" K if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); # v: }6 h0 A0 q ?# E& T
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 1 s! B* H9 ~# h* T3 G
if(flag==2) printf("此软件为试用版,欢迎试用!\n");
! R" g, @) `2 w: M j# J6 Q}
- h4 U1 c' @( L5 ~3 n |