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

关于反逆向方面想请教一下各位

  •  1
     
  •   s7964926 · 2023-08-16 08:04:25 +08:00 via iPhone · 5474 次点击
    这是一个创建于 450 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业余时间用 c++做了个很小众的翻译软件,调用我 java 后端的翻译接口。 翻译方面是我自己购买的腾讯机器翻译的 api 。 我在软件里根据机器信息,时间戳,nonce 生成了一个 sign ,连同需要翻译的原文一起提交到我后端的接口进行验证,如果 sign 验证通过才返回信息,不通过直接拒绝。 想请问下各位,这个算法我使用了 vmp 的 sdk 虚拟化+混淆,在不会被脱壳的情况下,是不是不会被破解? 对软件逆向一窍不通,希望能得到各位大佬的指点,十分感谢。

    第 1 条附言  ·  2023-08-16 09:08:40 +08:00
    十分感谢各位大佬们的回复 让小弟受宠若惊!
    我的翻译软件就是纯粹的为爱发电 自己买的服务器和翻译额度 用来实时翻译视觉小说的
    每个留言我都会认真去看,再次感谢各位大佬的指点!
    64 条回复    2023-08-18 14:07:57 +08:00
    levelworm
        1
    levelworm  
       2023-08-16 08:10:16 +08:00 via Android
    中间人攻击呢?或者直接攻击你的服务器?
    rekulas
        2
    rekulas  
       2023-08-16 08:26:53 +08:00
    不会被破解太绝对了,我的理解是脱壳只是方便逆向但不是说必要条件,如果对方直接转汇编也不是不能分析出核心签名逻辑
    exch4nge
        3
    exch4nge  
       2023-08-16 08:31:07 +08:00 via iPhone
    翻译软件做到这程度已经很不错了,大幅度提高了破解成本,虽然 vmp 不是完全安全的,但应该很少会有人花时间成本来破解。
    楼上说的通信部分以及服务器本身安全可以多考虑下,比如用上证书双向认证,通信数据二次加密之类的,服务器防 ddos 等
    liuidetmks
        4
    liuidetmks  
       2023-08-16 08:36:51 +08:00   ❤️ 1
    最好把翻译原文也加入计算 sign ,
    差不多了,没人花大经历搞你的
    Borch
        5
    Borch  
       2023-08-16 08:40:07 +08:00
    可以破解。最简单的,加了 vmp 的算法可以通过模拟执行引擎如 unicorn 还原内存环境后直接调用,根本不用逆向 vmp 。另外问一下是哪家的 vmp 以及什么版本?有些 vmp 的一些版本快被分析烂了。
    lsk569937453
        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 即可。
    yyf1234
        7
    yyf1234  
       2023-08-16 08:42:25 +08:00 via iPhone
    这个算法最好足够复杂,不要是参数拼接然后 md5 ,这种动态调试很容易看出来,当破解付出的成本远大于收获的时候就没人愿意破解了
    pengtdyd
        8
    pengtdyd  
       2023-08-16 08:45:13 +08:00
    如果有人能逆向了,那么他为什么不直接使用腾讯机器翻译的 api 呢?何必多此一举?
    leokun
        9
    leokun  
       2023-08-16 08:47:59 +08:00
    @lsk569937453 如果连 sign 算法都能破解,网络层面的标识换 token 简直是小意思,前面这个个人感觉没有必要
    joApioVVx4M4X6Rf
        10
    joApioVVx4M4X6Rf  
       2023-08-16 08:48:39 +08:00   ❤️ 2
    既然都用接口了,应该引入登陆机制,用登陆的账号调用翻译 API ,经过服务器控制,比如速率啊,字数啊什么的,甚至不用管破解。。只要花钱了,任何账号都能用。即使他破解了接口,也是花账号里的余额
    0o0O0o0O0o
        11
    0o0O0o0O0o  
       2023-08-16 08:53:48 +08:00 via iPhone
    所有防护手段提升的是破解难度,而不存在不会被破解;
    加 vmp 也有需要注意的事项,多读文档;
    密码学最佳实践是绝对不建议自己实现、修改加密算法的,但你做这类客户端防护却可以来上几个,而不是调用常用库;
    当然最好还是别信任任何客户端信息,前端对抗无止境也不靠谱。尤其是你这种要保护的核心在后端 API ,其实非常简单,建议做个有注册成本的用户系统,例如小众你完全可以人工审核,后端按用户过滤、限频即可,另外做好服务器防护。
    lsk569937453
        12
    lsk569937453  
       2023-08-16 08:54:38 +08:00
    @leokun token 是服务端生成的,你换 token ,服务端也很容易识别。

    以下情况可以酌情弹验证码:

    1.同一个 token 调用 api 的频率小于 1s(判断不是人为多次点击,而是机器调用 api)
    2.新 token 生成后,3s 内马上请求后端接口(人为复制粘贴不可能这么快)


    反爬是为了增加爬虫的成本,道阻且长。
    ajaxgoldfish
        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 这个帖子。所以在这直接加壳就行了
    ajaxgoldfish
        14
    ajaxgoldfish  
       2023-08-16 09:06:50 +08:00
    我眼瞎了,没看清 C++软件,windows 抓更好抓了,其他的思路不变。同样是 hook 大法
    ding2dong
        15
    ding2dong  
       2023-08-16 09:08:38 +08:00
    没什么好办法,连微信这样的都被人破的干干净净。。 还是上账号机制吧
    s7964926
        16
    s7964926  
    OP
       2023-08-16 09:17:44 +08:00
    @lsk569937453 感谢大佬的热心回复!目前我没有采用注册账号的方式,因为软件定位就是打开直接使用。我在数据库中存储了一个身份验证码,但是并不绝对保证唯一性,只是电脑的 mac 地址,系统架构版本等,sha256 加密后存储到服务器上。时间戳方面我做了防重放验证,nonce 只能使用一次。
    从接口的调用频率可能没办法判断到底是不是正常的请求,因为是翻译视觉小说的,点击一次字幕就提交一次请求,大部分都比较频繁。
    s7964926
        17
    s7964926  
    OP
       2023-08-16 09:18:51 +08:00
    @v2exblog 这个是纯粹的为爱发电,花钱买来给圈子内的朋友们用的,但是就怕被传到外面去被坏心眼的人利用了。
    s7964926
        18
    s7964926  
    OP
       2023-08-16 09:21:20 +08:00
    @levelworm 中间人攻击的话我个人的理解是 MitM 替换掉请求中的参数,但是 sign 算法他逆向不出来,服务器是不会给他传有效信息的呀。DDoS 这种……那我就没办法啦哈哈哈
    s7964926
        19
    s7964926  
    OP
       2023-08-16 09:22:21 +08:00
    @Borch 感谢大佬的回复。vmp 的版本是目前的最新版 3.8.4 ,个人的 Lite 授权。有种大炮打蚊子的感觉……
    s7964926
        20
    s7964926  
    OP
       2023-08-16 09:23:54 +08:00
    @pengtdyd 可能是我没有说明白哈,这个腾讯机器翻译的 api 是我自己购买的,他需要访问我后端的接口去调用。如果他破解我的 sign ,那么就遭重了
    joApioVVx4M4X6Rf
        21
    joApioVVx4M4X6Rf  
       2023-08-16 09:25:46 +08:00
    @s7964926 那就用 token 的方式,谁用给谁生成一个 token ,后台呢统计 token 的 IP 地址/调用次数之类的,从源头就解决了破解问题。而你提供的二进制程序加不加密都无所谓了,只是一个客户端而已
    s7964926
        22
    s7964926  
    OP
       2023-08-16 09:36:58 +08:00
    @v2exblog 嗯啊,我寻思的是时间戳+全局唯一的 nonce+sign 验证再打个 vmp 保护壳就可以拦住不少人了,token 我也有生成但是不确保唯一,只是 mac 地址等 sha256 加密了一串。
    s7964926
        23
    s7964926  
    OP
       2023-08-16 09:39:53 +08:00
    @ajaxgoldfish 感谢大佬回复。真的是打开了新世界的大门……
    morgan1freeman
        24
    morgan1freeman  
       2023-08-16 09:50:29 +08:00   ❤️ 2
    没有意义的,你算一下破解你这玩意的成本跟收益就完了,
    搞逆向的也不是傻子,你弄个监控,如果 API 调用过量直接关掉,
    然后升级一下客户端跟 sign 算法就好了,
    谁没事,闲得蛋疼 为了你这个 API 来破解,你这是有家财万贯等着人偷呢,还是有金银珠宝等着人偷

    所有的防护手段都是提升破解方的成本罢了,如果收益足够大 远大于成本,像微信这样的,总有人搞的
    picone
        25
    picone  
       2023-08-16 09:51:41 +08:00
    我破解过一个 wasm + js 的前端项目,他就是企图用一个随机生成的字符串来掩饰这是签名串,比较隐蔽,并且把整个签名放到 wasm 里。
    不过最终还是破解了,因为
    - 他的随机字符串太孤零零了很明显
    - 他的签名生成算法太简单了。

    对应你的实现,只要脱壳了剩下的都是渣渣。
    c2const
        26
    c2const  
       2023-08-16 10:14:01 +08:00   ❤️ 1
    1.只要是运行在用户本地的代码,不管啥壳,都可以逆向,看汇编,理清代码逻辑 :(
    2.防破解更多的是把功能尽可能放在服务端,然后做访问限制 :)
    3.纯本地的功能,怎么防都会有破解版的 :(
    4.OP 做的这个软件,比较简单粗暴的方法,强制扫码/手机号之类的登录,才能访问服务器并调 api 就行了,非法访问就封了 :)
    c2const
        27
    c2const  
       2023-08-16 10:18:52 +08:00
    微软现在出 app ,比如手机上的"微软数学",全都是服务器计算,本地 app 只是展示结果和界面布局,不联网就只能用最基础的加减乘除功能,其它函数图像之类都不能用 :)
    asm
        28
    asm  
       2023-08-16 10:35:27 +08:00
    只能说看到 vmp 直接扔进回收站。。。
    streamrx
        29
    streamrx  
       2023-08-16 10:44:33 +08:00 via iPhone
    你做的这个东西 逆向了没什么收益 根本没有人会去逆向的。 用了 vmp 这些就已经很麻烦了 没有那么多人闲起没事做的
    wjx0912
        30
    wjx0912  
       2023-08-16 10:46:15 +08:00
    不怕被贼偷,就怕贼惦记
    lshang
        31
    lshang  
       2023-08-16 11:31:43 +08:00
    看起来这个工具的用户规模不大,只有少量的自己人使用,核心诉求是 API 不被坏人破解和盗用。

    那楼主可以考虑加一个 IP 白名单,只允许放白的 IP 调用 API 。如果怕麻烦就给用户一个申请 IP 放白的接口,然后人工审核,审核通过自动化加白。
    yinmin
        32
    yinmin  
       2023-08-16 11:57:38 +08:00
    你从社会工程学角度去考虑这件事情:为每台机器 ID 设置每天的使用上限,可以设得高一些,例如:通常 1 台机器每天几十次调用,你可以设置 1 天 2000 次调用的上限。如果有人投入大量精力去破解,也只能获得 2000 次/机器 ID 的调用,获得太少得不偿失,而你的损失可控。
    GeT1t
        33
    GeT1t  
       2023-08-16 11:58:54 +08:00
    怕被破解不要思路局限于加强客户端的保护,用一些使用策略从根本上杜绝破解(比如 12306 的候补车票),前面说的 token 加频控已经有很大的攻击门槛了。对于小软件已经非常够了。
    pannanxu
        34
    pannanxu  
       2023-08-16 12:07:42 +08:00
    试试埋点然后数据分析风控?或者其他第三方的一些行为验证?
    yinmin
        35
    yinmin  
       2023-08-16 12:07:53 +08:00   ❤️ 1
    这个算法“机器信息,时间戳,nonce 生成了一个 sign”是有 BUG 的,没有加入原文的 HASH 值。
    a33291
        36
    a33291  
       2023-08-16 12:53:00 +08:00
    单 vmp 就效果可以了,能搞定 vmp 的不屑于搞你,搞不定 vmp 的更不用担心了.
    miaomiao888
        37
    miaomiao888  
       2023-08-16 13:34:52 +08:00
    腾讯的接口不是本身就有 QPS 限制吗?好像每秒 5 次。
    就这个限制适合公开多人使用吗?还是你有开通更高的 QPS ?
    kneo
        38
    kneo  
       2023-08-16 13:54:11 +08:00 via Android
    其实最怕的是 ddos 。闲人真的很多。
    Borch
        39
    Borch  
       2023-08-16 14:11:39 +08:00
    @s7964926 vmp 新版的公开没啥分析,放心用,当然是正确使用的前提下,目标算法函数确定是加上保护了就行。
    Borch
        40
    Borch  
       2023-08-16 14:14:05 +08:00
    @s7964926 别听那个 ajaxgoldfish 瞎扯,vmp 把原函数的汇编指令语义都给混淆搞没了,他说”至于 sign 直接 frida 一点一点看你调用然后还原就行了“,笑死个人,小小白在这唬人呢
    Borch
        41
    Borch  
       2023-08-16 14:17:52 +08:00
    @picone vmp 是虚拟化汇编指令后再混淆语义,跟脱壳有毛线关系?
    Borch
        42
    Borch  
       2023-08-16 14:22:50 +08:00
    @s7964926 以及想要防我上面说的“加了 vmp 的算法可以通过模拟执行引擎如 unicorn 还原内存环境后直接调用”,把调用 sign 函数所在的函数也给混淆了,就是把调用上下文给混淆了,别给破解者找到不逆算法间接调用 sign 的机会。
    ajaxgoldfish
        43
    ajaxgoldfish  
       2023-08-16 14:25:10 +08:00
    @Borch #40
    @Borch #40 看全
    nuk
        44
    nuk  
       2023-08-16 14:35:10 +08:00
    用微信扫码,然后破解啥的东西都让微信承担就好了。
    如果本地运行的话,加不加壳没啥意义,反而容易报毒。
    Borch
        45
    Borch  
       2023-08-16 14:37:15 +08:00
    @ajaxgoldfish 看全了。vmp 的难点是指令虚拟化,虚拟化它自己的指令后还可以再混淆指令语义,请你展开说说啥是“至于 sign 直接 frida 一点一点看你调用然后还原就行了,最难得是脱壳”,楼主加 vmp 核心保护的就是 sign 算法,看不懂你这句话。
    ajaxgoldfish
        46
    ajaxgoldfish  
       2023-08-16 14:40:00 +08:00
    @Borch #41 我确实是小小白,但是根据本条回复综合你上条回复我的感觉你认为 vmp 不是壳,其实 vmp 就是壳因为脱了之后偏移量有问题也会崩溃程序(常规意义上)。所以我说直接加壳就行了至于 ”sign 直接 frida 一点一点看你调用然后还原就行了“我下面补充了我眼瞎了没看到 C++看成安卓程序了。
    Borch
        47
    Borch  
       2023-08-16 14:52:01 +08:00
    @ajaxgoldfish 1.脱壳脱不了虚拟化的指令。2.安卓也要逆 so 逆 C++,不懂你说的“没看到 C++看成安卓程序了”。
    s7964926
        48
    s7964926  
    OP
       2023-08-16 18:22:32 +08:00
    @Borch
    @ajaxgoldfish
    感谢两位大佬给提供的建议,我都有好好看过好好学习过了
    我的核心 sign 代码是进行过 vmp 最新版本的 sdk 加密了,我之前提出的问题其实就是,如果 vmp 不被脱壳,那么我的 sign 算法是不是就是安全的。
    ajaxgoldfish
        49
    ajaxgoldfish  
       2023-08-16 18:50:20 +08:00
    @s7964926 #48 sign 算法要加密调用 sign 的业务也要加上。
    ajaxgoldfish
        50
    ajaxgoldfish  
       2023-08-16 18:58:19 +08:00
    @Borch #47 最后回复老哥一次,op 第一句话就是用 C++写了个小软件,基本没有用 C++写安卓业务的吧。还有*在安卓*中为什么要逆动态库还原 sign 算法?,frida 直接暴露 rpc 接口直接调用你自己的 sign 算法拿到签名就行了,不需知道具体的 sign 算法是啥能用就行。你要说所有的业务都在 so 中那当我放屁就行。
    Greatshu
        51
    Greatshu  
       2023-08-16 19:58:43 +08:00
    用户规模不大就手动授权,比如一个 QQ 群,那位群友想用就要求他用自己 qq 邮箱注册一个账号,联系 OP 后台授权,提醒不要给别人用,否则以后都用不了,做好限流,完事
    实在不行再加上设备 ID
    LykorisR
        52
    LykorisR  
       2023-08-16 22:28:00 +08:00
    只要真想搞,不计成本的话,任何程序都能被破解
    技术上混淆加密需要有,但最有效的办法是将破解成本升高到比购买还高
    akira
        53
    akira  
       2023-08-17 01:47:13 +08:00
    只要你这东西破解的价值不大,就没啥人会闲着蛋疼去破。何况你是用的现成的接口,真没啥价值。

    顺便,vmp 的 大概率现在已经有一键脱壳还原的了。别跳。
    s7964926
        54
    s7964926  
    OP
       2023-08-17 04:46:06 +08:00
    @akira 愿闻其详,一键脱壳 vmp 虚拟机的流程
    s7964926
        55
    s7964926  
    OP
       2023-08-17 04:47:29 +08:00
    @yinmin 感谢提示,目前已经把 sign 的生成条件加了一个他要翻译的文本
    mmdsun
        56
    mmdsun  
       2023-08-17 07:38:04 +08:00 via iPhone
    把你程序做成黑盒调用就行,不用破解。
    直接用你的程序生成签名 nonce ,再去调用你接口。

    还可以加随机数+时间防止重放,避免上面的情况,但别人可以用防火墙让网络发不出去,拿到 nonce 再调用接口
    s7964926
        57
    s7964926  
    OP
       2023-08-17 07:45:58 +08:00 via iPhone
    @mmdsun 现在我把翻译的原文也加上了做了 sign
    是不是就从如何破解加密算法,变成了如何替换获取到的翻译原文
    lizhenda
        58
    lizhenda  
       2023-08-17 09:38:54 +08:00
    确实很复杂,学到了
    simo
        59
    simo  
       2023-08-17 09:40:53 +08:00
    楼上说到了,肯定能能做到,取决于破解收益。
    所以把心思放到运营和迭代上就行
    xdm1957
        60
    xdm1957  
       2023-08-17 10:09:29 +08:00
    已经够了, 破解成本太高. 没人愿意花费那么大的功夫破解调用你接口的. 在加个限流, 提高破解者破解后的使用成本 (让他需要代理 IP). 基本没人去破解.
    roycestevie6761
        61
    roycestevie6761  
       2023-08-17 10:12:27 +08:00
    菜鸟太多,没搞过逆向的就不要误导楼主啦,瞎扯淡
    D0n9
        62
    D0n9  
       2023-08-17 11:27:23 +08:00
    @roycestevie6761 确实。。
    hanguofu
        63
    hanguofu  
       2023-08-17 20:37:04 +08:00 via Android
    好奇问问: 一个交付给客户的 linux c++程序(不需要联网使用)有没有比较好的反逆向措施/工具?
    s7964926
        64
    s7964926  
    OP
       2023-08-18 14:07:57 +08:00 via iPhone
    @hanguofu vmprotect 的旗舰版有授权的功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5668 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 02:59 · PVG 10:59 · LAX 18:59 · JFK 21:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.