軟件試用次數的限制有很多種方法,其關鍵是把次數這個值存儲在哪裡。本文介紹一種方法,通過改變文件的時間來存儲試用次數,從而限制軟件的試用。
一、通過改變文件時間來限制軟件的試用次數
在MS-DOS中,文件的時間是 通過一個16位的值來保存的,位 15~11用來保存小時數,位10~5用 來保存分鐘數,位4~0用來保存秒鐘數。這個16位的值正好可以被我們用來保存試用次數。例如,在下面的示例程序中,筆者就使用了保存分鐘數的位來保存試用次數。運行一下示例程序,我們可以看到,只是文件時間的分鐘數加了1,一般人很難察覺,這種方法有比較好的隱蔽性。
二、示例程序中所涉及的中斷
1.中斷21H的功能3DH
用途:打開文件用於讀。寫或補充。
調用寄存器:AH=3DH,AL=00H,DS:DX=文件名;
返回寄存器:CF 復位--成功,AX=文件把柄。
CF 置位--出錯,AX=錯誤代碼。
2.中斷21H的功能3EH
用途:強迫清除所有緩沖區,更新目錄,使文件把柄無效。
調用寄存器:AH=3EH,BX=文件把柄;
返回寄存器:CF 復位--成功,AX被破壞,
CF 置位--出錯,AX=錯誤代碼。
3.中斷21H的功能57H、子功能00H
用途:讀出文件被最後修改的日期和時間。
調用寄存器:AX=5700H,BX=文件把柄;
返回寄存器:CF 復位--成功,CX=文件時間, DX=文件日期,
CF 置位--出錯,AX=錯誤代碼。
4。中斷21H的功能57H、子功能01H
用途:將文件最後被修改過的日期和時間信息變 成指定值。
調用寄存器:AX=5701H,BX=文件把柄,CX= 新時間,DX=新日期;
返回寄存器:CF 復位--成功,
CF 置位--出錯,AX=錯誤代碼。
三、示例程序
#include <sidio.h>
#include <dos.h>
#include <conio.h>
int count( )
{
union REGS inregs,outregs;
strut SREGS segs;
unsigned handle;
unsigned times;
/ * 打開文件 * /
inregs.h.ah =0x3d;
inregs.h.al =0;
scgread(& segs);
inregs.x.dx ="test.exe";
intdosx(& inregs, & outregs, & segs);
if(outregs.x.cflag) return(0);
else
{
/ * 讀取文件日期時間 * /
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'來實現 * /
{
inregs.x.ax = 0x5701;
inregs.x.bx = handle;
inregs.x.cx = outregs.x.cx + 0x20; / * 試用次數計數 * /
inregs.x.dx = outregs.x.dx;
intdosx(& inregs, & outregs, & segs); / * 重置日期時間 * /
return(2);
}
else return(1);
/ * 關閉文件 * /
inregs.h.ah = 0x3e;
inregs.x.bx = handle;
intdosx(& inregs, & outregs, & segs);
}
}
main()
{
int flag;
flag = count();
if(flag==0) printf("此軟件為試用版,請勿任意修改!\ n");
if(flag==1) printf("此軟件為試用版,您的試用次數已滿!\n");
if(flag==2) printf("此軟件為試用版,歡迎試用!\n");
}