如题,想请教各位业界大佬,一个软件给到客户处,客户不联网,时间不会跟着网络时间更新,根据本地时间的话,他可以私自改动时间导致控制不住,开服务的话,服务也可能被关掉吧。想请教一下有没有什么好的控制方式?
1
laravel 2019-09-20 16:00:10 +08:00
我刚毕业时候出差给火车站安装的广告机,管理系统需要插 U 盘才能运行,他们的机器有些就不让联网。
|
2
yoshiyuki 2019-09-20 16:00:25 +08:00
软件内部计时
|
3
secretman 2019-09-20 16:03:08 +08:00
签名证书加上过期时间戳?
|
4
fileinthehole OP @secretman 改时间怎么办?
|
5
fileinthehole OP @yoshiyuki 中途软件可能关闭之类的,怎么办?还是有改时间的问题
|
6
fileinthehole OP @laravel 插 U 盘是什么原理??
|
7
viko16 2019-09-20 16:10:58 +08:00 via Android 1
直接当买断,加钱就好
|
8
fileinthehole OP @viko16 就一个自己做的免费小软件,但是领导不想让客户一直用···
|
9
qq316107934 2019-09-20 16:12:58 +08:00
没有任何控制方式,可以考虑通过使用时长进行控制,注意防止数据库被重置。
|
10
lneoi 2019-09-20 16:15:35 +08:00
记录上一次使用日期,如果日期跳跃过大直接禁用
|
11
jadehare 2019-09-20 16:16:12 +08:00
强制联网啊,不联网不给用,或者加个时间判断,先记录个时间,然后看当前时间比记录的时间靠前,就不让上
|
12
newtype0092 2019-09-20 16:19:21 +08:00 2
记录在可执行文件末尾或者某个用不到的地方,每次运行时修改。
|
13
fileinthehole OP @qq316107934 使用时长的话,如果设置 7 天,每天用几分钟,岂不是实际可以使用一年
|
14
fileinthehole OP @newtype0092 你这个记录是记录什么?还是可以通过改时间继续使用吧
|
15
fileinthehole OP @lneoi 比如我 12:00:00 使用,后来发现过期了,我修改时间为 12:00:01 岂不是又可以用了
|
16
lneoi 2019-09-20 16:22:50 +08:00
@fileinthehole 这描述说明,打开之后才发现过期,没打开之前不知道过期。那不就一过期就设置标志位,使得时间判断无效就行了。
|
17
Buges 2019-09-20 16:23:03 +08:00
判断系统时间,发现过期后禁用并写个控制字段然后始终禁用不再检查时间。
别搞什么奇技淫巧,能挡住普通小白就够了。 |
18
fileinthehole OP @Buges 就怕没过期的时候就开始改时间了
|
19
arrow8899 2019-09-20 16:24:40 +08:00
无解
|
20
newtype0092 2019-09-20 16:25:13 +08:00
@fileinthehole 记录运行的时间啊,每过 1 分钟或多久写一次,够 7 天就禁止,相当于在本地写个配置文件,只不过按特定的规则直接写在可执行文件里,一般人想不到,想到了不知道规则也改不了,改坏了程序跑不起来了。
|
21
fileinthehole OP @arrow8899 我们想了好几种方法,但领导老是给你钻牛角尖,把客户想成高端黑客[/手动白眼]
|
22
Leez088 2019-09-20 16:27:00 +08:00
到期后,卸载掉在安装能用吗
|
23
fileinthehole OP @newtype0092 这种就只能控制他一共使用不超过 7*24*60 分钟,但这么多分钟可以分配到一年甚至更久的之间之内
|
24
opengps 2019-09-20 16:27:49 +08:00
定期强制要求联网激活,检测到假日期自动删除
|
25
dp2px 2019-09-20 16:28:14 +08:00
你的程序没有计数器(因为会关闭或关机)唯一的计数器( PC 的计时)还会被修改,这样导致你没有可以参考的时间点。但是据说关机后 CMOS 芯片会有电,会保存时间,如果你能拿到这个时间作为参考,每次在用户更改的时候能获取到时间的变化事件,那么从时间角度就可以实现。
|
26
fileinthehole OP @Leez088 不用安装的,就一个小软件,也就不存在卸载
|
27
DoubleShut 2019-09-20 16:28:32 +08:00
直接写在代码里,每次编译的时候自动生成过期时间,类似于代码生成,过期直接不能使用,联网更新自动打新包给他
|
28
fileinthehole OP @opengps 怎么检测到假日期呢
|
29
airfling 2019-09-20 16:28:52 +08:00
你自己维护一个计数,这个计数就是时间差,定时保存到数据库或者文件里面,具体做法就是你保存到数据库中的 id 用 uuid+你这个计数的加密编码,你每次读取的时候就判断一下 id,把这个加密编码解密,然后判断这个数字,然后下次存储就是在这个基础上加上已经过去的时间差,你过期就根据这个数字,如果客户问你 id 是怎么设计的,你就说是公司自己设计的一套 id 生成算法,属于保密条例之类的就可以了。这个数肯定是一直增大的,最后无论怎么样,肯定会过期 ,怎么改都没用
|
30
zlhsvc 2019-09-20 16:29:16 +08:00
强制要求联网,不然不给用。纯本地了话你校验 bios 时间都能改
|
31
fileinthehole OP @DoubleShut 你这个他可以把电脑的时间一直停留在给他软件那天
|
32
qq316107934 2019-09-20 16:30:03 +08:00
@dp2px #25 BIOS 可以直接修改时间的
|
33
lneoi 2019-09-20 16:31:45 +08:00
@fileinthehole 运行时就不断更新记录时间,增加用户修改时间的麻烦程度。一般用软件调时间,随便调容易超过允许范围,总是设置倒回同一个时间点,记录一下是否多次重复这个时间,是多次则禁用。
|
34
qq316107934 2019-09-20 16:32:52 +08:00
设备是你们的吗?是的话可以通过锁 BIOS+驱动 /组策略禁止用户修改时间来实现。 不是的话不能通过外界渠道获取信息这个命题就不成立,无解的。
|
35
fileinthehole OP @qq316107934 没有设备,就是把一个软件给客户的电脑上用一下,控制一下其他设备,其他设备也是不联网的
|
36
WanzizZ 2019-09-20 16:34:31 +08:00
还是判断系统时间,比如每过 10 秒,记录一次当前时间,如果他改时间,那修改以后的时间肯定要比记录的时间要提前,这样直接禁用。
|
37
amaranthf 2019-09-20 16:35:04 +08:00
每次开启时记录日期+时间,然后关闭时也记录,累加天数就好,比如累加到 30 天就终止使用。
如果发现某次开启时的时间比上次关闭时的时间还要靠前,那也无所谓,累加 1 天甚至惩罚性地累加两天、三天随你。 如果要绕过这个策略,就必须每次调整时间为同一天的上一次关闭后的时间,而且还得他确实理解了你这个策略才行。 如果还想堵上漏洞,那就去查某些系统文件的访问、修改时间。 |
38
buf1024 2019-09-20 16:35:11 +08:00
程序首次启动时,获取客户当前机器时间,程序退出时,程序自己加上刚才获取是时间生成过期的加密时间,生成一个新的程序,将新的程序替换旧的程序即可。程序再次启动时,就可以知道过期时间了。
|
39
WanzizZ 2019-09-20 16:36:04 +08:00
如果遇到说时间一直不变的,也直接禁用
|
40
fileinthehole OP @WanzizZ 假设我先用了一分钟从 20 号 12:00:00 用到了 20 号 12:01:00,第二天了,感觉快过期了,吧时间改回 20 号 12:00:10s,岂不是又可以用了?
|
41
LokiSharp 2019-09-20 16:37:44 +08:00
用个加密狗,加密狗上写死时间
|
42
fileinthehole OP @buf1024 不太明白,能详细说明一下吗
|
43
fileinthehole OP @LokiSharp 写死时间是什么操作?我把时间一直改成过去某一时间能破么
|
44
lneoi 2019-09-20 16:38:53 +08:00
@fileinthehole 你是一直在更新时间的,多用一分钟记录时间多多跟进一点。
|
45
fileinthehole OP @lneoi 那还是可以 10 分钟分到 10 天去用··
|
46
Buges 2019-09-20 16:40:34 +08:00 via Android
|
47
WanzizZ 2019-09-20 16:41:14 +08:00
肯定不会,因为我已经记录了 20 号 12:01:00,第二天再把时间改成 20 号 12:00:10,这样是不是记录的时间比系统时间要大。 不过还是不行,只能记录使用时长。
|
48
fileinthehole OP @Buges 哈哈哈,这句话我也想拿去怼领导,光让人做一些莫名其妙的活,这软件破解了又不能给自己转账,谁没事破解你的小软件嘛
|
49
lneoi 2019-09-20 16:43:23 +08:00
@fileinthehole 你们软件每次只用一分钟的吗?
|
50
fileinthehole OP @lneoi 举个例子罢了,可能这次用个几分钟,下次用个几小时,再下次就只是打开瞧一眼就关了呢
|
51
lneoi 2019-09-20 16:45:07 +08:00
@fileinthehole 对嘛,实际只考虑正常使用状况。除非你们软件主要使用频率就是瞧一眼就关,要不然是没问题的。
|
52
imicksoft 2019-09-20 16:45:16 +08:00
电脑上的文件的时间默认是不是不会大于当前时间?那多找几个文件的时间做依据来判断行不行?
比如遍历桌面、windows 目录、临时目录中的文件,取出最大的时间,当成最新的时间,如果这个时间大于你想限定的时间就不让用了。 客户修改了系统的时间设置,但不能修改这些文件的时间,除非客户遍历修改系统中所有文件的时间。 |
53
LokiSharp 2019-09-20 16:45:20 +08:00
@fileinthehole #43 你可以在加密狗里记录每次打开的时间,然后估算一下他可能开启的次数,如果发现时间异常或者到达限制就锁死加密狗,提示需要找你们技术支持更新加密狗。
|
54
lneoi 2019-09-20 16:46:47 +08:00
还有就是估算使用次数咯。前面翻了翻 win 下的文件,但没找到会实时更新修改时间的文件,不然可以靠读取系统文件的修改时间作为辅助判断
|
55
loading 2019-09-20 16:47:27 +08:00 via Android 1
无解
你做过破解就知道,你用 x 天,破解就用 x 分钟。 |
56
lneoi 2019-09-20 16:47:48 +08:00
你这情况是纯粹依赖外部输入,让用户一点儿便宜不占太难,只要不要占太多便宜,减少自己误判就行了。
|
57
janxin 2019-09-20 16:54:02 +08:00
要求用狗,用狗的时钟就可以了
|
58
amaranthf 2019-09-20 16:54:08 +08:00
啧,看来楼主没看懂,比如用户 1 号 9:00 开启了软件,9:01 关闭了,作为一组,记住,然后用户 2 号 9:00 开启了,你开启的时候就知道累计天数+1。然后他 2 号 10:00 又开启,12:00 关闭,那就不累加,只是记下来。
然后你发现用户下次开启时,居然是 2 号 9:00,这特么就不对了,果断累计天数+1 (甚至+2 ),同时也把这一条记下来,每组记录排好序,方便下次比较。 然后下次开启时,你就直接去枚举 C:\Windows\Temp 目录下每一个文件的访问时间,按最晚的来比较。如果发现里面没文件,那再换 c:\$RECYCLE.BIN 之类的,列一个表依次往里面找。 再下次再换 event log,找里面的各种系统事件记录,总能找到的。 |
59
l00t 2019-09-20 16:54:20 +08:00 2
你们软件是开源白盒的吗?如果不是的话,就得默认客户并不清楚你们的计时策略,不用设计得太复杂,能防住简单地修改回时间的就行了。预期客户能搞清你们的策略,还不如预期客户能直接反编译程序在你们判断的位置打个 patch 跳过呢。
|
60
amaranthf 2019-09-20 16:58:19 +08:00
最后你要觉得用户可能会去专门找人、甚至花点小钱破解你的软件的话,那就去找个最新版的 VMProtect 之类的软件,把刚才提到的所有校验逻辑保护起来,数据保存时也要挖足够的坑来混淆视线。
|
61
3dwelcome 2019-09-20 16:59:10 +08:00 via Android
本地定时记录时间到数据库,只增不减,如果发现客户时间异常,就启动自爆程序。
也就是说,客户只能往后改时间,不能往前改时间。 |
62
zdnyp 2019-09-20 17:03:57 +08:00
每次运行的时候都记录时间,本次运行的时间不能小于上次记录的时间
|
63
chengyiqun 2019-09-20 17:05:24 +08:00
本地计时, 加密写到配置文件和注册表就完事了. 有的软件甚至加密都懒得做.
|
64
antscript 2019-09-20 17:17:22 +08:00 via iPhone
1.打开软件 - 检测是否有本地时间记录
有 - 2 没有 - 3 2.检测本地记录时间是否早于系统时间 是 - 4 不是 - 5 3.本地记录当前时间并加密(记录在一个不容易找到的位置) 4.正常使用,定期执行 3 2 5.提示系统时间有错,锁定软件 |
65
lilquen 2019-09-20 17:25:19 +08:00 1
既然无法使软件完全做到过期不准使用,那就换个思维;使它破解的成本大于购买的成本就好了?客户一直要改时间来使用这个软件岂不是很烦(干脆买就好了)?
|
66
jimrok 2019-09-20 17:28:35 +08:00 1
如果你的软件跟时间没有关系,确实不好做。但如果软件里需要记录正确时间才能正常工作的,确实好做。改了时间,数据就全乱了。
|
67
momocraft 2019-09-20 17:37:45 +08:00 4
想办法在逻辑里依赖单调增的系统时间,然后合同里写明 因用户环境出错导致的数据错乱你不负责
|
68
Devilker 2019-09-20 17:46:20 +08:00
三分钟的事儿,加个试用期 PE 壳
|
69
smdbh 2019-09-20 17:46:44 +08:00 via iPhone
上 USB,硬件计数
|
70
KevZhi 2019-09-20 17:53:43 +08:00 via iPhone
又造轮子
自带时钟和电池的加密狗了解一下? |
71
mamahaha 2019-09-20 17:57:53 +08:00
别想了,没好办法,cad 软件公司的实力都是毋容置疑的,但很少见到没被破解的。
最好的办法就是不联网就没法使用。 |
72
wuhongwei 2019-09-20 18:00:32 +08:00
|
73
starsriver 2019-09-20 18:05:05 +08:00 via Android 6
adobe 在中国二十年防盗版抗衡,十四个版本换了四次认证方式,不联网自动关闭软件,计时试用,cc 统一认证和在线不定时检查完整性。。
没有一个不被破解。 我只能说,你看着办。 |
74
crab 2019-09-20 18:07:18 +08:00
加壳类的软件都是写注册表,记录首次时间。
|
75
passerbytiny 2019-09-20 18:07:45 +08:00
@fileinthehole #37 如果要 7 天变成“每天 5 分钟,总共用好几年”,那么他每次使用后都必须记录当时的时间,除第一次外每次使用前都必须修改系统时间,并且一次错——忘了改或改错了——都不能犯。如果他经常使用,那么“多次超高精确性”的修改系统时间,是无穷大的成本,要你的软件比火星贵他才值得这么做。(别想着用脚本代替人工,那太容易出错了,何况写脚本也是成本。)如果他只是偶尔使用,那么实际上你并没有任何损失。
|
76
hstdt 2019-09-20 18:09:04 +08:00 via iPhone
说说我的想法,就用本地时间就可以了。设置过期时间,再按照顺序记录启动时间。如果启动时间在过期时间之前来回变,就禁用,让用户联网激活。同时两次启动时间相同也禁用。把用户改时间的成本提高就好了。
|
77
ys0290 2019-09-20 18:09:18 +08:00 via iPhone
打点计数,一小时一点,够数关闭
|
78
viator42 2019-09-20 18:12:55 +08:00 via Android
客户端本地保存一个值随时间递减,减到 0 之后软件自动关闭。客户想继续用的话编译一个新的软件包发过去。我上一家就是这么干的
|
79
secretman 2019-09-20 18:14:36 +08:00
首次使用,签名文件就加上开始时间和过期时间,用特殊方式签名就好
问题在于签名文件会被删掉,注册表也会有问题,时间会被篡改 这个其实看破解成本对方能不能承受吧 没有完美的方式~ 参考 surge3 的试用限制,看看能不能有些收获! |
80
explore365 2019-09-20 18:16:43 +08:00
每秒读取系统时间记录一个时间戳,每秒读取系统时间,如果系统时间早于上次时间戳 XX 秒(修改电脑时间了),软件禁用。
|
81
pelloz 2019-09-20 18:17:34 +08:00
随便弄弄,一般的小工具应该不会有人花大精力给你破解,攻与防是需要考虑成本的
|
82
fvckDaybyte2 2019-09-20 18:19:29 +08:00 via iPhone
记录使用时间呗,每次开启到关闭时间差,保存本地,累计到多少时间就不让用……
|
83
newtype0092 2019-09-20 18:45:39 +08:00
如果长时间使用的程序才计时,短时间使用的要记次,或者两者都记,一旦断网你的程序就是一个孤岛,任何外部时间数据都是不可信的,能从内部记录的只有使用时长和使用次数。
|
84
nguoidiqua 2019-09-20 18:51:44 +08:00 via Android
自己固化个起始时间和截至日期,电脑时间不在这个范围就不给用。
然后,使用时定时记录新的时间,电脑时间早于这个记录时间就不给用。 这样虽然还可以在退出软件后钻空子,调回退出时的时间以延长使用期,但终究用一次少一次。 |
85
heart4lor 2019-09-20 18:58:44 +08:00
感觉楼上的方法只有读取加密狗时间可取,否则纯离线的物理机可以恢复到任一时间节点的状态,包括你的可执行程序、系统时间、楼上很多人提的各种记录时间的方法,不管多复杂的方法,物理机状态一回退都直接没用。这样想的话只能靠外部的状态无法回退的加密狗解决
|
86
yoshiyuki 2019-09-20 19:01:26 +08:00
@fileinthehole 要落盘存储
|
87
crazykylin 2019-09-20 19:05:15 +08:00 via Android
我这个思路你看行不,比如客户要装到某个机器,你们先读取硬盘 smart 信息,把序列号和硬盘运行时间写到软件,设定个硬盘运行到某个时间,软件不能正常打开,换硬盘因为序列号不一致也打不开,客户再牛逼能把硬盘已运行时间改了? 那要是能改的话,没有啥好主意了
|
88
InternetExplorer 2019-09-20 19:08:06 +08:00
银行的 U 盾方案了解一下
|
89
heart4lor 2019-09-20 19:11:08 +08:00 1
很多人想的把时间或者类似信息写入二进制程序的想法,或者读取系统 tmp 文件时间等等想法,可能没有想到程序本身状态也是可以回退的。最简单的办法,装完之后对全盘做个 GHOST 或这类似的备份,等到有效期过了直接改 BIOS 时间为备份时时间,然后对全盘还原备份。这样的话理论上说还原后整个物理机的状态和刚开始使用程序时的状态一模一样,任何限制方法都没有作用。
|
90
nguoidiqua 2019-09-20 19:13:29 +08:00 via Android
杜绝是不可能的,总之多种方法增加钻空子的麻烦度就是了,可以多种方法混合用。
至于破解,有能力破解就不会找你们写这种小软件了,找人破解不要钱啊。 还有,最好的办法就是让他联网,他联网简简单单的事,为什么要自己找麻烦… |
91
wweir 2019-09-20 19:28:33 +08:00 via Android
电脑内部有个特殊的时间,是对主板上的时钟计数得来的,可保证绝对准确。
不过这个只能计算相对时间,算不出绝对时间 |
92
luopengfei14 2019-09-20 19:28:54 +08:00 via iPhone
1、不给联网就报错,不让用。联网验证时间。
2、限制软件免费使用次数。 |
93
qilishasha 2019-09-20 19:32:32 +08:00 via iPhone
软件运行时间做计数器,超过设定时间就自动加密数据库和修改类,实践证明很有效
|
94
tennc 2019-09-20 19:50:14 +08:00
加壳 试用期 一周 就好了
|
95
westerndream 2019-09-20 20:09:53 +08:00
@heart4lor 来个影子系统
|
96
sdxlh007 2019-09-20 20:10:46 +08:00
弄个带计时功能的加密狗不就完了么
|
97
guokeke 2019-09-20 20:21:46 +08:00
记录软件的运行时间,比如每各 5s 累加一次,写的时候加密,再设置一个最长使用时间。
|
98
fxxwor99LVHTing 2019-09-20 20:41:05 +08:00
@fileinthehole 弄一个倒计时,但计时为零的时候,软件的使用受到限制。
|
99
fxxwor99LVHTing 2019-09-20 20:43:23 +08:00
|
100
shfanzie 2019-09-20 20:53:20 +08:00
加密狗啊
|