You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无网络环境下如何获取精准时间?授权软件防篡改方案咨询

离线授权软件防时间篡改的精准时间获取方案

开发一款离线授权软件,要求用户修改系统时间时仍能获取精准时间(例如系统时间改为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)由硬件计时器驱动,不受系统时间修改影响,是可靠的时间流逝参考:

  • 首次运行时:
    1. 获取当前系统时间(假设此时未被篡改)作为初始真实时间 T_real_initial
    2. 通过Windows API(如GetTickCount64()或QueryPerformanceCounter())获取系统运行时长 Uptime_initial
    3. 将这两个值加密存储到本地(比如隐藏文件、注册表项),防止用户篡改
  • 后续运行时:
    1. 获取当前系统运行时长 Uptime_current
    2. 计算时间流逝量:elapsed_time = Uptime_current - Uptime_initial
    3. 精准时间 = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:31