数学建模社区-数学中国

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

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

1 T9 j6 F0 l! {' N

0 S$ p0 N) E% b; n

软件试用次数的限制有很多种方法,其关键是把次数这个值存储在哪里。本文介绍一种方法,通过改变文件 的时间来存储试用次数,从而限制软 件的试用。 7 }- D6 h7 s' b; F7 O" k一、通过改变文件时间来限制软件的试用次数 % s; `* {1 D' d, w 在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。 2 W* f+ h, k- x C0 s9 d' `; Y 二、示例程序中所涉及的中断 : {1 o, x: u3 C: G P0 a1.中断21H的功能3DH " O- B9 j+ q6 Y: ?) u3 P: u 用途:打开文件用于读。写或补 充。 3 [) }4 a4 N# \. \+ q4 F 调用寄存器:AH=3DH,AL=00H,DSX=文件名; & t: k) x1 `1 ~ 返回寄存器:CF 复位--成功,AX=文件把柄。 9 b! }3 O p( _9 K$ D9 g CF 置位--出错,AX=错误代码。 ) B' ~* S+ o- S1 A/ j' [& Y 2.中断21H的功能3EH ; ?0 H5 t$ J$ h P+ H% [" }& R 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 . w: P) B( ~% m$ I0 J' M 调用寄存器:AH=3EH,BX=文件把柄; " i: Q% D5 d7 [+ O 返回寄存器:CF 复位--成功,AX被破坏, : L& i. Y* ]- S% Y# Q5 e* C$ J) J9 q3 i" e CF 置位--出错,AX=错误代码。 $ B5 P+ p6 {; z1 [4 B 3.中断21H的功能57H、子功能00H " h7 T7 M" r0 r6 m+ g; J0 Q* |; @ ]- Y 用途:读出文件被最后修改的日期和时间。 ; L. p6 v: h1 J7 e7 [# R9 L 调用寄存器:AX=5700H,BX=文件把柄; 7 z; v5 x" e' n" h7 h, R2 R 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, " ^. ?6 M. L' M% P& F CF 置位--出错,AX=错误代码。 X6 \( v v" A, G3 `: c 4。中断21H的功能57H、子功能01H 8 z' v3 V" t% `/ b% z- ~/ e# O" |1 ` 用途:将文件最后被修改过的日期和时间信息变 成指定值。 : T" [( D$ B, p. [+ w 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; * e6 [, `! N( ~9 w 返回寄存器:CF 复位--成功, . Z& W# B# p: r3 y: a) O" S CF 置位--出错,AX=错误代码。 ) j" H. ]5 _( ?' K 三、示例程序 & X* y; w5 r3 b9 x6 J! y#include <sidio.h> " E" f$ z6 ]( `0 C) H4 z #include <dos.h> ! [) i, k* f9 M4 m) V #include <conio.h> 2 O# H* L7 I2 R- R int count( ) ) ?" d& `2 |' N; k3 P1 j { & O4 {5 e- i \# `1 g union REGS inregs,outregs; 0 f. f0 Z/ c! ^ strut SREGS segs; + I( E8 D& f% i unsigned handle; 0 N9 Z: {) G) A4 C' E- a/ g3 w: w unsigned times; ) D f* z/ A8 K: |6 v% D! W8 j1 G / * 打开文件 * / 4 S% S; V1 \ }# E inregs.h.ah =0x3d; 6 Z q+ C. i5 G) G$ @1 A" B7 Z inregs.h.al =0; , t* W8 W9 J M/ Y9 u. V scgread(& segs); 9 o) `4 M8 l' l& s inregs.x.dx ="test.exe"; 5 f1 Z, L9 w& w3 @ intdosx(& inregs, & outregs, & segs); % w4 k' {' K. Y if(outregs.x.cflag) return(0); 9 ^; \/ f+ R( I9 `8 Y else 0 M4 D& n2 ~" L8 E7 S { / Z5 h! O0 x7 V% X. O$ j) e / * 读取文件日期时间 * / + N' k* V' ?9 r" @ handle = Outregs.x.ax; % p0 L( z* {# l! Z! U# A2 F inregs.x.ax = 0x5700; : e6 z* ^" q; S! W inregs.x.bx = handle; . v0 [: w1 U+ ]8 ^3 T( T7 a intdosx(& inregs, & outregs, &segs); ! g: d- H! I- Z0 n$ q8 T times = (outregs.x.cx &0x7e0)> > 5; ( s7 m; \0 v+ m/ ^; {7 R. h7 j if(times <40)/ * 试用次数可以通过改变此处的'40'来实现 * / 7 T9 Q1 u, q( a# i { 6 n1 S, k \. N9 j inregs.x.ax = 0x5701; , k* O8 |8 y8 Q( p F8 L7 N4 _3 @ inregs.x.bx = handle; * k- @% h0 ?- U& X: F: O inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * / " a1 ]7 e! i, W( M3 i3 z! Y inregs.x.dx = outregs.x.dx; 2 }; L# y$ M1 G3 h, M" U intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * / 7 O# y4 N1 n2 X, ` return(2); s; L, c( U9 R. Y } + i3 K' t1 k8 C1 u else return(1); 5 W1 h; g. R8 ^+ x5 |; \; O / * 关闭文件 * / / I' I) x- F0 h& ~ inregs.h.ah = 0x3e; $ q$ |& H& D: n( y4 z8 l inregs.x.bx = handle; - g$ X1 D& D/ D/ t) R intdosx(& inregs, & outregs, & segs); " T- O& ~& p+ _" f } % h. {( F8 o1 C. E" P; j& l" ]! P- s } 6 L# x& U1 [3 w$ D1 D& ? main() 4 {% P$ A/ c$ N1 I5 B* V" F5 {. i{ . o- D3 z w' ~$ x# g int flag; 9 X# q- ~$ H9 Y9 G- R( t flag = count(); ( V! x* _! q" B9 _0 _ if(flag==0) printf("此软件为试用版,请勿任意修改!\ n"); 5 B- Y' L$ }) z5 d4 c if(flag==1) printf("此软件为试用版,您的试用次数已满!\n"); Q0 g" l( J2 J( h3 C+ N5 E if(flag==2) printf("此软件为试用版,欢迎试用!\n"); 6 S. V, t2 |- V; b} " V- L) o- u) P, Q4 w6 l2 T6 x






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