关于付费 APP 加密方式的一些疑问

2022-07-01 08:56:34 +08:00
 equationl

可能因为我的水平有限,我所能想到的加密方式似乎都没有实际用处。

比如,某个业务场景是付费用户可以创建无限的素材,而非付费用户只能创建不高于某数量的素材。

虽然我已经用了各种方式来加密这个“某数量”的值,不过不管前面写的多绕,但是最终还是会回归到一个 if 逻辑判断。

比如,针对上述场景,我是这样写的:

    val a = "RWM="
    val b = a.decodeBase64()?.string(Charset.forName("utf8")) ?: "${Char(0)}${Char(0)}"

    val realNum = 10

    if (realNum <= b.toCharArray()[1].code - b.toCharArray()[0].code) {
        println("pass")
    }
    else {
        println("you need pay first")
    }

但是反编译下来是这样的:

(节选)

      if (realNum <= var8 - var3) {
         var4 = "pass";
         System.out.println(var4);
      } else {
         var4 = "you need pay first";
         System.out.println(var4);
      }

不管你前面写的有多复杂,最终还是会回归到简单的 if 逻辑判断,别人修改时只需要删除或者直接改一下这个判断就能轻松破解了。

判断是否付费同理,不管前面写的多复杂,最终会回归到简单的逻辑判断。

所以我现在加密完全依赖于加固,但是加固也只能防的住“脚本小子”一键破解,如果是有大牛专门破解的话,也很容易被脱壳。

虽然防住“脚本小子”已经满足我的需求了,但是我还是想知道,应该怎么在不加固的情况下避免被“一键”破解呢?

据我所知,某个业内有名的 APP ,就没有使用加固,但是就是至今没被破解,甚至作者还专门搞了个悬赏,让别人区破解它。据我了解的是,至今没人破解成功。

补充:

  1. APP 性质决定了没法将需要加密的逻辑放到服务器避免被本地破解
  2. 上述代码只是做了一个示例,实际使用比这个复杂,而且核心代码也是写在 c++ 中的,不过正如我上述说的,即使写在 c++ 中,最终也是回归到 java 调用 c++的代码,然后做一个简单的逻辑判断
  3. 我想到的是把加密和业务逻辑混合在一起,但是自己实际测试过,即使这样反编译后效果也不理想。
6723 次点击
所在节点    程序员
67 条回复
equationl
2022-07-01 16:18:58 +08:00
@timethinker 对,确实就是你说的这种情况,但是有一点不同的是,我会在调用付费功能时重新和服务器对比校验密钥
zhaokun
2022-07-01 16:41:25 +08:00
没写过 app ,JVM 层面可以做一个代码解密后加载到内存,磁盘上存的是加密后的,不知道 app 有没有这类实现
equationl
2022-07-01 16:46:29 +08:00
@zhaokun 有的,加固的基本原理就是这个
wy315700
2022-07-01 16:47:15 +08:00
当年 win32 环境下各种加壳和脱壳的对抗。

