业余时间用 c++做了个很小众的翻译软件,调用我 java 后端的翻译接口。 翻译方面是我自己购买的腾讯机器翻译的 api 。 我在软件里根据机器信息,时间戳,nonce 生成了一个 sign ,连同需要翻译的原文一起提交到我后端的接口进行验证,如果 sign 验证通过才返回信息,不通过直接拒绝。 想请问下各位,这个算法我使用了 vmp 的 sdk 虚拟化+混淆,在不会被脱壳的情况下,是不是不会被破解? 对软件逆向一窍不通,希望能得到各位大佬的指点,十分感谢。 翻译, Sign, 逆向, 软件
翻译软件做到这程度已经很不错了,大幅度提高了破解成本,虽然 vmp 不是完全安全的,但应该很少会有人花时间成本来破解。 楼上说的通信部分以及服务器本身安全可以多考虑下,比如用上证书双向认证,通信数据二次加密之类的,服务器防 ddos 等
可以破解。最简单的,加了 vmp 的算法可以通过模拟执行引擎如 unicorn 还原内存环境后直接调用,根本不用逆向 vmp 。另外问一下是哪家的 vmp 以及什么版本?有些 vmp 的一些版本快被分析烂了。
我理解你原文中的"破解"等于接口被破解,然后被第三方滥调用。毕竟是自己花钱买的 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 即可。