业余时间用 c++做了个很小众的翻译软件,调用我 java 后端的翻译接口。 翻译方面是我自己购买的腾讯机器翻译的 api 。 我在软件里根据机器信息,时间戳,nonce 生成了一个 sign ,连同需要翻译的原文一起提交到我后端的接口进行验证,如果 sign 验证通过才返回信息,不通过直接拒绝。 想请问下各位,这个算法我使用了 vmp 的 sdk 虚拟化+混淆,在不会被脱壳的情况下,是不是不会被破解? 对软件逆向一窍不通,希望能得到各位大佬的指点,十分感谢。
1
levelworm 2023-08-16 08:10:16 +08:00 via Android
中间人攻击呢?或者直接攻击你的服务器?
|
2
rekulas 2023-08-16 08:26:53 +08:00
不会被破解太绝对了,我的理解是脱壳只是方便逆向但不是说必要条件,如果对方直接转汇编也不是不能分析出核心签名逻辑
|
3
exch4nge 2023-08-16 08:31:07 +08:00 via iPhone
翻译软件做到这程度已经很不错了,大幅度提高了破解成本,虽然 vmp 不是完全安全的,但应该很少会有人花时间成本来破解。
楼上说的通信部分以及服务器本身安全可以多考虑下,比如用上证书双向认证,通信数据二次加密之类的,服务器防 ddos 等 |
4
liuidetmks 2023-08-16 08:36:51 +08:00 1
最好把翻译原文也加入计算 sign ,
差不多了,没人花大经历搞你的 |
5
Borch 2023-08-16 08:40:07 +08:00
可以破解。最简单的,加了 vmp 的算法可以通过模拟执行引擎如 unicorn 还原内存环境后直接调用,根本不用逆向 vmp 。另外问一下是哪家的 vmp 以及什么版本?有些 vmp 的一些版本快被分析烂了。
|
6
lsk569937453 2023-08-16 08:42:02 +08:00 8
我理解你原文中的"破解"等于接口被破解,然后被第三方滥调用。毕竟是自己花钱买的 api ,如果被第三方滥调用,那等于是自己花钱给别人做嫁衣了。
理论上只要你的 sign 生成的算法破解不了,那么别人就不知道怎么调用。但是想要破解你接口的人,可能也会用各种反汇编工具去分析你的 c++代码。而且我理解你现在 java 服务端是没有保存客户端的唯一标识的,只要 sign 通过,你就认为是合法的请求,这个是比较危险的。因为你后端接口的安全性只依赖 c++的混淆。 所以还有几个方法去加固安全性: 1.c++首次请求 java 的时候,根据当前的机器信息,去 java 端生成一个 token ,存储到后端数据库也返回给 c++,后续的每次 c++请求必带这个标识,而且后端 java 的每个请求都需要去校验 token 。 这样的好处是,针对每个 token ,可以做限流,如果你的接口被同一个 token 频繁调用,很快就能发现。 其次,如果你的 sign 生成算法被破解,那么由于你的接口限流了,黑客为了能请求多次,肯定会频繁调用你 java 的接口生成新 token ,这样也很容易被识别。 2.如果是匿名使用你的 c++客户端,可以使用 1 方案。如果是登录用户使用 c++客户端,则将 1 中的 token 换成登录的 token 即可。 |
7
yyf1234 2023-08-16 08:42:25 +08:00 via iPhone
这个算法最好足够复杂,不要是参数拼接然后 md5 ,这种动态调试很容易看出来,当破解付出的成本远大于收获的时候就没人愿意破解了
|
8
pengtdyd 2023-08-16 08:45:13 +08:00
如果有人能逆向了,那么他为什么不直接使用腾讯机器翻译的 api 呢?何必多此一举?
|
9
leokun 2023-08-16 08:47:59 +08:00
@lsk569937453 如果连 sign 算法都能破解,网络层面的标识换 token 简直是小意思,前面这个个人感觉没有必要
|
10
joApioVVx4M4X6Rf 2023-08-16 08:48:39 +08:00 2
既然都用接口了,应该引入登陆机制,用登陆的账号调用翻译 API ,经过服务器控制,比如速率啊,字数啊什么的,甚至不用管破解。。只要花钱了,任何账号都能用。即使他破解了接口,也是花账号里的余额
|
11
0o0O0o0O0o 2023-08-16 08:53:48 +08:00 via iPhone
所有防护手段提升的是破解难度,而不存在不会被破解;
加 vmp 也有需要注意的事项,多读文档; 密码学最佳实践是绝对不建议自己实现、修改加密算法的,但你做这类客户端防护却可以来上几个,而不是调用常用库; 当然最好还是别信任任何客户端信息,前端对抗无止境也不靠谱。尤其是你这种要保护的核心在后端 API ,其实非常简单,建议做个有注册成本的用户系统,例如小众你完全可以人工审核,后端按用户过滤、限频即可,另外做好服务器防护。 |
12
lsk569937453 2023-08-16 08:54:38 +08:00
@leokun token 是服务端生成的,你换 token ,服务端也很容易识别。
以下情况可以酌情弹验证码: 1.同一个 token 调用 api 的频率小于 1s(判断不是人为多次点击,而是机器调用 api) 2.新 token 生成后,3s 内马上请求后端接口(人为复制粘贴不可能这么快) 反爬是为了增加爬虫的成本,道阻且长。 |
13
ajaxgoldfish 2023-08-16 09:00:42 +08:00
我只能说小意思,不知老兄有没有听说过 frida+tcpdump 直接得到 sslkey ,然后解密,这是从 tcp 层 hook ssllib.so 就算你加 sdk 也白瞎,也能抓的到,至于 sign 直接 frida 一点一点看你调用然后还原就行了,最难得是脱壳。因为我刚复现吾爱 pj 论坛上的 https://www 点 52pojie 点 cn/forum.php?mod=viewthread&tid=1789310&highlight=%C4%B3%C2%F3 这个帖子。所以在这直接加壳就行了
|
14
ajaxgoldfish 2023-08-16 09:06:50 +08:00
我眼瞎了,没看清 C++软件,windows 抓更好抓了,其他的思路不变。同样是 hook 大法
|
15
ding2dong 2023-08-16 09:08:38 +08:00
没什么好办法,连微信这样的都被人破的干干净净。。 还是上账号机制吧
|
16
s7964926 OP @lsk569937453 感谢大佬的热心回复!目前我没有采用注册账号的方式,因为软件定位就是打开直接使用。我在数据库中存储了一个身份验证码,但是并不绝对保证唯一性,只是电脑的 mac 地址,系统架构版本等,sha256 加密后存储到服务器上。时间戳方面我做了防重放验证,nonce 只能使用一次。
从接口的调用频率可能没办法判断到底是不是正常的请求,因为是翻译视觉小说的,点击一次字幕就提交一次请求,大部分都比较频繁。 |
18
s7964926 OP @levelworm 中间人攻击的话我个人的理解是 MitM 替换掉请求中的参数,但是 sign 算法他逆向不出来,服务器是不会给他传有效信息的呀。DDoS 这种……那我就没办法啦哈哈哈
|
19
s7964926 OP @Borch 感谢大佬的回复。vmp 的版本是目前的最新版 3.8.4 ,个人的 Lite 授权。有种大炮打蚊子的感觉……
|
20
s7964926 OP @pengtdyd 可能是我没有说明白哈,这个腾讯机器翻译的 api 是我自己购买的,他需要访问我后端的接口去调用。如果他破解我的 sign ,那么就遭重了
|
21
joApioVVx4M4X6Rf 2023-08-16 09:25:46 +08:00
@s7964926 那就用 token 的方式,谁用给谁生成一个 token ,后台呢统计 token 的 IP 地址/调用次数之类的,从源头就解决了破解问题。而你提供的二进制程序加不加密都无所谓了,只是一个客户端而已
|
22
s7964926 OP @v2exblog 嗯啊,我寻思的是时间戳+全局唯一的 nonce+sign 验证再打个 vmp 保护壳就可以拦住不少人了,token 我也有生成但是不确保唯一,只是 mac 地址等 sha256 加密了一串。
|
23
s7964926 OP @ajaxgoldfish 感谢大佬回复。真的是打开了新世界的大门……
|
24
morgan1freeman 2023-08-16 09:50:29 +08:00 2
没有意义的,你算一下破解你这玩意的成本跟收益就完了,
搞逆向的也不是傻子,你弄个监控,如果 API 调用过量直接关掉, 然后升级一下客户端跟 sign 算法就好了, 谁没事,闲得蛋疼 为了你这个 API 来破解,你这是有家财万贯等着人偷呢,还是有金银珠宝等着人偷 所有的防护手段都是提升破解方的成本罢了,如果收益足够大 远大于成本,像微信这样的,总有人搞的 |
25
picone 2023-08-16 09:51:41 +08:00
我破解过一个 wasm + js 的前端项目,他就是企图用一个随机生成的字符串来掩饰这是签名串,比较隐蔽,并且把整个签名放到 wasm 里。
不过最终还是破解了,因为 - 他的随机字符串太孤零零了很明显 - 他的签名生成算法太简单了。 对应你的实现,只要脱壳了剩下的都是渣渣。 |
26
c2const 2023-08-16 10:14:01 +08:00 1
1.只要是运行在用户本地的代码,不管啥壳,都可以逆向,看汇编,理清代码逻辑 :(
2.防破解更多的是把功能尽可能放在服务端,然后做访问限制 :) 3.纯本地的功能,怎么防都会有破解版的 :( 4.OP 做的这个软件,比较简单粗暴的方法,强制扫码/手机号之类的登录,才能访问服务器并调 api 就行了,非法访问就封了 :) |
27
c2const 2023-08-16 10:18:52 +08:00
微软现在出 app ,比如手机上的"微软数学",全都是服务器计算,本地 app 只是展示结果和界面布局,不联网就只能用最基础的加减乘除功能,其它函数图像之类都不能用 :)
|
28
asm 2023-08-16 10:35:27 +08:00
只能说看到 vmp 直接扔进回收站。。。
|
29
streamrx 2023-08-16 10:44:33 +08:00 via iPhone
你做的这个东西 逆向了没什么收益 根本没有人会去逆向的。 用了 vmp 这些就已经很麻烦了 没有那么多人闲起没事做的
|
30
wjx0912 2023-08-16 10:46:15 +08:00
不怕被贼偷,就怕贼惦记
|
31
lshang 2023-08-16 11:31:43 +08:00
看起来这个工具的用户规模不大,只有少量的自己人使用,核心诉求是 API 不被坏人破解和盗用。
那楼主可以考虑加一个 IP 白名单,只允许放白的 IP 调用 API 。如果怕麻烦就给用户一个申请 IP 放白的接口,然后人工审核,审核通过自动化加白。 |
32
yinmin 2023-08-16 11:57:38 +08:00
你从社会工程学角度去考虑这件事情:为每台机器 ID 设置每天的使用上限,可以设得高一些,例如:通常 1 台机器每天几十次调用,你可以设置 1 天 2000 次调用的上限。如果有人投入大量精力去破解,也只能获得 2000 次/机器 ID 的调用,获得太少得不偿失,而你的损失可控。
|
33
GeT1t 2023-08-16 11:58:54 +08:00
怕被破解不要思路局限于加强客户端的保护,用一些使用策略从根本上杜绝破解(比如 12306 的候补车票),前面说的 token 加频控已经有很大的攻击门槛了。对于小软件已经非常够了。
|
34
pannanxu 2023-08-16 12:07:42 +08:00
试试埋点然后数据分析风控?或者其他第三方的一些行为验证?
|
35
yinmin 2023-08-16 12:07:53 +08:00 1
这个算法“机器信息,时间戳,nonce 生成了一个 sign”是有 BUG 的,没有加入原文的 HASH 值。
|
36
a33291 2023-08-16 12:53:00 +08:00
单 vmp 就效果可以了,能搞定 vmp 的不屑于搞你,搞不定 vmp 的更不用担心了.
|
37
miaomiao888 2023-08-16 13:34:52 +08:00
腾讯的接口不是本身就有 QPS 限制吗?好像每秒 5 次。
就这个限制适合公开多人使用吗?还是你有开通更高的 QPS ? |
38
kneo 2023-08-16 13:54:11 +08:00 via Android
其实最怕的是 ddos 。闲人真的很多。
|
40
Borch 2023-08-16 14:14:05 +08:00
@s7964926 别听那个 ajaxgoldfish 瞎扯,vmp 把原函数的汇编指令语义都给混淆搞没了,他说”至于 sign 直接 frida 一点一点看你调用然后还原就行了“,笑死个人,小小白在这唬人呢
|
42
Borch 2023-08-16 14:22:50 +08:00
@s7964926 以及想要防我上面说的“加了 vmp 的算法可以通过模拟执行引擎如 unicorn 还原内存环境后直接调用”,把调用 sign 函数所在的函数也给混淆了,就是把调用上下文给混淆了,别给破解者找到不逆算法间接调用 sign 的机会。
|
43
ajaxgoldfish 2023-08-16 14:25:10 +08:00
|
44
nuk 2023-08-16 14:35:10 +08:00
用微信扫码,然后破解啥的东西都让微信承担就好了。
如果本地运行的话,加不加壳没啥意义,反而容易报毒。 |
45
Borch 2023-08-16 14:37:15 +08:00
@ajaxgoldfish 看全了。vmp 的难点是指令虚拟化,虚拟化它自己的指令后还可以再混淆指令语义,请你展开说说啥是“至于 sign 直接 frida 一点一点看你调用然后还原就行了,最难得是脱壳”,楼主加 vmp 核心保护的就是 sign 算法,看不懂你这句话。
|
46
ajaxgoldfish 2023-08-16 14:40:00 +08:00
@Borch #41 我确实是小小白,但是根据本条回复综合你上条回复我的感觉你认为 vmp 不是壳,其实 vmp 就是壳因为脱了之后偏移量有问题也会崩溃程序(常规意义上)。所以我说直接加壳就行了至于 ”sign 直接 frida 一点一点看你调用然后还原就行了“我下面补充了我眼瞎了没看到 C++看成安卓程序了。
|
47
Borch 2023-08-16 14:52:01 +08:00
@ajaxgoldfish 1.脱壳脱不了虚拟化的指令。2.安卓也要逆 so 逆 C++,不懂你说的“没看到 C++看成安卓程序了”。
|
48
s7964926 OP @Borch
@ajaxgoldfish 感谢两位大佬给提供的建议,我都有好好看过好好学习过了 我的核心 sign 代码是进行过 vmp 最新版本的 sdk 加密了,我之前提出的问题其实就是,如果 vmp 不被脱壳,那么我的 sign 算法是不是就是安全的。 |
49
ajaxgoldfish 2023-08-16 18:50:20 +08:00
@s7964926 #48 sign 算法要加密调用 sign 的业务也要加上。
|
50
ajaxgoldfish 2023-08-16 18:58:19 +08:00
@Borch #47 最后回复老哥一次,op 第一句话就是用 C++写了个小软件,基本没有用 C++写安卓业务的吧。还有*在安卓*中为什么要逆动态库还原 sign 算法?,frida 直接暴露 rpc 接口直接调用你自己的 sign 算法拿到签名就行了,不需知道具体的 sign 算法是啥能用就行。你要说所有的业务都在 so 中那当我放屁就行。
|
51
Greatshu 2023-08-16 19:58:43 +08:00
用户规模不大就手动授权,比如一个 QQ 群,那位群友想用就要求他用自己 qq 邮箱注册一个账号,联系 OP 后台授权,提醒不要给别人用,否则以后都用不了,做好限流,完事
实在不行再加上设备 ID |
52
LykorisR 2023-08-16 22:28:00 +08:00
只要真想搞,不计成本的话,任何程序都能被破解
技术上混淆加密需要有,但最有效的办法是将破解成本升高到比购买还高 |
53
akira 2023-08-17 01:47:13 +08:00
只要你这东西破解的价值不大,就没啥人会闲着蛋疼去破。何况你是用的现成的接口,真没啥价值。
顺便,vmp 的 大概率现在已经有一键脱壳还原的了。别跳。 |
56
mmdsun 2023-08-17 07:38:04 +08:00 via iPhone
把你程序做成黑盒调用就行,不用破解。
直接用你的程序生成签名 nonce ,再去调用你接口。 还可以加随机数+时间防止重放,避免上面的情况,但别人可以用防火墙让网络发不出去,拿到 nonce 再调用接口 |
57
s7964926 OP @mmdsun 现在我把翻译的原文也加上了做了 sign
是不是就从如何破解加密算法,变成了如何替换获取到的翻译原文 |
58
lizhenda 2023-08-17 09:38:54 +08:00
确实很复杂,学到了
|
59
simo 2023-08-17 09:40:53 +08:00
楼上说到了,肯定能能做到,取决于破解收益。
所以把心思放到运营和迭代上就行 |
60
xdm1957 2023-08-17 10:09:29 +08:00
已经够了, 破解成本太高. 没人愿意花费那么大的功夫破解调用你接口的. 在加个限流, 提高破解者破解后的使用成本 (让他需要代理 IP). 基本没人去破解.
|
61
roycestevie6761 2023-08-17 10:12:27 +08:00
菜鸟太多,没搞过逆向的就不要误导楼主啦,瞎扯淡
|
62
D0n9 2023-08-17 11:27:23 +08:00
@roycestevie6761 确实。。
|
63
hanguofu 2023-08-17 20:37:04 +08:00 via Android
好奇问问: 一个交付给客户的 linux c++程序(不需要联网使用)有没有比较好的反逆向措施/工具?
|