加壳加花加校验。让人看不懂也改不了。
653513754
2022-07-01 16:56:49 +08:00
用 switch 写多点分支 [![jQqON4.png]( https://s1.ax1x.com/2022/07/01/jQqON4.png)]( https://imgtu.com/i/jQqON4)
maokabc
2022-07-01 17:02:06 +08:00
把核心代码 native 化就能防止这类工具反编译,可以试试这个 https://github.com/maoabc/nmmp
xkang66
2022-07-01 17:02:30 +08:00
@equationl 放脚本小子简单啊, 免费方法:验证方法写在 so 里面,native 化,并且使用 C++ RTTI 以及 inline 属性,然后加上 ollvm 防护。付费方法:选择知名加固厂商,进行 VMP 保护
xkang66
2022-07-01 17:05:41 +08:00
@equationl 但如果 APP 牵扯利益比较大,建议走付费方法,并且在服务器验证
kytrun
2022-07-01 17:06:46 +08:00
自己在各大社区发一个加点料的破解版,就没有人愿意动手了
nicevar
2022-07-01 17:10:08 +08:00
简单处理,你后面那个场景可以埋多个雷的,水平一般的也只会修改那个判断,你稍微玩点花的,对方可能就没那个耐心了,我个人的安卓收费软件一般是服务器多个协议校验+本地一个 c/c++库加解密逻辑,同时用两种不同的方式加密交换数据,能挡住绝大多数人了,当然挡不住一些功力深厚的,但是这类人大多也不会闲着去破解我的小应用,浪费他们的时间。
equationl
2022-07-01 17:25:07 +08:00
@kytrun 这个思路我怎么没想到,get 了
DzwsGo
2022-07-01 17:34:45 +08:00
@yaocai321 这个有点意思啊
d1g1tal0cean
2022-07-01 17:40:28 +08:00
@kytrun 神人啊
cat9life
2022-07-01 17:48:55 +08:00
不用云端验证就没有别的好办法,加固是一条
TimhLiu
2022-07-01 17:51:31 +08:00
MT 管理器的作者有提供防逆向的付费服务,管理器左侧菜单"应用保护",可以看看
https://blog.mt2.cn/app-protect/
delectate
2022-07-01 20:10:01 +08:00
1 、云端下发代码,内存运行,但是 kms 的方法可破;
2 、本地 uuid 生成 key ,保存的素材包含 key 和 uuid 。其他人打开时首先验证 key 和 uuid ,不合法则拒绝打开,或者低清版,或者随即崩溃;
3 、验证的逻辑,不要写得那么简单,要让 key 的应用更广泛。比如保存文件的名称,配置文件的路径,某些变量的值,都要用到 key 和时间戳的余数,如果 key 不合法,那么 key 和时间戳的余数也不合法,那么程序随机崩溃;
4 、本地导出素材隐写术加水印;
5 、守护进程检测程序是否被修改( md5 、关键位置的汇编是否改动),是否有修改工具在运行(这个仅限 pc 平台,app 不确定),内存中 dump 的验证注册信息的代码段是否被修改;
6 、参考一下 denuvo 和 drm ;
7 、使用认证硬件,比如加密狗。这个适合专业软件;
8 、ai 数据分析,比如用户的操作是否合理(常见于反挂,比如 a 坐标到 b 坐标,时间小于 10s 就是有问题)
cheng6563
2022-07-01 22:12:55 +08:00
我记得有混淆器把命名全替成 00OOoo 之类的
jhdxr
2022-07-01 22:20:49 +08:00
只考虑如何干掉 if:
//伪代码
func_table = [normal_flow, error_flow]
call func_table[to_int(condition)]

狗头.jpg
ZeroDu
2022-07-01 22:41:21 +08:00
mt 那么厉害吗?有没有大佬大概讲一下
DiamondYuan
2022-07-01 22:51:05 +08:00
https://balsamiq.com/company/how-we-run-our-business/business-strategy/software-piracy/


可以看看这篇


对于犯罪分子:你不能以技术为由打败他们,算了。如果人们想破解软件,他们会(代码混淆、call-home 方案与否。这些人在早餐前编写反编译器)。处理此问题的方法是在您的站点上拥有一份不错的最终用户许可协议以及使用条款文档. 确保每个下载链接上都写着“我同意”,并且基本上给人的印象是您已经完成了功课,有律师,而不是等待被利用的菜鸟。哦,如果时机成熟,一定要找一位好律师来帮助你。如果您发现有人以不同的品牌销售您的相同产品,我相信您律师的措辞强硬的信可能会有很长的路要走……再说一次,谁知道呢。但正如我稍后将解释的那样,这并不重要。



对于黑客:同样,不要试图用疯狂的加密方案打败他们,因为他们比你更好:你认为对编码有害的是他们的热情。我的做法是:尽量不要树敌,不要给他们挑战。如果你被认为是“一家不错的公司”,那么你成为黑客攻击目标的可能性就会降低(我不知道有多少 Windows 病毒是因为 MS 多年来对 Linux 的傲慢和攻击性言论造成的)。这在很大程度上是为什么我将这么多许可证授予非营利组织和各种行善者。此外,如果该软件一开始很便宜,有免费版本,而且许可证密钥看起来很容易破解,为什么还要费心破解它呢?我相信这些都是导致只有 16 人在 Google 上搜索“balsamiq 系列”的原因

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

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

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

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

© 2021 V2EX