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

golang 二进制程序,容易被破解吗?

  •  
  •   einsdisp · 2020-08-08 00:48:58 +08:00 · 6592 次点击
    这是一个创建于 478 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做了一个产品,使用 golang,编译为 windows 二进制( exe )或者 Linux 二进制( elf ),分发给不同的客户,程序针对不同的客户有不同的功能与使用时间限制。

    比方说使用时间限制,目前就是在程序运行时使用当前时间( time.Now())与预设时间( go build 时通过-X 自动设定)进行比较判断,如果超过预设时间,则程序退出。编译已经使用 -s -w -trimpath 等选项去掉调试信息。

    本人不太懂汇编,golang 程序破解难度如何,是不是基本类似于 c/c++程序? 像 java 一样,反编译之后基本等于源码(除了没有注释),破解难度就太低了。不带混淆手段的默认编译的 java 程序,但凡会一点 java 的人,花上两天时间,基本都能破解。

    如果要破解 golang 程序,需要具备多高的水平?破解 glang 程序的成本有多少?客户如果花钱请人破解,像我上面提及的这个程序,假如你有能力破解,你觉得你会要价多少,要花多长时间?

    21 条回复    2021-11-17 13:53:06 +08:00
    zu1k
        1
    zu1k   2020-08-08 00:56:17 +08:00 via Android
    反编译后不容易读,但是你这个逻辑好破
    hahasong
        2
    hahasong   2020-08-08 01:06:59 +08:00 via iPhone
    本机时间调到过去不就破解了,太傻了吧
    jqtmviyu
        3
    jqtmviyu   2020-08-08 01:10:32 +08:00
    本机时间调到过去,常用于工厂的设备。。。
    einsdisp
        4
    einsdisp   2020-08-08 01:10:41 +08:00
    @hahasong 这个软件有大量跟当前时间有关的业务逻辑,他调了本机时间,他自己用起来也难受
    by73
        5
    by73   2020-08-08 01:11:10 +08:00
    其实都是一样的。。golang 感觉功能简单反而更容易解出来,像 cpp 这种你还要去自己解析虚表之类的,比较头疼。另外就算是强如 d 加密也照样能被破,只是时间长短以及你愿意付出的成本罢了 = =
    xupefei
        6
    xupefei   2020-08-08 02:55:23 +08:00 via iPhone
    你这逻辑太简单了,我五分钟时间就能找到你的判断语句 nop 掉…
    ysc3839
        7
    ysc3839   2020-08-08 03:24:31 +08:00 via Android
    之前逆向过 Golang 的程序,印象中编译出来的代码并不像 C/C++ 那么简单,而是多了很多代码,反而更加复杂了。
    不过我目前也不能确定,有时间我再看看吧。
    wafm
        8
    wafm   2020-08-08 03:36:27 +08:00
    你只判断本地时间,写个 HOOK 就可以完事了

    至于你说的大量和时间有关的业务逻辑你也是基于本地时间来做的呀 只要你的代码觉得本地时间没问题 那还不是一样运行下去

    做验证就老老实实把关键代码和运算放到云端运行,不然有心破解的还是能搞定的,只不过是成本问题
    ihacku
        9
    ihacku   2020-08-08 03:39:51 +08:00 via Android
    nicevar
        10
    nicevar   2020-08-08 05:29:04 +08:00 via Android
    你这种情况对于那些精于破解的人是分分钟的事,人家反编译你的程序不一定要变成可阅读代码才行,直接看汇编指令通过特征找到对应的逻辑修改就行了
    virusdefender
        11
    virusdefender   2020-08-08 07:13:06 +08:00   ❤️ 1
    @ihacku 这个人后面又发了个 ida 插件,可以支持 pie 了,哈哈哈
    nightwitch
        12
    nightwitch   2020-08-08 09:29:19 +08:00
    凡是这种 if 判断的,调试器接上去单步走几次就到了跳转了,直接给你 nop 掉就破了。
    liuminghao233
        13
    liuminghao233   2020-08-08 09:33:26 +08:00 via iPhone
    你需要 vmprotect
    专治各种反编译问题
    bruce0
        14
    bruce0   2020-08-08 10:16:34 +08:00
    go 反编译后得到的是 plan9 汇编,

    ```
    "".main STEXT nosplit size=2 args=0x0 locals=0x0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:3) TEXT "".main(SB), NOSPLIT|ABIInternal, $0-0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:3) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:4) PCDATA $2, $0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:4) PCDATA $0, $0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:4) XCHGL AX, AX
    0x0001 00001 (<unknown line number>) RET
    0x0000 90 c3 ..
    "".one STEXT nosplit size=20 args=0x18 locals=0x0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:7) TEXT "".one(SB), NOSPLIT|ABIInternal, $0-24
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:7) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:7) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:7) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:8) PCDATA $2, $0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:8) PCDATA $0, $0
    0x0000 00000 (C:\Users\bruce\Desktop\go\main.go:8) MOVQ "".a+8(SP), AX
    0x0005 00005 (C:\Users\bruce\Desktop\go\main.go:8) MOVQ AX, "".~r1+16(SP)
    0x000a 00010 (C:\Users\bruce\Desktop\go\main.go:8) ADDQ $5, AX
    0x000e 00014 (C:\Users\bruce\Desktop\go\main.go:8) MOVQ AX, "".~r2+24(SP)
    0x0013 00019 (C:\Users\bruce\Desktop\go\main.go:8) RET
    0x0000 48 8b 44 24 08 48 89 44 24 10 48 83 c0 05 48 89 H.D$.H.D$.H...H.
    0x0010 44 24 18 c3 D$..
    ```

    差不多这样吧,比 Java 的要复杂多了。但是遇到熟悉汇编和破解的,基本没啥用
    murmur
        15
    murmur   2020-08-08 10:20:21 +08:00
    部署到自己的服务器上不就不需要破解么

    而且你认为的软件真的有破解价值么,别人可以要求你提交的时候提交文档和代码
    whoami9894
        16
    whoami9894   2020-08-08 18:31:30 +08:00
    只要肯花时间,慢慢调基本都能破的,看值不值得付出那个时间成本了,毕竟连 IDA 也被别人破解。而且你这个限制逻辑,动调定位到判断语句 nop 掉就完了,有经验的几十分钟就搞定了
    renhua
        17
    renhua   2020-08-08 20:05:43 +08:00
    不要想所谓绝对的安全
    但是可以上 VMP 加个壳,可以防范不少人
    https://bbs.pediy.com/thread-261260.htm
    BoarBoar
        18
    BoarBoar   2020-08-10 15:46:26 +08:00
    要看怎么比了,对于逆向大佬来说只是时间问题,关键是破解的价值和时间成本比值不值得去做
    不过能反汇编的大佬毕竟是少数,比起 java 那样随便谁学个两周脱壳反混淆就能破解的情况来又好多了。
    最终还是要看价值时间比,就比如现实里一般都只破解 app 安卓端不管 ios,不是因为 ios 无法破解,而是安卓太容易了没人愿意多花那个精力
    dearmymy
        19
    dearmymy   2020-08-10 17:23:34 +08:00
    编译出 exe 应该也是 window 的 pe 程序,汇编也 x86 架构。如果这样的话。
    我破解
    观察一运行就退出,调试在 ExitProcess 下断点,断下后找到当前函数,往上应该能比较明显找到你这个 if 判断,直接把你判断改掉,应该就破解了。
    顺利的话全程 10 分钟不到。
    至于怎么防搜搜 vmprotect,大部分人看到 vm 的壳都不会接
    cz5424
        20
    cz5424   37 天前
    @dearmymy 是 linux 版本可以 vmprotect ?目前了解到好像是 windows 程序可以
    cz5424
        21
    cz5424   11 天前
    VMProtact 不支持 golang ,请勿入坑。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1167 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 18:18 · PVG 02:18 · LAX 10:18 · JFK 13:18
    ♥ Do have faith in what you're doing.