/ \- q$ R) u& {; M: H
软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 8 ]( I/ I6 s+ {( I( }: a9 B+ X
一、通过改变文件时间来限制软件的试用次数 * q* \9 K" g/ [& g7 M4 t. Y* w
在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
二、示例程序中所涉及的中断 & ]2 d K- f9 u6 Y: X
1.中断21H的功能3DH # m* V" h; [6 Y' s
用途:打开文件用于读。写或补 充。
调用寄存器:AH=3DH,AL=00H,DS
X=文件名;
返回寄存器:CF 复位--成功,AX=文件把柄。
CF 置位--出错,AX=错误代码。
2.中断21H的功能3EH
用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 3 o" p- J, d8 E5 A! @/ S
调用寄存器:AH=3EH,BX=文件把柄; * x9 S/ M1 y, |8 g! [
返回寄存器:CF 复位--成功,AX被破坏, / Q! b: E6 q' L9 J! B1 m2 I
CF 置位--出错,AX=错误代码。
3.中断21H的功能57H、子功能00H
用途:读出文件被最后修改的日期和时间。 . s) W/ x$ a9 a7 |' X
调用寄存器:AX=5700H,BX=文件把柄; / s& H2 t' f6 u2 _3 m' n7 T
返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
CF 置位--出错,AX=错误代码。
4。中断21H的功能57H、子功能01H
用途:将文件最后被修改过的日期和时间信息变 成指定值。 & i+ _/ R a& J
调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; 1 z) }5 A8 Q; ?
返回寄存器:CF 复位--成功,
CF 置位--出错,AX=错误代码。 % i6 ~. s4 |/ N/ p6 ~4 b+ O" ~, F
三、示例程序
#include <sidio.h>
#include <dos.h>
#include <conio.h>
int count( )
{
union REGS inregs,outregs; / |6 O% `8 X0 S( n/ G
strut SREGS segs;
unsigned handle;
unsigned times;
/ * 打开文件 * /
inregs.h.ah =0x3d;
inregs.h.al =0; - ~) e, l3 V' @ k( u0 G
scgread(& segs); B9 B" W5 s- T5 I* ~2 D* A* K) R
inregs.x.dx ="test.exe"; ) z5 a0 h8 r0 y6 h- j; Z" ~5 W
intdosx(& inregs, & outregs, & segs);
if(outregs.x.cflag) return(0); P3 a# z4 y8 q# K3 t) V* B
else : N5 X& C; I9 h
{
/ * 读取文件日期时间 * / ! T- B- F5 G6 u @! o8 B3 V) T
handle = Outregs.x.ax;
inregs.x.ax = 0x5700;
inregs.x.bx = handle;
intdosx(& inregs, & outregs, &segs);
times = (outregs.x.cx &0x7e0)> > 5;
if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / 7 z) L2 H2 _. z' x0 }& |2 W8 C
{ 1 o" p3 z/ A% K
inregs.x.ax = 0x5701; $ m6 I7 g& N# p% E0 Q1 N
inregs.x.bx = handle; ! w" o7 o7 T% E) ~. t+ r5 P" g- B
inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / % b* B5 H2 u& t% B! V
inregs.x.dx = outregs.x.dx; 3 Q- L$ H3 C; t$ P0 ]
intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
return(2);
} ( `! c1 P8 a7 N
else return(1); ( K1 b3 c) d9 X, H
/ * 关闭文件 * /
inregs.h.ah = 0x3e; & M. B7 Q( _! x% b: G; D3 G/ r9 n
inregs.x.bx = handle; 2 Q+ N' g2 W" `) X
intdosx(& inregs, & outregs, & segs);
}
}
main()
{
int flag;
flag = count();
if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); 1 F8 o. k! D- Y) g `- l. v, G
if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 9 S0 r5 v r& q* B4 s
if(flag==2) printf("此软件为试用版,欢迎试用!\n");
} O4 i+ x+ ?6 f) W6 }
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |