如何禁止修改系统时间

zbking 2008-10-10 09:12:05
由于我的系统在运行时客户修改系统时间会带来系统上的漏洞,请问该如何在我软件运行时禁止修改系统时间?谢谢了
...全文
5833 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunyuan 2009-10-03
  • 打赏
  • 举报
回复
实现这项功能最基本的一个函数就是WndProc(ref Message message)函数,其次我们还要知道系统消息的代码值,比如说关机消息的代码值就是0x0011。接下来我们以关机消息为例进行讲解:



首先定义关机消息代码值

private const int WM_QUERYENDSESSION = 0x0011; //关机消息定义



其次在WndProc函数中处理消息

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_QUERYENDSESSION:
// 你的处理代码
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}



其中还有一个方法可以控制系统消息,那就是bool PreFilterMessage(ref System.Windows.Forms.Message m)。



用法如下:

//添加监视消息
private void Form_Load(object sender, System.EventArgs e)
{
  Application.AddMessageFilter(this);
}

//撤消消息监视
private void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  Application.RemoveMessageFilter(this);
}



public bool PreFilterMessage(ref System.Windows.Forms.Message m)

{

case 513: //拦截左键单击事件       

MessageBox.Show("哈哈,你点击了左键被拦截!");//返回true则消息被裁取,系统不再处理    

case 516: //拦截左键单击事件       

MessageBox.Show("哈哈,你点击了右键被拦截!");//返回true则消息被裁取,系统不再处理     default:      

return false; //返回false则消息未被裁取,系统会处理  

}
justindreams 2008-10-13
  • 打赏
  • 举报
回复
直接去取服务器时间不就得了,干嘛非要人家不能修改系统时间,你这个又不是流氓软件。
slin60 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kyle315 的回复:]
引用 3 楼 zx005 的回复:
控制面板--管理工具--本地安全策略--本地策略--用户权利指派→右边“更改系统时间”
双击后删除用户
同时BIOS上也加上密码

=================================
我已经实现过,用的就是这种方式,不过这个方法只适用于NT系统,win98的话不行,不过可以用别的方法实现。
[/Quote]


在win98上,你的程序多半也执行不起来(2.0好像最少都需要win2000),何来不行之说?
vrhero 2008-10-13
  • 打赏
  • 举报
回复
这个问题是网络管理的问题,用AD域就能解决...

如果没有AD域网络,就要把客户端写成系统服务或者隐藏进程,定时与时间服务器对时,同时监视文件%systemRoot%\system32(Win9x是system)\timedate.cpl,发现它删除...
helloDongXiu 2008-10-13
  • 打赏
  • 举报
回复
mark.........
kook_tian 2008-10-13
  • 打赏
  • 举报
回复
楼上那个不行,他这一看就是cs程序,没准数据库和客户端都在一台服务器上,要不取数据库时间不就完事了,何必去系统时间。

如果你这是单机版程序无法解决这个问题,你不可能不允许用户改自己机器时间,你只能告诉他不要改。改了就更新程序。或是把数据库分开,不要取系统时间,取数据库时间。
  • 打赏
  • 举报
回复
我的解决方法是:
在服务器数据库上建立一个视图:SELECT CONVERT(varchar(10), GETDATE(), 121) AS DateNow
然后取这张视图中的当前日期
yilanwuyu123 2008-10-13
  • 打赏
  • 举报
回复
你软件的加密方式是有问题的

考虑其他加密方式吧
lovehongyun 2008-10-13
  • 打赏
  • 举报
回复
不让客户机修改本地windows的时间?

你还是想些别的办法吧.

zbking 2008-10-13
  • 打赏
  • 举报
回复
找了个VB的,请大侠帮我转成C#的

当任何程序或用户修改系统时间的时候,系统会将 WM_TIMECHANGE消息到所有的进程,我们的程序可以捕获到该消息,然后将系统时间恢复到修改前的状态,这样就可以在我们的程序运行时系统时间的正确性,代码如下:

'窗体form1(需要一个timer控件,interval=1000):

Private Sub Form_Load()
Timer1_Timer
RegisterWindow Me.hwnd '为窗口设置子类
End Sub

Private Sub Form_Unload(Cancel As Integer)
unRegisterWindow Me.hwnd '取消窗口的子类
End Sub

Private Sub Timer1_Timer()
OldTime = Now
End Sub

'模块modle1:

Option Explicit
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Public OldTime As String
Public ChangeFlag As Boolean
Public Const WM_TIMECHANGE As Long = &H1E '当系统的时间变化时发送此消息给所有顶级窗口
Public oldproc As Long
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Declare Function SetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) As Long

Public Function RegisterWindow(hwnd As Long) As Long
If hwnd <> 0 Then
oldproc = SetWindowLong(hwnd, -4, AddressOf WinProc)
End If
End Function
Public Function unRegisterWindow(hwnd As Long) As Long

If hwnd <> 0 Then
SetWindowLong hwnd, -4, oldproc
End If

End Function
Public Function WinProc(ByVal hwnd As Long, ByVal msg As Long, ByVal lpara As Long, ByVal wpara As Long) As Long

Dim i, mytt

If msg = WM_TIMECHANGE And ChangeFlag = False Then '系统时间被修改了而且不是本程序修改的

ChangeFlag = True '本程序要修改系统时间

Call SetToOldTime '修改系统时间

Exit Function

End If


ChangeFlag = False

WinProc = CallWindowProc(oldproc, hwnd, msg, lpara, wpara)


End Function
Public Function SetToOldTime() As String '将时间恢复到设置前的状态
Dim tmp As String
tmp = OldTime '从保存的时间中取出修改前的系统时间
Dim lpSystemTime As SYSTEMTIME
lpSystemTime.wYear = Year(tmp) '取出年份
lpSystemTime.wMonth = Month(tmp) '取出月份
lpSystemTime.wDayOfWeek = -1
lpSystemTime.wDay = Day(tmp) '取出日
lpSystemTime.wHour = Hour(tmp) '取出小时
lpSystemTime.wMinute = Minute(tmp) '取出分钟
lpSystemTime.wSecond = Second(tmp) '取出秒
lpSystemTime.wMilliseconds = 0
'set the new time
SetLocalTime lpSystemTime

End Function


Ki1381 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 zbking 的帖子:]
由于我的系统在运行时客户修改系统时间会带来系统上的漏洞,...
[/Quote]

不了解具体情况。我猜是不是类似于这样的场景:按钮A背后的业务只能在0:00 -12:00 做,按钮B的业务只能在12:00-24:00做?你怕用户修改本地时间导致执行了不该执行的业务逻辑。

那完全可以在触发业务逻辑之前先判断一下服务器时间,比如利用SQL语句 select getdate() as nowTime等。
guest78978 2008-10-12
  • 打赏
  • 举报
回复
如果禁止用户修改系统的时间,那会对操作系统造成伤害我觉得不可取,还是用获取服务器时间或者把上次登录的时间加密后保存到一个地方,登录自己的系统时候进行判断比较,这样好些吧。
zbking 2008-10-12
  • 打赏
  • 举报
回复
有用代码实现禁止修改时间的吗?
qshzf 2008-10-12
  • 打赏
  • 举报
回复
你的要求是非常困难的,因为Windows不是你写的。人家要是不给你这个功能你就不能实现。
你可以获得服务器时间,作为当前时间。
我们写erp都是这样做的。
xuegangwww 2008-10-12
  • 打赏
  • 举报
回复
Fibona 2008-10-11
  • 打赏
  • 举报
回复
强制限制是不行的,我觉得可以通过获取时间服务器的时间来做为程序中的统一时间,每一次要用到时间处理的时候通过向时间服务器请求
IMAGSE 2008-10-11
  • 打赏
  • 举报
回复
呵呵,用98的现在也不多了吧~

kyle315 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zx005 的回复:]
控制面板--管理工具--本地安全策略--本地策略--用户权利指派→右边“更改系统时间”
双击后删除用户
同时BIOS上也加上密码
[/Quote]
=================================
我已经实现过,用的就是这种方式,不过这个方法只适用于NT系统,win98的话不行,不过可以用别的方法实现。
mathsfan 2008-10-10
  • 打赏
  • 举报
回复
好象3楼的方法也可以。
见:http://hi.baidu.com/8281315/blog/item/b2ff0f177a3737054a90a7da.html
我的想法是,你能不能程序一运行就修改注册表,禁止修改时间,关闭软件就又改回去呢?
没测试过哈,呵呵。
zbking 2008-10-10
  • 打赏
  • 举报
回复
我可以取到到服务器时间,问题是如何捕获系统时间被修改的消息或事件终止用户修改时间
加载更多回复(4)
系统是基于Springboot+vue实现的在线考试系统,适合用于毕业设计进行二次开发,也可以作为工作的开发经验。适合刚毕业的大学生和刚入行的初级软件工程师。本课程会讲解常用的Springboot 和Vue知识和搭建环境的过程,让初学者迅速地在本地开发环境搭建起来,成功运行本套代码。迅速的理解前后端开发的过程,能够完成简单的的bug修改,理解前后端的交互。不管你是初入职场或即将进入职场,想深入学习和了解 Spring Boot 框架和 Vue 的话,那这门课几乎是你最好的选择项目含前端和后端知识,对于前端开发人员和后端开发人员都是一个很好的学习选择。学生系统功能模块介绍登录用户名、密码注册年级、用户名、密码任务中心管理员发布的年级任务,每个学生只能做一次考试题干支持文本、图片、数学公式、表格等,学生答题支持:文本固定试卷可重复练习、自行批改的试卷时段试卷在时间限制内,可重复练习、自行批改的试卷考试记录查看答卷记录和试卷信息错题本答错题目会自动进入错题本,显示题目基本信息个人信息显示学生个人资料更新信息修改个人资料、头像个人动态显示用户最近的个人动态消息中心用于接收管理员发送的消息管理系统功能模块介绍登录用户名、密码主页试卷总数、题目总数、用户活跃度、题目月数量学生列表显示系统所有的学生,新增、修改、删除、禁用管理员列表显示系统所有的管理员,新增、修改、删除、禁用学科列表学科查询、修改、删除学科创编创建学科试卷列表试卷查询、修改、删除试卷创编创建的试卷为时段试卷、固定试卷、任务试卷题目列表题目查询、修改、删除题目创建题目支持单选题、多选题、判断题、填空题、简答题,题干支持文本、图片、表格、数学公式任务列表任务查询、修改、删除消息列表显示已发送的消息,消息已读人数等信息消息发送发送消息给多个用户用户日志显示所有用户日志个人资料显示管理员用户名、真实姓名时间线显示管理员创建时间修改资料修改姓名、手机号项目架构项目展示  

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