数学建模社区-数学中国

标题: 软件试用次数的限制 [打印本页]

作者: 韩冰    时间: 2005-1-26 01:31
标题: 软件试用次数的限制

g3 I9 [' N% n! F/ i$ z

! w" L4 y. o: R4 x- A6 |" t

软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 , H% d, J6 U' X: ^6 A 一、通过改变文件时间来限制软件的试用次数 ( j5 n/ ^: g+ R" Q0 C 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。 $ O% u( b- q4 A# J& F- ~* m3 H二、示例程序中所涉及的中断 % p1 D7 T2 k* ?0 P/ t9 ~5 m0 r1.中断21H的功能3DH 5 A6 ~, V* N5 o) t9 O# R 用途:打开文件用于读。写或补 充。 ( w8 _- T6 @) w 调用寄存器:AH=3DH,AL=00H,DSX=文件名; 9 _* n2 h7 q4 k* z+ L# \5 j 返回寄存器:CF 复位--成功,AX=文件把柄。 7 u% E% q4 g. \& z7 u CF 置位--出错,AX=错误代码。 + c) c( ~7 X n2 j* j) D# X 2.中断21H的功能3EH 4 v6 d1 s; o s! W4 W 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 # O8 f n: [5 I2 E& G; q. m2 m 调用寄存器:AH=3EH,BX=文件把柄; ! N" F: T% s! e9 i 返回寄存器:CF 复位--成功,AX被破坏, % X( _: z1 J) J0 |, k CF 置位--出错,AX=错误代码。 ' W9 {) o' v+ e5 d ~8 X 3.中断21H的功能57H、子功能00H 3 n8 n5 H/ i, v# p" y 用途:读出文件被最后修改的日期和时间。 . W) s. W: r" t- h/ _. s" ~ 调用寄存器:AX=5700H,BX=文件把柄; 0 W9 U) e z* U, C) J 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, 4 J S. ^3 Z: D* C3 `1 x v CF 置位--出错,AX=错误代码。 ! i" N2 y' D8 T" m 4。中断21H的功能57H、子功能01H 6 z* l3 o2 o% c# j 用途:将文件最后被修改过的日期和时间信息变 成指定值。 ) B6 j" P3 w* h& G! B 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; , r6 W: T2 I+ O/ D/ K) x$ z 返回寄存器:CF 复位--成功, 9 a' ?# M7 U) Y$ z- D4 O% \2 T CF 置位--出错,AX=错误代码。 & i* G. e8 G, _ 三、示例程序 $ `$ J7 M& x/ S$ n#include <sidio.h> 6 P9 w$ a9 W# O8 | O5 Y# g#include <dos.h> $ p+ b2 p7 {# r! V+ A #include <conio.h> ' ~5 D% \! n8 Dint count( ) ; W" `% m$ U- H$ F; z, P{ ! c H/ s, g2 \( L union REGS inregs,outregs; ! W, i q# `$ M1 D$ w strut SREGS segs; 5 O: ]' l4 [: ^: k2 s unsigned handle; ) I/ D: Z2 P4 V1 I. {8 ]: E unsigned times; & L! _ m9 H( e% m* d+ W j6 ` / * 打开文件 * / ) t8 \3 P; x. g c inregs.h.ah =0x3d; 9 h3 O& z; r4 Z0 g inregs.h.al =0; _1 }( N6 x! j scgread(& segs); . D( l- t' I% H# W inregs.x.dx ="test.exe"; " {2 A) [+ S9 z( Q( N2 y; a2 F intdosx(& inregs, & outregs, & segs); D `% S: v5 ]' }) c/ ?- a w if(outregs.x.cflag) return(0); 3 O' j% {" S" |& R else " t5 ?* s3 `) a7 h& q1 C { 5 Q Q) Z1 I4 {, H / * 读取文件日期时间 * / " U' _; A( I2 ]9 R! {# X4 o1 O handle = Outregs.x.ax; / G/ T# y5 g& A inregs.x.ax = 0x5700; 3 c5 r* [5 U/ V, |3 ~) T inregs.x.bx = handle; 6 S" E C4 q3 h+ M0 u+ m. c intdosx(& inregs, & outregs, &segs); ' n! R5 Q# e0 B5 j times = (outregs.x.cx &0x7e0)> > 5; : s7 Y5 b6 e: ?. P( G if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / / q9 r, a# f) c% {: x/ K1 ] { + s# j" J& b! {5 C7 Y- [ inregs.x.ax = 0x5701; % p) ^- |3 x' d' u6 _# W. [4 d3 Q inregs.x.bx = handle; % z7 c! N5 |$ [1 ]. n2 X inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / # ]# B8 S# X/ t! H8 b! y/ a* N inregs.x.dx = outregs.x.dx; ) T8 u, M- p3 l intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / 2 s( d0 H) B4 `: T1 h; U; C0 y9 J return(2); 0 b& M) j$ C# V" e; q5 N } * {1 ~9 P- o0 d" W* a3 r, }9 P else return(1); # M, n4 c y& b. s: m( J9 Y / * 关闭文件 * / ; c3 }, R. V) m& S- K inregs.h.ah = 0x3e; , s1 T6 J0 B. [& F4 H T inregs.x.bx = handle; ; p c% `9 e# L: [1 R intdosx(& inregs, & outregs, & segs); ?) k% v1 Y3 D! L6 t& j% K } 0 a2 i: d* q1 I, h; e6 w* T9 M6 |7 ~ } + u% B: L7 P; C7 |& x3 X( ] main() - k1 @; U% `7 R" U! S$ u8 G( }{ ) t2 O% f* I k/ W$ T% b; z9 x int flag; # ~* _1 f8 k, d flag = count(); 3 U' M, a) g9 P* s if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); 5 Z$ i* n6 V4 T if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); 6 K+ a: c. l( j) H/ n, i3 { if(flag==2) printf("此软件为试用版,欢迎试用!\n"); ; d X2 ^: g8 p/ ~& v} ' O* U6 \5 ^$ |# R" F. |






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5