无网络环境下如何获取精准时间?授权软件防篡改方案咨询
离线授权软件防时间篡改的精准时间获取方案
开发一款离线授权软件,要求用户修改系统时间时仍能获取精准时间(例如系统时间改为2022或2024时,软件仍显示2023)。曾尝试通过Win32_BIOS获取主板时间,但仅能得到出厂时间,偏差较大,相关尝试代码如下:
import clr clr.AddReference("System.Management") import System.Management select_1 = "SELECT * FROM Win32_BIOS" info = System.Management.ManagementObjectSearcher(select_1) info_list = [strInfo_1.Properties for strInfo_1 in info.Get()] ipconfig_list = {} for info_array in info_list: for i in info_array: ipconfig_list[i.Name] = i.Value print(ipconfig_list)
可行的离线时间获取方案
1. 基于系统运行时长+首次运行基准时间
系统运行时长(Uptime)由硬件计时器驱动,不受系统时间修改影响,是可靠的时间流逝参考:
- 首次运行时:
- 获取当前系统时间(假设此时未被篡改)作为初始真实时间
T_real_initial - 通过Windows API(如
GetTickCount64()或QueryPerformanceCounter())获取系统运行时长Uptime_initial - 将这两个值加密存储到本地(比如隐藏文件、注册表项),防止用户篡改
- 获取当前系统时间(假设此时未被篡改)作为初始真实时间
- 后续运行时:
- 获取当前系统运行时长
Uptime_current - 计算时间流逝量:
elapsed_time = Uptime_current - Uptime_initial - 精准时间 =
T_real_initial + elapsed_time
- 获取当前系统运行时长
2. 结合系统关键文件时间交叉验证
为应对系统重启导致运行时长重置的问题,可搭配系统关键文件的创建时间(用户几乎不会修改)做补充:
- 选择Windows核心文件(如
C:\Windows\system32\kernel32.dll),其创建时间为系统安装时间T_sys_install - 首次运行时记录
delta = T_real_initial - T_sys_install - 重启后,若运行时长重置,可通过
T_sys_install + delta结合系统运行时长的增量来恢复真实时间
3. 代码实现示例(Python调用Windows API)
import ctypes import datetime import os import pickle # 加密存储基准数据的路径(可改为隐藏路径或注册表) BASE_DATA_PATH = "time_base.dat" def get_system_uptime(): # 使用GetTickCount64获取系统运行时长(毫秒) kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) return kernel32.GetTickCount64() def get_real_time(): if not os.path.exists(BASE_DATA_PATH): # 首次运行,初始化基准数据 t_real_initial = datetime.datetime.now() uptime_initial = get_system_uptime() # 加密存储(此处用pickle示例,实际需加密) with open(BASE_DATA_PATH, 'wb') as f: pickle.dump((t_real_initial, uptime_initial), f) return t_real_initial else: # 读取基准数据 with open(BASE_DATA_PATH, 'rb') as f: t_real_initial, uptime_initial = pickle.load(f) # 获取当前运行时长 uptime_current = get_system_uptime() # 计算流逝时间 elapsed = datetime.timedelta(milliseconds=uptime_current - uptime_initial) return t_real_initial + elapsed # 测试 print("精准时间:", get_real_time())
注意事项
- 存储的基准数据必须加密,防止用户手动修改
- 需处理系统休眠/睡眠状态:
GetTickCount64()会包含休眠时间,若需排除可使用QueryUnbiasedInterruptTime()API - 可结合多个时间源交叉验证,进一步降低被篡改的风险
内容的提问来源于stack exchange,提问作者SmblScr47
相关产品推荐
相关产品推荐

