8 R$ T0 k3 ]6 a" ]0 |
4 U( X C9 ]8 n5 ?, ^4 v. W 软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。
一、通过改变文件时间来限制软件的试用次数
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
二、示例程序中所涉及的中断
1.中断21H的功能3DH
用途:打开文件用于读。写或补 充。 : A5 X& T8 z+ A7 C, d4 y0 l
调用寄存器:AH=3DH,AL=00H,DS
X=文件名; 3 h) W- g( Y& ]* T- X$ h# g
返回寄存器:CF 复位--成功,AX=文件把柄。 & u& m& o# S0 X/ W7 I! W* @
CF 置位--出错,AX=错误代码。 ; M ~1 l+ @ R" k4 v4 D1 E+ p1 W }
2.中断21H的功能3EH $ b! t8 v2 E) s# x& g1 S
用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 % F2 U' w! a |2 Z7 x
调用寄存器:AH=3EH,BX=文件把柄; ; t! e" ]& Z; T9 P0 Q( ~% T1 X
返回寄存器:CF 复位--成功,AX被破坏, ) h. X# W0 h. V% h! N
CF 置位--出错,AX=错误代码。 4 X6 a4 U. b# |& L5 `8 a
3.中断21H的功能57H、子功能00H
用途:读出文件被最后修改的日期和时间。
调用寄存器:AX=5700H,BX=文件把柄;
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
CF 置位--出错,AX=错误代码。 ; l) V2 B) d3 O
4。中断21H的功能57H、子功能01H + |7 {' B, P. f# [. ]2 @
用途:将文件最后被修改过的日期和时间信息变 成指定值。 ; ? e; @& u8 }+ X7 f
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
返回寄存器:CF 复位--成功,
CF 置位--出错,AX=错误代码。
三、示例程序
#include <sidio.h>
#include <dos.h> . h" }- E7 C! I f
#include <conio.h> 3 ~8 z4 P. g0 ^" w
int count( )
{ L4 z% t- y- p6 F1 F1 {
union REGS inregs,outregs; ( A- V6 ?/ \8 q6 D5 T7 u9 p
strut SREGS segs; 9 x, U0 s0 U e% ?0 s- ?
unsigned handle; . g# b, D9 U6 e( a5 P, r
unsigned times; 6 I6 `8 t0 X- V2 q2 z
/ * 打开文件 * / / |8 z, q( \9 V' e* d) r
inregs.h.ah =0x3d;
inregs.h.al =0; + s$ j! v. \0 C2 T: ]# x) I
scgread(& segs);
inregs.x.dx ="test.exe"; , S$ i/ V4 t5 d" g' _/ z
intdosx(& inregs, & outregs, & segs); 9 j: U% G, I9 w! X9 B1 c/ u
if(outregs.x.cflag) return(0); ; h" u+ n" `8 G, |& Q F
else
{
/ * 读取文件日期时间 * / " |9 s5 X1 d8 J9 p+ [& g! F
handle = Outregs.x.ax; ' f; Y: O% i: V( p e4 u
inregs.x.ax = 0x5700;
inregs.x.bx = handle; 8 D4 j! v6 F( |) z8 c0 A1 U
intdosx(& inregs, & outregs, &segs); 4 V* l, J0 l7 z1 I. _' f
times = (outregs.x.cx &0x7e0)> > 5;
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / & q8 K# }) g6 G, a& M* L
{
inregs.x.ax = 0x5701; . w: I" N7 ~" f" o
inregs.x.bx = handle;
inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / " T& n/ X* ^2 L1 \4 h
inregs.x.dx = outregs.x.dx;
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / # N9 |; ^9 e4 ~- E7 o# `. b% A
return(2);
}
else return(1); * A2 N3 c5 A0 e
/ * 关闭文件 * / $ `2 v; M5 `( J! a* X# n% D
inregs.h.ah = 0x3e;
inregs.x.bx = handle;
intdosx(& inregs, & outregs, & segs); 8 V, V' S1 t! G4 r
}
} 5 d" X& |( ~/ c# b) _* W, o# B, [
main() / F L* }3 N' E* m; @
{ 1 S1 _2 B' p+ R
int flag; 7 A! f2 Z- g0 z- D3 W) }. b
flag = count(); 5 ?. f- H5 B2 u0 s
if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); ) u. r5 s& c$ T3 m/ ]( ]( F4 o
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); , M. o' r( `9 P0 x* a9 h) A
if(flag==2) printf("此软件为试用版,欢迎试用!\n"); * R! Q2 d7 h( S# e/ M
} % g& }, ? C# c0 B1 X* B
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |