V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
iyear
V2EX  ›  Go 编程语言

GOLANG 联网程序如何防破解

  •  
  •   iyear ·
    iyear · 2020-08-08 20:49:14 +08:00 · 4219 次点击
    这是一个创建于 1602 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到 https://www.v2ex.com/t/696622 的帖子,情况有点不同所以另开一帖问一下……

    刚好自己有个小项目想写个授权,自带联网属性

    目前思路是启动时服务端带 sign 验证,每天不定时后台验证,失败就关闭前台的关键功能(当然不是马上关闭,防止授权服务器炸了所有都用不了)

    授权过程不能放在用户操作过程中进行,只能后台。

    关键功能无法放在服务端运行。

    如何提高破解的难度?求大佬解答

    不会做的太复杂,真的防也防不住

    解决后会把方案和思路放在附言里。

    14 条回复    2020-08-10 09:46:48 +08:00
    ooh
        1
    ooh  
       2020-08-08 21:06:12 +08:00
    对称加密 生成一个 license 文件, 每个操作里面写一个 validate
    ooh
        2
    ooh  
       2020-08-08 21:08:16 +08:00
    @ooh 靠不没写完发出去了,流一个 validate 注释,批量把 validate 替换成实现代码,这尼玛就算破解也要一个个去改吧
    iyear
        3
    iyear  
    OP
       2020-08-08 21:08:51 +08:00
    @ooh #1 感谢大佬,回头研究一下
    Aoang
        4
    Aoang  
       2020-08-08 21:10:49 +08:00 via Android
    调动态链接库,然后上数字签名,程序、链接库双向校验签名。

    程序抽离出关键数据至服务端,然后加上登录,服务端根据 IP 和设备的硬件 ID 来做风控。

    程序也可以独立成多个,然后服务端下载后由程序调用执行,通过风控来处理。

    用户登录之后才能下载程序,用户下载的程序自带特征码,随便破解,你看到破解版的之后看看特征码是哪个用户的就行了。
    iyear
        5
    iyear  
    OP
       2020-08-08 21:12:59 +08:00
    @Aoang #4 感谢,不过这个有点复杂。。目前水平好像还做不到这样子。而且小项目只是想借这个学习一下防破解的思路,以后说不定会用到
    loading
        6
    loading  
       2020-08-08 21:17:03 +08:00 via Android
    @ooh 都是一样的代码,编译器不会直接帮你优化成一个?
    xcstream
        7
    xcstream  
       2020-08-08 21:57:58 +08:00
    定时任务
    nifengwobei
        8
    nifengwobei  
       2020-08-09 00:42:43 +08:00
    这防那防 还怎么写好代码 大厂都防不住 个人的 防菜逼不防大佬
    iyear
        9
    iyear  
    OP
       2020-08-09 02:01:43 +08:00 via Android
    @nifengwobei 所以想一个简易的授权方式
    teawithlife
        10
    teawithlife  
       2020-08-09 08:27:07 +08:00
    对付联网验证的方法,常用的要么就是直接跳过验证的代码,要么就是做一个假的服务器进行应答
    对付这两种方法,需要做到:
    1. 部分计算逻辑得放到服务器实现,确保程序需要连接真正的服务器,计算之前服务器可以做授权验证
    2. 验证时引入随机数和时间因素,防止重放攻击
    playniuniu
        11
    playniuniu  
       2020-08-09 09:44:18 +08:00
    时间戳+你的密钥,算个 md5 之类的放在 Http Header 请求里面,然后比如每调用关键功能 100 次,就请求一下服务端,看看授权情况,授权出错就 +1,出错 3 次关服务。我觉得这样就基本可以了。

    当然你密钥要处理一下,不能直接写成文本,否则 IDA 一看就能看出来,好歹把字符串切分一下,在 Base64 一下,一般情况就足够用了
    iyear
        12
    iyear  
    OP
       2020-08-09 11:07:26 +08:00
    @teawithlife #10
    @playniuniu #11
    目前看来这样的思路是较为简洁和实用的
    toomlo
        13
    toomlo  
       2020-08-09 16:38:59 +08:00
    很多人编译 Go 程序时没注意过 go buildmode,其中一个比较特殊的 buildmode=pie,可以生成地址无关的二进制文件,进而结合 ASLR 技术加强自身安全性。这对 Go 自身的内存安全机制来说,是个锦上添花的特性。配图中的内容把这个特性的好处解释的挺清楚了。

    其实这个 buildmode 还有一个鲜为人知的效果:在用此模式编译出的二进制文件面前,当前业界公开的 Go binary parse script/plugin for disassemblers 就跪了,分析不了

    来自: https://m.weibo.cn/1811826364/4530166044824131
    chengxiao
        14
    chengxiao  
       2020-08-10 09:46:48 +08:00
    市面上有一些卖加密的厂商可以尝试下,我买过一把硬件锁,类似于银行那种 usb-key 一把几十块吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:54 · PVG 10:54 · LAX 18:54 · JFK 21:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.