Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320033
  • 博文数量: 10
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1485
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 13:56
文章分类

全部博文(10)

文章存档

2008年(10)

我的朋友

分类: C/C++

2008-05-30 09:44:39

最近查看代码,发现应该给服务器软件增加“系统时间保护”功能,否则如果在其运行期间,系统时间被修改(手工修改或被其他软件修改),对其内部逻辑会造成一定影响和隐患。
此功能在2003年曾经编写过,是在另外的软件上使用的,手段很简单,效果却很好,现把实现方法说明于此,供参考:(无意中发现360安全卫士也发布了一个类似的软件,估计实现原理是不是类似?)
 
总的来说,思路就是在系统时间被修改后,立即再将其改回来!(如果要求再苛刻些,可以考虑API Hook)
1. 以对话框程序为例,在主对话框中定义如下的成员变量和函数:
protected:
// 记录软件的启动时间
CTime m_tmStartup;
DWORD m_dwStartupTickValue;
BOOL m_bCanChangeSystemTime;
void Reset_CanChangeSystemTime(void) { m_bCanChangeSystemTime = FALSE; }
void Set_CanChangeSystemTime(void) { m_bCanChangeSystemTime = TRUE; }
2. 在对话框初始化时(比如构造函数中),加入如下代码:
// 初始化用来阻止修改系统时间的变量
m_tmStartup = CTime::GetCurrentTime();
m_dwStartupTickValue = ::GetTickCount();
Reset_CanChangeSystemTime();
3. 加入WM_TIMECHANGE消息处理函数,代码大致如下:
void CDummyDlg::OnTimeChange()
{
   CDialog::OnTimeChange();
   ////////////////////////////////////////////////////////////
   // 以下代码将完成“系统时间保护”的功能
   ////////////////////////////////////////////////////////////
   /* 试图被修改的时间 (此时已经被修改了) */
   CString csTrytoChanged = CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");
   if (! m_bCanChangeSystemTime)
   {
     /* get duration from scb startup (as seconds) */
     DWORD dwDuration = (::GetTickCount() - m_dwStartupTickValue) / 1000;
  
     /* get the time we should set back to system clock */
     CTime tmSetBack = m_tmStartup + CTimeSpan(dwDuration);
  
     /* set back the time, prevent modifying */
     SYSTEMTIME st;
     tmSetBack.GetAsSystemTime(st);
     Set_CanChangeSystemTime(); // 关闭保护,这样我们才能修改时间
     if (! ::SetLocalTime(&st)) Reset_CanChangeSystemTime(); // 修改完成后,重新开启保护
  
     // Popup user message
     CString csMsg;
     csMsg.Format(IDS_STRING33016, csTrytoChanged); // IDS_STRING33016的内容是:"系统时间试图被修改为%s,已拦截。"
     MessageBox(csMsg);

   }
   else Reset_CanChangeSystemTime(); /* reset the flag */
}
 
 
Done! Pretty easy? ^^
阅读(607) | 评论(0) | 转发(0) |
0

上一篇:救灾的任务实在艰巨啊。。。

下一篇:没有了

给主人留下些什么吧!~~