数学建模社区-数学中国

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

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

. W$ E; E" m7 d- j" [

/ \- 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,一般人很难察觉,这种方 法有比较好的隐蔽性。 $ v, [# c' f2 c5 M8 a9 V. r二、示例程序中所涉及的中断 & ]2 d K- f9 u6 Y: X 1.中断21H的功能3DH # m* V" h; [6 Y' s 用途:打开文件用于读。写或补 充。 / |, D# [* o: c" Z 调用寄存器:AH=3DH,AL=00H,DSX=文件名; 1 s" `* R9 X# b g8 y- A 返回寄存器:CF 复位--成功,AX=文件把柄。 & ~5 @( J. b: ^ CF 置位--出错,AX=错误代码。 , f) `1 Y# S d4 v3 D! ^. c 2.中断21H的功能3EH $ T2 `: M# j" [! e 用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。 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=错误代码。 * a2 n9 p4 c8 ?) O9 V 3.中断21H的功能57H、子功能00H 8 L1 q! M# y6 A1 l6 t 用途:读出文件被最后修改的日期和时间。 . s) W/ x$ a9 a7 |' X 调用寄存器:AX=5700H,BX=文件把柄; / s& H2 t' f6 u2 _3 m' n7 T 返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期, ! G( E, P& O- }1 T9 `, G0 N CF 置位--出错,AX=错误代码。 : F, H. q* H1 d9 t! E 4。中断21H的功能57H、子功能01H 0 w3 ]! K* B' L5 E 用途:将文件最后被修改过的日期和时间信息变 成指定值。 & i+ _/ R a& J 调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期; 1 z) }5 A8 Q; ? 返回寄存器:CF 复位--成功, 6 J3 w8 A2 C* r! m# M CF 置位--出错,AX=错误代码。 % i6 ~. s4 |/ N/ p6 ~4 b+ O" ~, F 三、示例程序 # z/ q& U. L7 c: v! W& f#include <sidio.h> - L9 e7 \8 y# C1 U2 _7 X$ F; c#include <dos.h> 4 C( I3 n* L4 i" L& m#include <conio.h> + m& W5 u: I- J7 Tint count( ) - c0 l5 ]3 V( r# n- J$ I: {{ % N) j( y/ G9 l j* z+ U union REGS inregs,outregs; / |6 O% `8 X0 S( n/ G strut SREGS segs; 5 W) [5 N* e ~( Q& C5 `9 N$ Y unsigned handle; 5 v- S7 S; A7 j } unsigned times; ; R7 c" u1 k% Y1 |$ K' B, V+ d / * 打开文件 * / 2 ^# S. `: M- \8 ]0 z$ ~ inregs.h.ah =0x3d; 0 u' E% [% Z+ W6 T* m% g8 T 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); 0 w! Y" j: E. L4 q3 E" r if(outregs.x.cflag) return(0); P3 a# z4 y8 q# K3 t) V* B else : N5 X& C; I9 h { * j& K) I M2 r" y+ S# W / * 读取文件日期时间 * / ! T- B- F5 G6 u @! o8 B3 V) T handle = Outregs.x.ax; # [ k7 |# F% L8 u- d' d inregs.x.ax = 0x5700; : l5 B2 _: Q! j3 i inregs.x.bx = handle; 5 A' I7 U( M/ `, ^5 b6 A1 O9 V intdosx(& inregs, & outregs, &segs); , K1 a+ u( x. P, T8 E# j8 U1 W" N times = (outregs.x.cx &0x7e0)> > 5; 2 i6 w+ R/ O. |$ t" C 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); / * 重置日期时间 * / 0 t0 d+ p3 A4 a% [5 ~8 s2 R% s' f) b" I* p) y return(2); ' U% ]" R5 g8 _' T' } } ( `! c1 P8 a7 N else return(1); ( K1 b3 c) d9 X, H / * 关闭文件 * / + u$ }( C0 v8 G5 q# N2 n' j 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); . D. G$ p" |! f' E" D& [7 ~( H5 d+ O } % l( z5 e. w. B0 t. P, z} 7 ?9 O7 f9 Y( Q9 ^+ P# K/ _1 y& wmain() 7 b; _/ L5 Q6 Q5 o+ A* H{ 2 I, k9 L3 A L9 w4 z int flag; 3 X: f, s6 L* k7 w, ^ flag = count(); + I* D' i; h. w# X8 s- s 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"); & ]# Y3 c8 }0 g} O4 i+ x+ ?6 f) W6 }






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