世上最完整的软件安全解释以及实例Word文件下载.docx
- 文档编号:633423
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:81
- 大小:1.95MB
世上最完整的软件安全解释以及实例Word文件下载.docx
《世上最完整的软件安全解释以及实例Word文件下载.docx》由会员分享,可在线阅读,更多相关《世上最完整的软件安全解释以及实例Word文件下载.docx(81页珍藏版)》请在冰点文库上搜索。
inttransmit_timestamp_seconds;
inttransmit_timestamp_fractions;
};
BOOLGetNetTime(SYSTEMTIME&
newtime)
{
WORDwVersionRequested;
WSADATAwsaData;
//初始化版本
wVersionRequested=MAKEWORD(1,1);
if(0!
=WSAStartup(wVersionRequested,&
wsaData))
{
WSACleanup();
returnFALSE;
}
if(LOBYTE(wsaData.wVersion)!
=1||HIBYTE(wsaData.wVersion)!
=1)
WSACleanup();
//这个IP是中国大陆时间同步服务器地址,可自行修改
SOCKETsoc=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
structsockaddr_inaddrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(123);
NTP_PacketNTP_Send,NTP_Recv;
NTP_Send.Control_Word=htonl(0x0B000000);
NTP_Send.root_delay=0;
NTP_Send.root_dispersion=0;
NTP_Send.reference_identifier=0;
NTP_Send.reference_timestamp=0;
NTP_Send.originate_timestamp=0;
NTP_Send.receive_timestamp=0;
NTP_Send.transmit_timestamp_seconds=0;
NTP_Send.transmit_timestamp_fractions=0;
if(SOCKET_ERROR==sendto(soc,(constchar*)&
NTP_Send,sizeof(NTP_Send),
0,(structsockaddr*)&
addrSrv,sizeof(addrSrv)))
closesocket(soc);
intsockaddr_Size=sizeof(addrSrv);
if(SOCKET_ERROR==recvfrom(soc,(char*)&
NTP_Recv,sizeof(NTP_Recv),
addrSrv,&
sockaddr_Size))
floatSplitseconds;
structtm*lpLocalTime;
time_tntp_time;
//获取时间服务器的时间
lpLocalTime=localtime(&
ntp_time);
if(lpLocalTime==NULL)returnFALSE;
//获取换算后时间
newtime.wYear=lpLocalTime->
tm_year+1900;
newtime.wMonth=lpLocalTime->
tm_mon+1;
newtime.wDayOfWeek=lpLocalTime->
tm_wday;
newtime.wDay=lpLocalTime->
tm_mday;
newtime.wHour=lpLocalTime->
tm_hour;
newtime.wMinute=lpLocalTime->
tm_min;
newtime.wSecond=lpLocalTime->
tm_sec;
//设置时间精度
Splitseconds=(float)ntohl(NTP_Recv.transmit_timestamp_fractions);
Splitseconds=(float)0.000000000200*Splitseconds;
Splitseconds=(float)1000.0*Splitseconds;
newtime.wMilliseconds=(unsignedshort)Splitseconds;
returnTRUE;
}
套接字的知识可以在网路安全一章读到。
3)读本机上某个文件的最后访问时间
如果用户不上网,就不好取这个日期。
先用CreateFile打开一个文件,可以获取某个文件的建立时间、最后访问时间、最后写的时间。
由于文件时间格式的问题,需要调用FileTimeToLocalFileTime将文件时间转成本地时间。
BOOLGetFileTime(
HANDLEhFile,
LPFILETIMElpCreationTime,
LPFILETIMElpLastAccessTime,
LPFILETIMElpLastWriteTime
BOOLFileTimeToLocalFileTime(
constFILETIME*lpFileTime,LPFILETIMElpLocalFileTime);
比如在QQ的聊天留下的图片的文件夹下C:
\ProgramFiles\Tencent\QQ\Users\****\Image下,一般有个叫Thumbs.db的文件如果发现了有文件的建立时间,比现在本机的本机时间早,说明用户更改了本地时间。
使用BOOLCFile:
:
GetStatus(LPCTSTRlpszFileName,CFileStatus&
rStatus)获取时间更方便。
可以写成如下的函数:
voidGetAFileTime(SYSTEMTIME&
CFileStatusr;
CStringfile="
C:
\\ProgramFiles\\Tencent\\QQ\\Users\\**********\\Image\\
Thumbs.db"
;
CFile:
GetStatus(file,r);
r.m_atime.GetAsSystemTime(newtime);
//最后访问时间
4)完整实现
找到应用程序的初始化函数InitInstance(),在AfxSocketInit()运行后添加如下代码:
SYSTEMTIMEt1,t2,t3;
:
GetLocalTime(&
t1);
//取本地时间
GetNetTime(t2);
//取网络时间
GetAFileTime(t3);
//取文件时间
if(t1.wYear>
2012&
&
t1.wMonth>
3&
t1.wDay>
20)return0;
if(t2.wYear>
t2.wMonth>
t2.wDay>
if(t3.wYear>
t3.wMonth>
t3.wDay>
注意:
在程序初始化是要选中套接字。
完整程序见“日期限制演示程序”。
2、连续运行时间限制
连续运行时间限制是指从程序开始运行,运行到一定的时间后,可能程序退出或限制某些功能的使用。
连续运行时间限制一般通过定时器实现。
1)添加定时器消息函数
如图2-1所示。
2)建立定时器
BOOLC连续运行时间限制Dlg:
OnInitDialog()
CDialog:
OnInitDialog();
SetIcon(m_hIcon,TRUE);
//设置大图标
SetIcon(m_hIcon,FALSE);
//设置小图标
//TODO:
在此添加额外的初始化代码
SetTimer(1,60000,NULL);
//定时器60000毫秒运行一次
//除非将焦点设置到控件,否则返回TRUE
图2-1添加定时器消息函数
3)添加时间检查代码
voidC连续运行时间限制Dlg:
OnTimer(UINT_PTRnIDEvent)
在此添加消息处理程序代码和/或调用默认值
staticinttimeout=30;
if(timeout==0):
ExitProcess(0);
timeout--;
OnTimer(nIDEvent);
上面的程序在连续运行半小时后自动退出。
3、按钮或菜单功能限制
下面的两个API函数可以实现按钮或菜单的使能和变灰。
BOOLEnableWindow(HWNDhWnd,BOOLbEnable);
//hWnd是窗口句柄,bEnable=FALSE,按钮变灰,否则变亮
BOOLEnableMenuItem(
HMENUhMenu,
UINTuIDEnableItem,
UINTuEnable
hMenu是菜单句柄,uIDEnableItem是菜单子项的ID,uEnable决定是否使能。
4、运行次数限制
只允许运行若干次。
次数可以先由安装程序写在磁盘的某个位置。
比如某文件中,磁盘扇区或注册表。
下面是将次数放在注册表的例子,主要代码如下。
BOOLCTimesApp:
InitInstance()
HKEYkey;
longre=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"
SOFTWARE\\Microsoft\\
Windows\\CurrentVersion"
0,KEY_ALL_ACCESS,&
key);
//打开注册表
if(re!
=ERROR_SUCCESS){
MessageBox(0,"
打开键失败"
"
提示错误"
MB_OK);
return0;
DWORDtimes=4,type=0,len;
//查询注册表SOFTWARE\\Microsoft\\Windows\\CurrentVersion下的times
re=RegQueryValueEx(key,"
times"
0,&
type,(LPBYTE)(&
times),&
len);
=ERROR_SUCCESS){//若不存在,说明是首次运行,设置次数为4
欢迎使用,最多5次"
提示"
RegSetValueEx(key,"
0,REG_DWORD,(unsignedchar*)(&
times),
sizeof(DWORD));
else{
//次数减1,判断是否为0
times--;
if(times==0){
次数已到,不能使用"
RegCloseKey(key);
//到0了,直接退出
times),4);
CStringinf;
inf.Format("
剩余次数%d"
times);
MessageBox(0,inf,"
//提示剩余次数。
这段代码要放在应用程序初始化的方法InitInstance()中。
运行时界面如图2-2。
图2-2次数限制
5、设置水印
比如某扫描控件,为IE所调用,控制扫描仪的扫描。
如果没有注册,在扫描10次后,将在扫描的图片中显示水印。
添加水印可以在函数OnPaint()中通过调用下面的API实现。
BOOLExtTextOut(
HDChdc,//handletoDC
intX,//x-coordinateofreferencepoint
intY,//y-coordinateofreferencepoint
UINTfuOptions,//text-outputoptions
CONSTRECT*lprc,//optionaldimensions
LPCTSTRlpString,//string
UINTcbCount,//numberofcharactersinstring
CONSTINT*lpDx//arrayofspacingvalues
整个过程如下:
1)设置全局变量,分别为整形num,用来表示已经打开的图片数,初始化为0,打
开的文件名为CString类型fname。
2)添加画图函数
voidC添加水印Dlg:
ShowPicture(char*lpstrFile,HWNDhWnd)
//显示图片,此文的重点之所在了,lpstrFile为图片文件名,hWnd为窗口句柄
HDChDC_Temp=:
GetDC(hWnd);
IPicture*pPic;
IStream*pStm;
BOOLbResult;
HANDLEhFile=NULL;
DWORDdwFileSize,dwByteRead;
//打开图形文件
hFile=CreateFile(lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!
=INVALID_HANDLE_VALUE){
dwFileSize=GetFileSize(hFile,NULL);
//获取文件字节数
if(dwFileSize==0xFFFFFFFF)return;
}
elsereturn;
//分配全局存储空间
HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
LPVOIDpvData=NULL;
if(hGlobal==NULL)return;
if((pvData=GlobalLock(hGlobal))==NULL)//锁定分配内存块
return;
ReadFile(hFile,pvData,dwFileSize,&
dwByteRead,NULL);
//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&
pStm);
//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&
pPic);
if(FAILED(bResult))return;
OLE_XSIZE_HIMETRIChmWidth;
//图片的真实宽度,单位为英寸
OLE_YSIZE_HIMETRIChmHeight;
//图片的真实高度,单位为英寸
pPic->
get_Width(&
hmWidth);
get_Height(&
hmHeight);
//转换hmWidth和hmHeight为pixels距离
intnWidth=MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
intnHeight=MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->
Render(hDC_Temp,0,0,nWidth/4,nHeight/4,0,hmHeight,hmWidth,-hmHeight,NULL);
Release();
CloseHandle(hFile);
//关闭打开的文件
if(SUCCEEDED(bResult)){
return;
else{
3)添加选取图片文件的函数,如下
OnBnClickedButton1()
CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,NULL,this);
dlg.m_ofn.lpstrInitialDir="
E:
\\docs\\photo\\fa"
dlg.m_ofn.lpstrFilter="
jpgFiles(*.jpg)\0*.jpg\0bmpFiles(*.bmp)\0*.bmp\0AllFiles(*.*)\0*.*\0\0"
if(dlg.DoModal()!
=IDOK)return;
fname=dlg.GetPathName();
num++;
this->
Invalidate();
图2-3水印演示
4)在OnPaint()中添加显示图片和水印的代码
if(fname!
="
"
)ShowPicture((char*)fname.GetBuffer(0),this->
m_hWnd);
if(num>
=5){
HDChdc;
hdc=:
GetDC(this->
//获得设备句柄
SetTextColor(hdc,RGB(255,0,0));
ExtTextOut(hdc,50,140,ETO_CLIPPED,NULL,inf,strlen(inf),NULL);
完整的程序见“添加水印”。
程序显示如图2-3。
2.3软件注册
经常遇到有软件需要注册才能安装。
一般的是每个软件有一个注册码。
软件的注册码由另一个程序生成。
软件安装时,需要拿输入的注册码与软件中已经保存的注册码或注册码经过加密的值进行比较。
我们先模拟生成注册码,然后得到注册码的Md5值。
安装程序中保留了这个Md5值。
当用户安装时,要输入注册码,如果输入错误,则提示错误并不再安装。
1、生成注册码模拟
界面如图2-4。
图2-4生成注册码
要运用到第一章的MD5算法。
第一列控件是5个编辑框,名字分别为m_e1~m_e5,第二列的编辑框为5个编辑框中字符串的Md5值。
序列号用随机数生成。
voidC模拟生成序列号Dlg:
BYTEkey[5];
CStrings1,s2,s3,s4,s5;
srand((unsigned)time(NULL));
for(inti=0;
i<
5;
i++)key[i]=(BYTE)rand()%16;
s1.Format("
%01X%01X%01X%01X%01X"
key[0],key[1],key[2],key[3],key[4]);
m_e1.SetWindowTextA(s1);
//生成第1个编辑框中字符
s2.Format("
m_e2.SetWindowTextA(s2);
//生成第2个编辑框中字符
s3.Format("
m_e3.SetWindowTextA(s3);
//生成第3个编辑框中字符
s4.Format("
key
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 世上 完整 软件 安全 解释 以及 实例