数学建模社区-数学中国

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

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

8 R$ T0 k3 ]6 a" ]0 |

4 U( X C9 ]8 n5 ?, ^4 v. W

软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 " p1 Q3 O0 o& {# c1 }( N一、通过改变文件时间来限制软件的试用次数 8 {$ g v. N2 t1 g: \& N9 Q- X 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。 * Y3 }) V' Q- M) m! h* b- h, L- S二、示例程序中所涉及的中断 $ Q7 u0 ]6 _$ v7 x+ D1.中断21H的功能3DH & ?' Q* R6 i4 N2 {6 Y* O 用途:打开文件用于读。写或补 充。 : A5 X& T8 z+ A7 C, d4 y0 l 调用寄存器:AH=3DH,AL=00H,DSX=文件名; 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 # R' a5 g" O* U3 d1 e5 ^- w 用途:读出文件被最后修改的日期和时间。 1 q( N5 t, _: @. o( C 调用寄存器:AX=5700H,BX=文件把柄; , g/ Y9 F8 u8 [7 M1 v! P 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, 1 G3 @* ]; X8 c8 P9 N: C 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=新日期; 2 Y0 r5 F+ A1 |# n& X( E0 i 返回寄存器:CF 复位--成功, # s( _+ O7 Y, r# t CF 置位--出错,AX=错误代码。 8 O+ `1 L4 Y" V; J$ W% h7 v三、示例程序 1 ]: e( c5 `+ s#include <sidio.h> 6 V/ S+ e( j) o#include <dos.h> . h" }- E7 C! I f #include <conio.h> 3 ~8 z4 P. g0 ^" w int count( ) 2 W, ~/ A$ @' W+ n" ~" n! ?+ |9 Z{ 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; : R0 f% W9 p1 C" z p inregs.h.al =0; + s$ j! v. \0 C2 T: ]# x) I scgread(& segs); 4 U& L! v8 m) p, f6 V 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 $ `; l4 B: w% d; Z- U% a { 8 }% N6 b* z- K/ a# u2 H / * 读取文件日期时间 * / " |9 s5 X1 d8 J9 p+ [& g! F handle = Outregs.x.ax; ' f; Y: O% i: V( p e4 u inregs.x.ax = 0x5700; 5 Q: Y& u+ b) }# e5 ?' O% E. I 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; 0 r. V& _0 M" i; v6 T) b if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / & q8 K# }) g6 G, a& M* L { 5 ^% t; q* \; l* I2 _2 L inregs.x.ax = 0x5701; . w: I" N7 ~" f" o inregs.x.bx = handle; 3 v6 w: ?1 M$ f* ?8 N6 t! h: X inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / " T& n/ X* ^2 L1 \4 h inregs.x.dx = outregs.x.dx; + q2 v& o: V2 [ intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / # N9 |; ^9 e4 ~- E7 o# `. b% A return(2); 2 W7 s! N; i# p; m( Q$ M5 {" b } 9 x% S: F0 D: S else return(1); * A2 N3 c5 A0 e / * 关闭文件 * / $ `2 v; M5 `( J! a* X# n% D inregs.h.ah = 0x3e; ( [# ?4 { C0 H M- C: ^" q8 C7 E* d* w inregs.x.bx = handle; : M% @& p' `2 {7 I2 r/ g+ i+ O- U+ { intdosx(& inregs, & outregs, & segs); 8 V, V' S1 t! G4 r } / b* r- Y8 t N- z} 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