V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
mathzhaoliang
V2EX  ›  程序员

给软件增加防复制/盗版的功能,大家有什么好的建议?

  •  1
     
  •   mathzhaoliang ·
    neozhaoliang · 2019-01-04 10:40:56 +08:00 · 8889 次点击
    这是一个创建于 2180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    领导要求我给公司的软件产品开发一个防复制 /盗版的功能,就是说,防止用户私自将软件拷贝到另一台电脑上运行。为此需要将软件的注册号和硬件信息绑定(硬盘序列号,mac 地址), 最好是能和 cpu id 绑定,但是好像 cpu id 在 i3 以后就不能用了。开发语言限定为 C 语言。

    我们的软件目前是和硬件一起捆绑卖的,即卖出的电脑上安装了我们的系统,所以卖出电脑的硬件信息是知道的。

    现在有两个选择:

    1. 使用开源库 (这个是最好的方案,但是我不知道有什么这样的开源库?)

    2. 自己动手写一个。

    自己写一个的话,我的方案是这样的:

    • 在卖出产品时,根据用户的信息、硬件信息计算出一个 sha256 值 H,同时用 RSA 生成一对密钥 (Priv_Key, Pub_Key),将 H 用私钥 Priv_Key 加密以后得到 E,然后把 (E, Pub_Key) 这两个存储到软件中。

    • 在软件运行时,动态地读取硬件信息、用户名,计算 sha256 哈希值 H',并利用 Pub_Key 解密 E 得到原始 H,并比较 H 和 H',不匹配的话则说明用户更换了硬件。

    • 为什么不能直接存储 H 呢?这是因为 SHA256 算法是公开的,用户可以自己用初始信息算出 H 来,自己进行注册。但是加上 RSA 加密这一步以后,因为用户无法通过公钥算出私钥,所以他无法自己算出 E,所以无法自己注册。

    我知道破解的时候可以用跳转的方式跳过判定相等这一步,这种情况先不考虑,毕竟我们这个防破解只打算防一般的用户,不防高手。请大家看一看,这个方案可行不?有没有明显的漏洞?

    63 条回复    2019-01-06 00:11:23 +08:00
    yksoft1ex
        1
    yksoft1ex  
       2019-01-04 11:03:11 +08:00
    主程序先加个强壳。
    mathzhaoliang
        2
    mathzhaoliang  
    OP
       2019-01-04 11:37:13 +08:00
    @yksoft1ex 先不说壳,我这个方案有什么问题吗?我们这个程序只是一个辅助,也不能太复杂。
    geelaw
        3
    geelaw  
       2019-01-04 11:44:16 +08:00
    为什么用户不自己算出来自己的 H',然后自己生成一对密钥 (sk', pk') 然后自己算出来 (E', pk') 呢?

    另外这里你对“公钥”和“私钥”的使用方式有误。加密方案里用来加密的是公钥,解密的是私钥。
    defel
        4
    defel  
       2019-01-04 11:55:46 +08:00 via iPhone
    防普通用户直接存 H 也没事,普通用户不知道你怎么解密的。知道你加解密运作方式的用户,已经不是这样操作可以防止的了,还是加壳比较给力点,或者再上个加密狗。
    yukiww233
        5
    yukiww233  
       2019-01-04 11:56:04 +08:00
    你做的应该是签名和验签
    594duck
        6
    594duck  
       2019-01-04 12:00:37 +08:00 via iPhone
    for 什么平台的,买一套方案就好了。
    ggllioio
        7
    ggllioio  
       2019-01-04 12:14:00 +08:00 via Android
    类似于一些工程预算软件,用加密狗?
    agdhole
        8
    agdhole  
       2019-01-04 12:38:27 +08:00
    navicat 好像就是这么防盗版的,然后被人破掉了
    sdhzdmzzl
        9
    sdhzdmzzl  
       2019-01-04 12:46:23 +08:00
    lz 方案可行。没毛病,反正就是卖硬件,只要能判断是不是绑定的硬件就行了。硬件信息可以包括(硬盘序列号、mac 地址等)然后最好再来个时间的授权以及更新授权的接口。
    mathzhaoliang
        10
    mathzhaoliang  
    OP
       2019-01-04 12:50:01 +08:00
    @yukiww233  可否多说几句解释下?
    mathzhaoliang
        11
    mathzhaoliang  
    OP
       2019-01-04 12:50:34 +08:00
    @594duck 要是公司买一套方案,还招我做啥。
    mathzhaoliang
        12
    mathzhaoliang  
    OP
       2019-01-04 12:57:30 +08:00
    @geelaw 软件里面会和事先存储的 E 比较,这个 E 是用 Priv_key 加密得到的,他拿不到 Priv_Key,当然就不知道 E 是多少。除非他跳转的方法找到了 E 的存储地址,但是这个只对单个产品有效。

    还有,RSA 里面公钥私钥都可以用其中一个来加密,另一个来解密,二者的地位是相同的。我这里是 "任何客户端都可以解密,但是对方无法从解密算法反推出加密算法",这样避免对方写出注册机啊。
    zxp
        13
    zxp  
       2019-01-04 13:47:44 +08:00
    破解的时候可以用自己的 Priv_Key 来将另一台电脑的 H 加密到 E,制作出补丁包同时替换掉 (E, Pub_Key) ,来使复制版在新电脑上运行了,所以还需要一个强悍的壳。
    jim9606
        14
    jim9606  
       2019-01-04 13:48:34 +08:00
    这套的弱点是软件内置的公钥会不会被注入篡改,而且没法引入 nonce 抵抗重放攻击(硬件信息采集的 api 可以被 hook )

    @geelaw 楼主这里应该用的应该叫签名而不是加密(签名用私钥加密,加密是用私钥解密),RSA 下签名和加密是一样的
    lsj8924
        15
    lsj8924  
       2019-01-04 14:16:05 +08:00
    真的破解大神,要搞的话你这水平基本防不住。RSA 会替换了你的 e 和 d。
    zzzzzzZ
        16
    zzzzzzZ  
       2019-01-04 14:29:33 +08:00
    漏洞就在:软件必须上非常强的壳,不然(E,pk')可以被篡改,这两者等价于任意设备的 H,从而绕过你原始的 sk',你程序如何验签都是同样的 H

    #1#3#13#14 大家说的都是这个事情,请仔细阅读理解
    CivAx
        17
    CivAx  
       2019-01-04 14:41:09 +08:00
    nsfocus 的 RSAS 就是这么卖的:

    卖一台 ThinkPad,上面安装好软件版 RSAS,配一个加密狗( U 盘),要使用的时候必须插上 U 盘以加载秘钥。

    如果你们卖的 “硬件” 部分是可以定制化的 PC 机,主机内仓就可以有充足的空间给你们做硬件上的加密,比如在主板上引一个 USB 口,然后插个定制化的酷豆 U 盘当加密狗,最后机箱封死完事。
    wanwaneryide
        18
    wanwaneryide  
       2019-01-04 14:43:42 +08:00
    加密狗,定时 5 分钟检测一次或者 10 分钟?
    realpg
        19
    realpg  
       2019-01-04 14:59:25 +08:00
    大容量带逻辑加密狗
    大量核心算法中间件扔加密狗里……
    mathzhaoliang
        20
    mathzhaoliang  
    OP
       2019-01-04 15:11:28 +08:00
    @jim9606 是这样的,硬件信息是可以作伪的,所以我们这个理论上是可以破解的,防君子不防小人而已。但我们本也没打算弄得很坚不可摧。
    mathzhaoliang
        21
    mathzhaoliang  
    OP
       2019-01-04 15:15:37 +08:00
    @zzzzzzZ 意思是说用任意的 (E', Pub_Key') 替换掉原本的 (E, Pub_Key) ,使得验证总能通过是吧?那前提是要反编译找到程序中的 (E, Pub_Key) ?
    P0P
        23
    P0P  
       2019-01-04 15:36:56 +08:00
    既然是卖硬件,那也可以直接往 kernel 里面加自定义模块,然后软件检测 kernel 对应模块,这样用户也不可以自己升级系统了
    luanluan
        24
    luanluan  
       2019-01-04 15:37:43 +08:00
    脱了壳 照样破,
    murmur
        25
    murmur  
       2019-01-04 15:38:31 +08:00
    @mathzhaoliang 不说壳还有什么可以谈的,一个逆向然后改掉你的判断就破解了,做序列号第一件事就是加大破解难度
    mathzhaoliang
        26
    mathzhaoliang  
    OP
       2019-01-04 15:42:46 +08:00
    @murmur 是这样的,我们这个原则上就是防君子不防小人,有个基本的保密功能而已。而且我们在考虑增加一个后台发送信息的功能,把动态计算出的哈希值 H 发到我们的服务器上和数据库进行比对,这样他只能伪造硬件信号。
    WordTian
        27
    WordTian  
       2019-01-04 15:42:48 +08:00 via Android
    @mathzhaoliang 对啊,所以大家让你加个强壳,不让别人找到(E, Pub_Key)啊
    dearmymy
        28
    dearmymy  
       2019-01-04 16:11:14 +08:00   ❤️ 1
    相信我,别自己写,不是安全行业的自己写,破解你跟玩一样。直接花钱买一个 vmp。你要的什么需求都有
    neoblackcap
        29
    neoblackcap  
       2019-01-04 16:40:44 +08:00
    @dearmymy 真便宜,旗舰版才卖 999 刀,一个程序员一个月的工资都不够。我觉得还行,现在 999 刀还招不到一个能开发壳的程序员。不过这东西稳吗?我感觉还是联网实时校验更稳。就不知道 LZ 的设备能不能联网。联网一切好说
    luny
        30
    luny  
       2019-01-04 16:45:11 +08:00
    这种纯软的方式不建议,最好增加一个 i2c 的 eprom (我用的是 FM24C08D,2 毛多)或者专用的加密芯片,每个芯片的 id 是不一样的,这样可以绑定硬件,算法自己定,破解难度相对大些,抄板也没用。
    dearmymy
        31
    dearmymy  
       2019-01-04 17:24:26 +08:00
    @neoblackcap 我当时加密自己软件,买过一个旗舰版,没用他联网那套模块,用的是本机授权那套。稳定性很好。毕竟这么多年了。本身加上 vmp 就已经劝退很多人了。lz 那种加密方式。想破解真实太多地方可以下手了
    mathzhaoliang
        32
    mathzhaoliang  
    OP
       2019-01-04 17:53:06 +08:00
    @luny 淘宝上有卖?能给个地址吗?
    tabris17
        33
    tabris17  
       2019-01-04 17:55:09 +08:00
    核心业务逻辑放云端执行,否则都是不可控的。要不就上硬件加密狗吧,提高破解难度
    mathzhaoliang
        34
    mathzhaoliang  
    OP
       2019-01-04 17:59:19 +08:00
    @luny 我找到一个淘宝链接,他卖 3 毛。我不太懂的是这个应该怎么用?是写好程序烧进去,然后集成到硬件上?可以解释下吗?
    Cryse
        35
    Cryse  
       2019-01-04 18:00:46 +08:00
    核心逻辑云端+硬件加密狗
    binbex
        36
    binbex  
       2019-01-04 18:01:15 +08:00
    其实就是给用户算个用户 GUID,然后最好这个算法 vmp 下
    mathzhaoliang
        37
    mathzhaoliang  
    OP
       2019-01-04 18:02:18 +08:00
    @Cryse
    @tabris17

    不行,软件比较复杂,必须放在客户端跑,公司没有能力支持那么复杂的云服务器。加密狗的话每套成本要增加小 100 左右,也不好。
    won
        38
    won  
       2019-01-04 18:04:58 +08:00 via iPad
    lz 方案可行。既然捆绑硬件卖,为什么在硬件上加装个前置摄像头和 4g 模块,人脸识别很现成了
    jinhan13789991
        39
    jinhan13789991  
       2019-01-04 18:09:06 +08:00
    给你推荐一招,盗版也能继续用,数据量给它搞一定的偏移。 后面企业发现问题就会想办法解决,然后盗版用户就转正版了。一箭双雕!
    lovelybear
        40
    lovelybear  
       2019-01-04 18:10:47 +08:00
    VM 加壳
    Keyes
        41
    Keyes  
       2019-01-04 18:22:19 +08:00 via iPhone
    防君子不防小人说真的随便做点限制就行了不用搞这么麻烦

    想做相对完善,仍然需要藏好算法跟核心功能代码

    vmp 或者 themida 吧
    artandlol
        42
    artandlol  
       2019-01-04 18:28:59 +08:00 via iPhone   ❤️ 1
    @mathzhaoliang 是可逆的,但地位不一样,私钥可以直接得到公钥,公钥得到私钥就等于破解 rsa,现在对 1024 以上的还是比较难破解
    waterboy
        43
    waterboy  
       2019-01-04 18:33:54 +08:00
    apk 有成熟的加固方案
    pc 端也有很多方案
    但是这些东西都是防君子不防小人的,想一下巨硬这些年搞了多少东西,防住盗版了吗
    crab
        44
    crab  
       2019-01-04 18:47:21 +08:00
    流程跟下就能知道你怎么获取信息怎么加密,替换掉你内置的公钥就可以了。
    AX5N
        45
    AX5N  
       2019-01-04 19:15:51 +08:00
    @jinhan13789991 犯法的
    jinhan13789991
        46
    jinhan13789991  
       2019-01-04 19:20:00 +08:00 via Android
    @AX5N 只对盗版软件做这个操作。正版没有。这也违法吗?
    Kaiv2
        47
    Kaiv2  
       2019-01-04 19:28:25 +08:00 via Android
    只要是可以离线使用的软件应该都能被破解
    Fulcrum
        48
    Fulcrum  
       2019-01-04 19:32:04 +08:00 via Android
    @jinhan13789991 江民逻辑锁了接一下
    soho776
        49
    soho776  
       2019-01-04 20:01:34 +08:00
    必须联网使用就行了
    chickplilita
        50
    chickplilita  
       2019-01-04 23:07:23 +08:00   ❤️ 4
    我之前在看雪收藏的一篇文章。目前搜了一下貌似只有百度文库里面有。我现在发一下。


    <于破解过招,保护你的共享软件>


    共享软件是软件业目前世界上比较热门的话题,国内更是如此。成千上万的中国程序员以极大的热情投入到这个领域来,都憧憬着用辛勤的劳动来获得丰厚的回报;但,实际并非如此,绝大多数的人都弑羽而归。值得注意的是:除了选题和技术上的原因外,最大的原因就是共享软件被破解( Crack )了。

    破解见得多了,不免有些麻木。大部分作者都是新软件发布一个星期左右甚至一天之内就会在网上发现注册机或者被修改过的软件(行话称之为“爆破”)。破解者制作了英文、中文、俄文、德文等语种的注册机大肆发散不说,还常常给作者寄一份,外加一封挖苦辱骂的信。唉!我们得罪了谁?没日没夜地熬夜编码,难道得到的就是这连绵的挖苦和不尽的羞辱吗?

    不!决不!我们有理由也有能力保护自己的劳动成果!但问题是:如何保护?关注国内,网上关于破解资料和教程俯拾皆是,而关于软件保护方面的资料则是凤毛麟角(大多都关系到什么技术垄断),这种畸形现状就导致了相当一部分朋友的加密非常脆弱甚至可以称得上是“弱智” !要知道,你要面对的是已经形成团伙的众多破解高手呀,国内的什么 CCG、BCG,国外的 eGis、King、Core、TNT、DAMN 和 TMG,皆为水平一流的破解组织。全球盗版软件不少于 80%都是由他们的破解的,技术实力连大软件公司都不可小视。

    看到这里,你是否已经已经灰心了?别怕,虽然我们理论上无法完全避免被破解,但如果能够有效地拖延被破解的时间,并充分打击破解者的自信心,是可以让破解者无法忍受这种折磨从而最终放弃的。

    破解,通常的做法有两种――暴力破解(爆破)和写注册机。下面我就来依次讲解每种破解方法的原理和应对方法,这些都是鄙人积累的一些共享软件保护经验,某些关键地方还有例程讲解( Delphi 代码,使用 C++和 VB 的朋友可以自己稍微修改一下),希望能对新手们有些帮助,能够更有效地保护自己的劳动成果。

    §暴力破解(爆破)

    这是最常见,也是最简单的破解的方法。该法最适合于对付没有 CRC 效验的软件,破解新手乐于采用。

    大凡共享软件,验证是否注册大多数要采用 if 条件语句来进行判断,即使你采用了什么 RSA 或 ECC 等强力加密算法,也免不了使用 if 条件语句。呵呵,这里就是共享软件最为危险的地方哦,当然也是爆破手孜孜不倦所寻求的目标呀!

    例如,你的注册函数类似如下:

    { 利用 RSA 进行注册码的数字签名验证 }

    if RSAVerify(MD5(Key), MD5(Code), e, n) then
    ShowMessage('注册成功!')
    else
    ShowMessage('注册失败!');

    { 这里 Key 是用户输入的注册码,是由你发送给注册用户的 }
    { Code 是根据用户输入的用户名自动计算出来的注册码 }
    { e 是 RSA 算法的公匙,而 n 是 RSA 算法的模数。 }

    这个注册函数即使使用了强劲的 RSA 算法进行注册码验证,可是依然很容易被破解,我们只要把这里修改为:

    { 将逻辑判断改为否 }

    if not RSAVerify(MD5(Key), MD5(Code), e, n) then
    ShowMessage('注册成功!')
    else
    ShowMessage('注册失败!');

    就可以了。这时戏剧性的结果会产生:随便输入任何注册码都可以注册通过,相反输入正确的注册码却无法通过注册。:) 其具体操作是先反汇编或者跟踪你的程序,找到判断注册码的 cmp、test 等汇编指令后的关键跳转指令处,通常是 je、jz 之类的汇编指令,把它们修改为 jne 或 jnz 即可,这样常常只需要修改一个字节就可以完美破解之。:)

    令人遗憾的是,目前大部分共享软件都是这样进行判断的,这也是为什么网上被破解的软件铺天盖地的主要原因。因为这样破解实在是太简单了...

    难道没有什么可以防止的方法吗?当然有啊!只要把软件的关键代码嵌入到注册码或者注册文件中就可以充分防止破解。但现在问题是,怎么嵌入呢?

    最简单的方法就是把关键代码(你的软件功能限制部分最关键而且最简单的一个函数)做成一个小 Dll (动态链接库),用强力对称算法加密(密匙可以是主程序某一固定不变的部分或壳的特征 Hash 值)后生成一个注册文件( License 文件,呵呵,格式只有你知道哦!),或者 Base64 编码后生成一个注册表文件,用户可以双击导入注册表内。

    效验流程如下:已注册用户验证注册码时,先验证有没有文件,没有文件者自然受限制的功能无法使用。如果有注册文件,解密之即生成一个小临时文件。如果主程序被脱壳或者被修改(爆破),自然 Hash 值密码不符,解密出来的肯定都是垃圾码,没有一点用处。只有没有被修改的主程序才能正确的解码,而且当然只有解密正确的文件才是一个真正的 Dll 文件,才能被 GetProcAddress 函数找到欲调用的关键函数地址。这样只有已注册用户才可以享受到你软件的全部功能了。

    如此一来,Cracker 破解你的软件就变得很困难了:

    首先,他如果没有注册文件,即使他把主程序脱壳了,由于受限制的部分和注册文件是关联的,他也根本无法修补完整。

    第二,即使他得到了你的注册文件,由于是加密文件,他也无法直接利用之,这样就逼迫他去拆解你的算法,这可是他们最不愿意的碰到的事情哦!如果到了这一步,我想 99%的 Cracker 都是会放弃的,呵呵,只有真正对加密算法有研究的 Cracker 高手才会继续破解下去。

    第三,你是可以用些小技巧来使他的生活更加痛苦一些的,呵呵。这里我推荐大家使用 DSA 公开密匙加密算法,它和 RSA 一样,可以进行数字签名( RSA 还可以加密,DSA 则只能进行数字签名)。我这里选用它的原因就是它有一项非常实用的特性:随机数填充机制。即 DSA 每次签名都要使用一个随机数 K,正因为有这个 K 的存在,即使是相同的用户名和机器识别码,由 DSA 加密过的每份注册文件都不会相同。这对 Cracker 拆解你的注册文件来说是一个极大的障碍。

    第四,即使他得到了解密后的 Dll 文件,他也需要大幅度地修改主程序或者把你的 Dll 部分的关键代码拆出来填到主可执行文件中。呵呵,这就看他对 PE 文件格式理解得如何了。即使这样,如果你的程序中有大量的 Hash 效验和死机代码,呵呵,你就耐心等着我们可爱的 Cracker 同志吐血吧……:)

    所以记住啊:用完这个 Dll 临时文件后立即从内存中卸载此 Dll 并删掉,而且注意在解密之前探测一下,系统中有没有 FileMon 这个威胁极大的探测器呀!

    { 探测 FileMon }

    function DetectFileMon: Boolean;
    begin
    if CreateFile(PChar('\.FILEVXD'),
    GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0) <> INVALID_HANDLE_VALUE then
    Result := True //如果有,就 Down 机!
    else
    Result := False;
    end;

    当然,你可以保护得更好一些:可以不采用临时 Dll,而把解密后的关键代码用 WriteProcessMemory 这个 API 函数写入到主可执行文件自己进程被提交( Committed )的内存页面的指定位置去。这样由于磁盘上没有解密后的临时文件,破解更加困难。事实上,目前世界上最强劲的专业保护软件 Armadillo 就是用的这种方法。而且这种方法可以充分防止被调试器 Dump。但实现起来比较困难,尤其是在 WinNT 5 以后的操作系统中。

    由于这种方法将注册文件和受限制代码唯一关联,爆破手拿到你的软件也只有干瞪眼。建议大家都给共享软件加上功能限制,这样比时间和次数限制更加安全。

    §写注册机

    顾名思义,这种方法就是模仿你的注册码生成算法或者逆向注册码验证算法而写出来的和你一模一样的注册机。这玩意威胁极大,被爆破了还可以升级。如果被写出注册机,呵呵,你的软件只好免费了。或者你必须更换算法,但以前注册过的合法用户都得被迫更换注册码了,累死你!呵呵...

    上面的方法虽然可以避免爆破,但注册机的威胁还是存在的。Cracker 要写注册机必须详细研究你软件的验证模块,这必须先将你的软件脱壳,再反汇编或者用调试器跟踪。市面上许多加壳和保护软件都吹嘘不可能被脱壳,令人可惜的是到目前为止没有一个软件兑现了它们的诺言。由于 CPU 最终执行的都是有效指令,所以等你的程序自解压完成后再从内存中 Dump 出来就可以实现脱壳。因此不要在壳上面花很多功夫,因为没有这个必要。

    反汇编是和调试器跟踪也都是不可能防止的,因为所有的 Win32 程序都是必须通过 API 来调用 Windows 系统中的关键 Dll 的(如 Kernel32.dll 、GDI32.dll 等),然而 API 是可以 Hook 的。我们只能从自己的代码着手来保护我们的劳动果实了。

    为了自己调试和以后维护的方便,我们一般采用有意义的名字给我们的函数命名,可这给了 Cracker 可乘之机。例如这样的函数是什么意思大家应该是一目了然吧? IsRegistered(), IsLicensed(), LicenseVerify(), CheckReg()...这样 Cracker 就可以轻松地从数千个函数中找到他的目标---你的注册码效验函数!而且破解 Delphi 编写的软件还有一件 TMG 小组的破解利器---DeDe,它可以轻松看到你软件里的 Form、Unit 和函数名,还可以反汇编一部分代码,更是可以和 Win32DASM 合作反汇编更多的代码,对 Delphi 软件威胁极大。

    为了不给 Cracker 创造温馨舒适的破解环境,我们要混乱( Obfuscate )我们的代码,将软件中所有的函数名全部替换成随机生成的函数名。例如 Func_3dfsa_fs32zlfv()这个函数是什么意思?恐怕只有天知道了。网上有现成的代码混乱器,你按你使用的编程语言的种类可以找到一些。但注意,只有当你要发布软件时才使用之,而且一定注意备份源代码。否则当你看不懂你自己的代码时可别怪我呀!:)

    另外一定要使用公开密匙算法保护你的软件,RSA、DSA 和 El Gamal 之类的算法都可以从网上找到。但注意:将你算法单元中的所有涉及到算法名称的字符串全部改名。避免被 Cracker 发现你用的算法而模仿写出注册机来!你还可以张冠李戴,明明用的 DSA,将名字全部替换成 RSA,呵呵,让他模仿去吧!:)

    其它算法如对称算法和 Hash 算法都也要注意改名,否则这样:

    EncryptedCode = Blowfish(MD5(UserName), MD5(Key));

    //你的加密算法,使用了 Blowfish (对称算法)和 MD5 ( Hash 算法)

    虽然我不了解 Blowfish 和 MD5 算法的原理,也不会逆向它们,但我了解你的效验算法的流程和算法名,我马上就可以从网上找到类似的 Blowfish 和 MD5 算法包,从而模拟你的软件仿造出注册机,啊?!真是……$&*&($#%@!

    如果你用的什么其它不常见的算法(如 Skipjack (NASA 美国航天局标准算法), LOKI, 3-WAY, Safer 之类不出名但强度很高的算法),并且全部改名,就让他们去研究软件中成堆的如下代码是什么加密算法吧!:)

    0167:005B9F70 MOV EAX,[EBP-10]
    0167:005B9F73 CALL 00404000
    0167:005B9F78 PUSH EAX
    0167:005B9F79 MOV EAX,[EBP-10]
    0167:005B9F7C CALL 004041C4
    0167:005B9F81 LEA ECX,[EBP-14]
    0167:005B9F84 POP EDX
    0167:005B9F85 CALL 004B860C

    当然,最好把 Hash 算法也全部改名,给会给他们制造更多的困难。但注意,MD5 和 SHA 之类的 Hash 的初始值会被 Cracker 从内存中找到,这样他就知道了你用的 Hash 了。所有建议同时使用 MD5 的变形算法 Ripe-MD ( RMD ) 128 或 160 和其它的 Hash,如 Tiger, Haval 等算法。

    另外,请注意要经常效验你的程序是否被修改( Hash 效验),如果被修改则退出。但请注意,有些病毒会修改进程的句柄表和它指向的内核对象,这样病毒就可以直接修改运行中的 PE 文件而感染之了,另外还有网络传输错误的问题也会导致软件 CRC 出错。因此请不要认为可执行文件的 CRC 不符而此时程序已被脱壳了。

    其实,程序被脱壳最明显的标志是其大小明显大于脱壳前。1M 的 PE 文件被 UPX、ASPack 之类的软件压缩后通常只有 400 左右。如果你的软件在运行中发现自己的大小大于 800K,我想你应该知道如何做了吧?呵呵... :)

    还有一点,调试器对我们的威胁很大,我们不会肯定让 Cracker 们舒舒服服地使用 SoftICE、TRW 和 OllyDbg 来调试我们的程序。除了常用的 MeItICE 方法外,这里我给一个我写的方法:

    { 检查自己的进程的父进程是否为 Explorer.exe ,否则是被调试器加载了 }
    { 不过注意,控制台程序的父进程在 WinNT 下是 Cmd.exe 哦!}
    { 注意加载 TlHelp32.pas 单元 }

    procedure CheckParentProc;
    var //检查自己的进程的父进程
    Pn: TProcesseNtry32;
    sHandle: THandle;
    H, ExplProc, ParentProc: Hwnd;
    Found: Boolean;
    Buffer: array[0..1023] of Char;
    Path: string;
    begin
    H := 0;
    ExplProc := 0;
    ParentProc := 0;
    //得到 Windows 的目录
    SetString(Path,
    Buffer,
    GetWindowsDirectory(Buffer, Sizeof(Buffer) - 1));
    Path := UpperCase(Path) + 'EXPLORER.EXE'; //得到 Explorer 的路径
    //得到所有进程的列表快照
    sHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
    Found := Process32First(sHandle, Pn); //查找进程
    while Found do //遍历所有进程
    begin
    if Pn.szExeFile = ParamStr(0) then //自己的进程
    begin
    ParentProc := Pn.th32ParentProcessID; //得到父进程的进程 ID
    //父进程的句柄
    H := OpenProcess(PROCESS_ALL_ACCESS, True, Pn.th32ParentProcessID);
    end
    else if UpperCase(Pn.szExeFile) = Path then
    ExplProc := Pn.th32ProcessID; //Explorer 的 PID
    Found := Process32Next(sHandle, Pn); //查找下一个
    end;
    //嗯,父进程不是 Explorer,是调试器……
    if ParentProc <> ExplProc then
    begin
    TerminateProcess(H, 0); //杀之!除之而后快耶! :)
    //你还可以加上其它什么死机代码来消遣消遣这位可爱的 Cracker :)
    end;
    end;

    你可以在 Delphi 或者 VC 中试试,呵呵,是不是把 Delphi 和 VC 杀掉了,因为你现在用的是 Delphi 和 VC 的内置调试器来运行你的程序的,当然它会六亲不认了,呵呵!调试的时候你还是把它注释掉吧,发布时别忘记激活哟!

    最后一个问题,这也是一个非常重要的问题:保护你的字符串!!!字符串在注册模块中非常重要!当一个富有经验的 Cracker 破解你的软件时,首先做的就是摄取你的字符串。比如他会输入错误的注册码,得到你关于错误注册码的提示,通常是“无效的注册码,请重新输入!”或者“ Invalid key, please input again!”等等,然后用 OllyDbg 下断点调试或者用 WinDASM、IDA Pro 等静态分析工具在被他脱壳后的程序中查找那个字符串,找到后进行分析。因此,请一定加密你的字符串!!!一定!!! 使用时再临时解密出来,而且要尽量少使用消息提示框 ,避免被 Cracker 找到漏洞。加密字符串不需要太复杂的算法,随便找一个快速的对称算法就可以了。

    最后提醒你一句,不要在加密上花太多的功夫!你应该把更多的时间和精力都用来完善你的软件,这样会更合算。借用一位前辈的话来忠告大家吧:花点时间考虑你自己的软件,看看它是否值得保护?如果没人用你的软件,保护也就没有意义了,不要过高估计你的软件“对世界的重要性”!
    lain0
        51
    lain0  
       2019-01-05 02:10:17 +08:00
    我不是专业的加密学人士,不过我分析了几种可以想到的情况,在不考虑反编译的情况下,如果 Priv_Key 不泄露,存储的 (E, Pub_Key) 不被篡改,OP 的算法应该是安全的。

    Priv_Key 泄露的情况不需要讲了。如果用户可以写入存储下来的这个值:(E, Pub_Key),用户就可以自己生成一个 RSA key pair (Pub_Key2, Priv_Key2),再算出 E' = Encrypt(H, Priv_Key2),那只要把 (E, Pub_Key) 替换成 (E', Pub_Key2) 就能够破解了。
    AX5N
        52
    AX5N  
       2019-01-05 02:48:21 +08:00
    @jinhan13789991 没记错的话是这样,最好别这么干。
    C2G
        53
    C2G  
       2019-01-05 03:04:10 +08:00 via Android
    收集硬件信息生成硬件机器码,绑定注册号并上传到服务器。
    每次启动需要发送机器码与服务器上的验证是否相同,且时间差不能超过 1 分钟。
    每五分钟一次心跳包,限制一个注册码同时只能登录一台机器,注册码验证过程二次加密认证防 hosts 劫持。
    thedrwu
        54
    thedrwu  
       2019-01-05 03:42:34 +08:00 via Android
    钓鱼搜集信息,然后请律师清算。
    不然就买套 usb 加密狗。
    或者两者一起用
    qianmeng
        55
    qianmeng  
       2019-01-05 07:35:11 +08:00 via Android
    用不太复杂的加密,经常更新,免费发给客户,每次更新就重新换一个加密方式,重新给授权,这样差不多了
    xuanbg
        56
    xuanbg  
       2019-01-05 07:56:39 +08:00
    没有什么软件是破解不了的,除非不给别人软件。好吧,你知道了,SAAS 软件服务端不会给到别人手里,所以没人能破解。
    cjw1115
        57
    cjw1115  
       2019-01-05 09:28:07 +08:00 via iPhone
    私钥加密,公钥验签,没啥问题,保留好私钥就行了
    chtcrack
        58
    chtcrack  
       2019-01-05 09:35:15 +08:00
    不要看楼上一大堆叫你搞那么复杂的,只要防止住普通用户就好了,真正的高手你再怎么搞都防不住.游戏用的最强 DRM 加密不是一样被破解了.
    linmq
        59
    linmq  
       2019-01-05 09:40:51 +08:00 via iPhone
    硬件加密狗
    LokiSharp
        60
    LokiSharp  
       2019-01-05 10:04:12 +08:00 via iPhone
    硬件上加加密模块,然后把一部分代码放在加密模块的 ROM 里
    mathzhaoliang
        61
    mathzhaoliang  
    OP
       2019-01-05 10:24:15 +08:00
    上硬件加密是可以的,但是成本最好比较低,而且我考虑第一版初步的程序先不要那么高级,不然搞不出来交不了差就不好了。
    kokutou
        62
    kokutou  
       2019-01-05 10:29:15 +08:00 via Android
    加强壳,
    上狗,

    一联网就上传机器信息序列号 ip 地址,律师函搞起来
    然后派专人每天在百度,qq 群搜索你的软件,有破解就发律师函。
    fancyistyle
        63
    fancyistyle  
       2019-01-06 00:11:23 +08:00 via Android
    我觉得可以把条件降一下,即如何保证即使被破解也不能够大面积传播
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5926 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:16 · PVG 14:16 · LAX 22:16 · JFK 01:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.