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

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

  •  1
     
  •   s7964926 · 255 天前 via iPhone · 5091 次点击
    这是一个创建于 255 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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


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

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

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

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

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

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