V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
okface
V2EX  ›  程序员

离线软件激活码生成方案?

  •  
  •   okface · 2020-07-25 20:55:46 +08:00 · 10596 次点击
    这是一个创建于 1587 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 python 的 wxpython 写了个小软件,这软件也值不了几个钱,用户也都是完全不懂注册机和破解的人,想问大家最简单实现的离线认证方案是什么呢
    40 条回复    2020-07-27 08:26:13 +08:00
    iamwho
        1
    iamwho  
       2020-07-25 20:56:49 +08:00
    打开程序弹窗提醒用户联网。
    l549349545
        2
    l549349545  
       2020-07-25 20:57:04 +08:00 via Android
    离线就是机器码混淆呗
    okface
        3
    okface  
    OP
       2020-07-25 21:02:31 +08:00
    @iamwho 用这个软件的电脑基本都只在内网环境下使用哈,不连外网
    okface
        4
    okface  
    OP
       2020-07-25 21:04:11 +08:00
    还有就是想实现期限内激活码有效,比如使用个半年一年的自动失效,这个离线可以实现吗。。
    ysc3839
        5
    ysc3839  
       2020-07-25 21:05:10 +08:00 via Android
    非对称加密算法,可以参考一下 RSA 的原理,自己实现一个。注册码用私钥生成,软件里用公钥验证。
    这么做能确保第三方很难实现生成注册码的工具,不过防不了一个注册码重复使用。
    AX5N
        6
    AX5N  
       2020-07-25 21:06:08 +08:00
    没搞过,我猜就是设计一个可逆的算法,可以胡乱写一个?
    时效这个应该也是可以实现的,保证激活码解码后带有日期信息就得了。
    ysc3839
        7
    ysc3839  
       2020-07-25 21:06:40 +08:00 via Android   ❤️ 1
    @okface 限制使用时间的话无法实现,因为你没有一个可信的方法获取当前时间。
    chinvo
        8
    chinvo  
       2020-07-25 21:10:20 +08:00
    都 python 的了, 也没啥意义...

    最简单用 序列号 + 机器序列号 算个校验码就完事儿了
    tivizi
        9
    tivizi  
       2020-07-25 21:11:11 +08:00 via iPhone
    抛开软件破解不谈。

    非对称加密是个好的解决办法。

    CA 证书给客户签发的证书中包括有效期,机器识别码等信息,作为授权码。软件放 CA 公开证书,验证授权码的有效性,并检验授权码有效期,以及机器识别码是否一致等。
    qile1
        10
    qile1  
       2020-07-25 21:12:48 +08:00 via Android
    晚上有个开业的 python 实现注册码的项目

    其实把 mac 或者硬盘 id 做个简单的 md5 验证,时间做 bas64 编码在做几个位运算就可以
    AX5N
        11
    AX5N  
       2020-07-25 21:15:44 +08:00
    这个主要取决于你的对手是什么人,是老实的普通人,还是鸡贼的普通人。后者自己不会搞,但可以找朋友搞啊。又或者是肯花钱的鸡贼的普通人,愿意花大价钱找非常专业的人搞。又或者是懂点技术,但不会破解也不会拉下脸找人搞的技术员。

    说真的,破解一个非专业方案的软件并不需要多少技术,就是时间多少而已。你可以算一下对方脱壳+解密+逆向你的算法需要的时间成本来决定。如果你只觉得你这个软件值 50 块,对方要花 100 个小时来破解,那就让他去破解吧。
    mxT52CRuqR6o5
        12
    mxT52CRuqR6o5  
       2020-07-25 21:15:47 +08:00 via Android
    用户执行的是 exe 不,是的话可以直接用一些现成的方案(当然想破解也很好破解,毕竟代码都在 python 那边,保护不了代码)
    loading
        13
    loading  
       2020-07-25 21:30:01 +08:00 via Android
    我上次因为特殊原因需要破 j 一个非常偏门的小型业内软件(属于个人软件),我从学习到成功,还没到半天,实际操作只用了 10 分钟。

    楼主你随便选个方案就行了,不用太费神。
    tanranran
        14
    tanranran  
       2020-07-25 21:35:09 +08:00
    加密狗
    crab
        15
    crab  
       2020-07-25 21:39:29 +08:00
    @okface 离线下的限制时间或者使用次数可以用首次运行记录当前时间加密写到注册表。(前提注册表内容不被删除)
    iamwho
        16
    iamwho  
       2020-07-25 21:45:54 +08:00
    @okface #3

    那就把客户当成不会尝试去破解程序的人去做就好了。
    kokutou
        17
    kokutou  
       2020-07-25 21:46:21 +08:00 via Android
    内置 rsa key 配合读取硬盘序列号(这个要注意固态硬盘序列号很长或者杂牌固态没有序列号。。。),读取网卡 mac 地址,Windows 系统 uuid 等等实现一机一码和防止简单算号。
    然后还要注意留各种暗桩。
    最后上个 tmd 壳 vmp 壳
    时间可以在注册码里写进去。
    时间验证防不了人家修改系统时间。。。
    如果是有客户端的系统,可以通过客户端和服务的对时间的方式防一防。。。
    WeaPoon
        18
    WeaPoon  
       2020-07-25 21:50:06 +08:00
    这类网上应该很多,不过 py 有没有就不清楚了。
    使用授权文件验证方式,把时间信息等的写入文件里,加密方式用 RAS 。
    机器码对比等,机器码可以用主板硬盘等等硬件信息组合。
    这样对方给你提供个机器码,你自己用机器码+时间+其他信息生成个授权文件即可。
    Coioidea
        19
    Coioidea  
       2020-07-25 22:14:10 +08:00
    硬盘信息学到了!那么硬件指纹有伪造手段吗?
    abersheeran
        20
    abersheeran  
       2020-07-25 22:18:24 +08:00
    直接参考 JWT 的手段。你用 RSA 算法签发。然后程序内嵌公钥,使用公钥对 JWT 验证。JWT 再包含一下有效期,完事了。没必要自己造轮子。
    stillyu
        21
    stillyu  
       2020-07-25 22:20:19 +08:00   ❤️ 1
    涉及到时间,注册码这一类的都不行,用带内置时钟的加密狗
    ifxo
        22
    ifxo  
       2020-07-25 22:31:50 +08:00
    简单就是 vmprotect,加壳防破解,激活码和时间限制全都有,还有很多虚拟化软件都可以做到,直接把你的 exe 文件打包,都挺贵的
    love
        23
    love  
       2020-07-25 23:23:48 +08:00
    lz 都说了只防君子不防小人,那用简单的过期时间+随机字串加密得到码,程序里解码就行
    silymore
        24
    silymore  
       2020-07-26 00:04:11 +08:00 via iPhone
    楼上说 rsa 的那种密钥都很长吧,几十字节,离线不好输入的,有短的方案吗,普通软件 12 或者 16 位那种是怎么弄的
    wangyzj
        25
    wangyzj  
       2020-07-26 00:49:06 +08:00
    20200726 << 1
    abc612008
        26
    abc612008  
       2020-07-26 01:05:39 +08:00
    @silymore 不确定安全性怎么样,但是可以把 rsa 签名再 hash 一遍减少长度。
    abc612008
        27
    abc612008  
       2020-07-26 01:06:25 +08:00
    @silymore @abc612008 想了下不大对,hash 完了就没法校验了…
    shiji
        28
    shiji  
       2020-07-26 04:18:27 +08:00
    @tivizi 上一代的 Navicat 的破解方法就是直接扒出来软件里的公开证书,替换掉。
    ysc3839
        29
    ysc3839  
       2020-07-26 06:27:01 +08:00 via Android
    @silymore 要短的话只能缩短 RSA 密钥的位数,但安全性会大大降低。
    网上许多输入短注册码的程序被破解出注册机,可能不是因为开发商不知道用非对称加密算法,而且因为长度太短了很容易就被暴力破解了。
    delectate
        30
    delectate  
       2020-07-26 08:12:14 +08:00
    就看你肯付出的成本。
    低成本就是 硬件 id+timestamp+随机码,注册码含时间限制或者永久激活信息;
    中成本是硬件狗;
    高成本是加上一个通信模块(如 4g 通信模块+电波 /gps 授时模块),根据硬件上报的数据进行判断。

    不过,既然都离线了,就别整那些没用的,有一万种方法破解,强如微软不也无可奈何吗?
    zjgsamuel
        31
    zjgsamuel  
       2020-07-26 08:41:45 +08:00
    硬件狗省事~
    ys0290
        32
    ys0290  
       2020-07-26 09:27:28 +08:00 via iPhone
    @ysc3839 内置计数器可否?超过限定时间就过期
    ychost
        33
    ychost  
       2020-07-26 10:36:39 +08:00
    简单点,再复杂的都能破,参考 RSA 校验
    CallMeReznov
        34
    CallMeReznov  
       2020-07-26 11:58:30 +08:00
    你既然都说不懂了,就直接在脚本里写好 deadline 然后用 pyinstaller 打包,超过时间就不允许运行.

    如果别人硬是想破解,py 的话怎么都能整出来源码啊
    zxcslove
        35
    zxcslove  
       2020-07-26 12:30:46 +08:00   ❤️ 1
    楼主啊,现在智能手机普及,可以视为一个变相联网的途径,可以考虑这方面做一些文章。比如有些软件通过公众号获取使用密码的思路。
    learningman
        36
    learningman  
       2020-07-26 13:03:17 +08:00
    如果用户是真的完全不懂。。。
    我觉得 input() == key 就够了
    realpg
        37
    realpg  
       2020-07-26 13:55:42 +08:00   ❤️ 2
    给你个最简单的算法 不反破解的 只防啥也不懂的

    C:\Users\{Username}\AppData\Local\
    首次启动,向目录写入一个文件
    文件名为
    register.db
    文件内容为一个 50 位的随机数,两次 md5 后的字符串纯文本

    然后 输入注册码的界面 显示一个机器码 这个机器码得出的方式为 那个文件的两次 md5 值,不是那个文件的内容,机器码为 32 位的 16 进制字符串,也可以将其转为 10 进制变为一个长数字

    然后给你机器码 你用算法算成注册码给用户 用户填入得出授权是否有效


    注册码生成算法为
    预设到期日期假如为 20200901,转成字符串,拆解成 8 个字符 记为 A B C D E F G H

    机器码进行 sha1 得出一个十六进制字符串,拆解成 char 数组,按以下索引顺序重新组合成一个字符串 其中 ABCDEFGH 是上文的字符

    7,29,A,4,0,B,12,2,C,1,14,D,9,32,E,17,4,F,19,33,G,13,24,H,5,27,30,20


    得到一个 28 位的字符串

    然后将这个 28 位的字符串进行 SHA1 hash,得到一个字符串,取其中的第 9 位开始,连续取 4 位,字符串,作为校验码


    然后将前面的 28 位字符串和这四位校验码进行拼接成一个字符串,作为注册码。


    在离线 APP 验证时,先通过后四位计算注册码合法性

    然后用机器码计算出 hash 判断前面的合法性,如果完全合法,提取出 ABCDEFGH 拼接成到期日期
    ysc3839
        38
    ysc3839  
       2020-07-26 13:56:03 +08:00 via Android
    @ys0290 “内置计数器”指的是什么?
    phithon
        39
    phithon  
       2020-07-26 14:32:02 +08:00
    你想的太复杂了,不考虑破解的情况下,就可以简单用 sha256 这类哈希来解决。

    具体方案我举个例字。你首先准备一个你自己的密钥 key,你给用户签发注册码的时候,就是简单的这样:

    sha256(当前时间戳 time, key)

    然后得到一个签名字符串 cert,然后你再把当前时间戳附在这个 cert 后面,形成一个新的字符串 cert:time,这个就是你给用户签发的注册码。

    然后用户填写这个字符串以后,程序拿到这个字符串,用冒号分割,得到 cert 和 time 。然后程序先用自己内置的密钥 key 来重新计算一遍 sha256(time, key),和用户传入的 cert 比对,如果不相等,则直接退出;如果相等,我们再比较当前时间,和用户传入的时间 time 的差,是否超过你要求的期限,如果超过,也直接退出。
    lopetver
        40
    lopetver  
       2020-07-27 08:26:13 +08:00
    建议去吾爱破解问下,那里矛与盾的激烈碰撞
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1047 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:50 · PVG 05:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.