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

2020-08-08 00:48:58 +08:00
 einsdisp

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

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

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

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

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

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

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

而且你认为的软件真的有破解价值么,别人可以要求你提交的时候提交文档和代码
whoami9894
2020-08-08 18:31:30 +08:00
只要肯花时间,慢慢调基本都能破的,看值不值得付出那个时间成本了,毕竟连 IDA 也被别人破解。而且你这个限制逻辑,动调定位到判断语句 nop 掉就完了,有经验的几十分钟就搞定了
renhua
2020-08-08 20:05:43 +08:00
不要想所谓绝对的安全
但是可以上 VMP 加个壳,可以防范不少人
https://bbs.pediy.com/thread-261260.htm
BoarBoar
2020-08-10 15:46:26 +08:00
要看怎么比了,对于逆向大佬来说只是时间问题,关键是破解的价值和时间成本比值不值得去做
不过能反汇编的大佬毕竟是少数,比起 java 那样随便谁学个两周脱壳反混淆就能破解的情况来又好多了。
最终还是要看价值时间比,就比如现实里一般都只破解 app 安卓端不管 ios,不是因为 ios 无法破解,而是安卓太容易了没人愿意多花那个精力
dearmymy
2020-08-10 17:23:34 +08:00
编译出 exe 应该也是 window 的 pe 程序,汇编也 x86 架构。如果这样的话。
我破解
观察一运行就退出,调试在 ExitProcess 下断点,断下后找到当前函数,往上应该能比较明显找到你这个 if 判断,直接把你判断改掉,应该就破解了。
顺利的话全程 10 分钟不到。
至于怎么防搜搜 vmprotect,大部分人看到 vm 的壳都不会接
cz5424
2021-10-22 18:01:03 +08:00
@dearmymy 是 linux 版本可以 vmprotect ?目前了解到好像是 windows 程序可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696622

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX