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

无法破解的客户端?并非耸人听闻!

  •  
  •   sillydaddy · 2022-01-11 17:50:02 +08:00 · 3878 次点击
    这是一个创建于 1045 天前的主题,其中的信息可能已经有所发展或是发生改变。

    防破解的客户端

    客户端到底能不能防破解? 想必大部分 v 友都会摇头 say no 。

    最近偶然发现,「密码学」竟然可以做到让客户端无法破解!!而且是密码学意义上的无法破解!跟 RSA 同样性质的无法破解。what??!!

    这次还是通过这位博主的博文: http://blog.higashi.tech/2020/11/10/io_01.html 。上次看过他介绍「全同态加密」的文章。感谢🙏他的无私分享。

    怎样做到客户端无法破解呢?说一下我的一知半解:

    「不可区分混淆」的概念

    先给出「不可区分混淆」的概念: 给定被混淆的 2 个程序 C1,C2 ,而 C1,C2 拥有同样的功能。假如能构造一种混淆算法,使得第三方无法区分这两个电路的混淆结果 iO(C1)和 iO(C2),那么称为这种算法为不可区分混淆。 「 iO 」是 Indistinguishability Obfuscation 的缩写

    • 比如 C++源码,以及源码编译后得到的二进制码,可以看作拥有同样的功能。

    • javascript 经过各种混淆的前后,也可以看作拥有同样的功能。

    「不可区分混淆」的兔子洞

    是不是发现「不可区分混淆」这个概念有点绕,什么叫作不可区分呢?说实话我也不懂。 不过不要急,这里有一个非常「诡异」的论证(原始论文中的例子),来说明「不可区分混淆」的神奇所在!

    在我们进行软件开发的时候,有一件非常头疼的事情,那就是软件试用版的开发。假如我们在写一个游戏,我们已经把整个游戏写好了,但是想开放一部分的游戏免费给玩家试用,这个时候我们面临两种选择:

    - 第一种方案,就是我们把整个游戏复制一份,然后把收费版的功能和逻辑全部都一一删除掉,最后就留下免费试用的部分并且发布出去。这种方案虽然是最好的,但是整个过程会花费大量的精力,最后生成的“阉割”版本的游戏甚至可能还会有未知的 bug 需要我们来修补。
        
    - 第二种方案则非常简单,我们直接在软件内部设置一组 feature flags (功能开关),可以选择性的打开或者关闭一部分的功能。我们可以在试用版的软件中把收费的功能对应的 flag 都关闭,这样整个程序就不会运行任何付费的功能了。这种方案相对来说比较常见,但是问题在于,一旦黑客破解了我们的程序,然后把收费功能打开的话,那么这些功能就一览无余了。
    

    这个时候,就轮到「不可区分混淆」登场了。参照图中所示,我们同时对第一种方案中的试用版程序与第二种方案中的限制版程序进行「不可区分混淆」处理。我们观察发现,因为左右两边的程序在功能性上是完全相同的,所以我们无法分清看到的混淆输出到底是来自第一种方案还是第二种方案。

    这样一来,我们就可以基于第二种方案的限制版程序,施加一层「不可区分混淆」,得到的结果与混淆删减版的是不可取分的,代码都删减了还怎么破解呢?

    可以用了?

    基于「多线性配对」的「不可区分混淆」算法,已经构造出来了。而这个算法的安全性,依赖于 4 个密码学假设,其中有 1 个稍弱。意思是只要这 4 个假设成立,那么不可区分混淆就是密码学意义上安全的。白话就是:客户端就可以防破解,密码学意义上的防破解。

    但构造方法有了,不意味着现实中也可以有效实现:目前这个构造方法,哪怕在实验室里的运用也远不如「全同态加密」:代码膨胀、运算效率问题都非常非常非常严重。

    题外话:「不可区分混淆」用于防破解仅仅是牛刀小试————据说它甚至可以看作是密码学领域的「原力」哦。

    第 1 条附言  ·  2022-01-11 23:14:52 +08:00
    补一下 2020 年的最新进展论文: https://eprint.iacr.org/2020/1003
    发这个帖子就是感觉这个挺有意思,密码学真的很神奇。
    24 条回复    2022-01-14 09:29:14 +08:00
    dbskcnc
        1
    dbskcnc  
       2022-01-11 17:55:15 +08:00
    自欺欺人
    3dwelcome
        2
    3dwelcome  
       2022-01-11 18:02:35 +08:00
    Virtual Black Box Obfuscation ,其实就是一个黑盒虚拟机。

    黑客能看到 VM 代码,但是无法轻易去修改 VM 代码。

    我以前也想过类似方法,javascript 里套一层虚拟机,然后虚拟机里再套一层虚拟机,一般来说逻辑代码就没办法被修改掉了。
    yaoyao1128
        3
    yaoyao1128  
       2022-01-11 18:14:32 +08:00 via iPhone
    io 得到证实了咩……感觉上次听说好久了……
    不过看文章没有明确说……

    - 这样一来,我们就可以基于第二种方案的限制版程序,施加一层「不可区分混淆」,得到的结果与混淆删减版的是不可取分的,代码都删减了还怎么破解呢?

    可是我的理解是 方案一方案二分不出来 但是你删除代码有点类似我弄了内购 但是还需要下载 pro 的包……这样的话类似 dlc 的方式和混淆的问题不是那么大了……

    并且对于客户端 方案一和二的区别在功能上可以考虑不可区分 但是本体还是可区分的

    - javascript 经过各种混淆的前后,也可以看作拥有同样的功能。

    但是 js 的混淆就是一个例子啊 用户可以得到混淆后代码 就有能力推出之前代码 问题是成本问题

    个人觉得这个 io 还是密码学概念 是针对加密的 对一个内容通过 io 的概念进行加密得到的结果不可区分,但是前提用户只得到密文。对于客户端来说,想要运行很难做到只给密文(不过个人觉得 pwa 的话 如果证书算法支持 io 就可以做到)
    Buges
        4
    Buges  
       2022-01-11 18:19:15 +08:00 via Android
    看到“密码学”意义上的无法破解还以为你要说 trusted computing 。
    l00t
        5
    l00t  
       2022-01-11 18:34:13 +08:00
    不知所云。你把 flag 开关关闭后,功能是一样了,那么你还要打开吗?如果保留打开的功能,那么显然和删代码的版本相比,功能是不一样的。功能还只是程序逻辑,填充无意义的文本或许能把大小也整得差不多大,但你还有资源文件呢?扒一下资源文件也能区分出来哪个是哪个啊。
    mxT52CRuqR6o5
        6
    mxT52CRuqR6o5  
       2022-01-11 18:41:42 +08:00
    都是些理论上的东西,“IO 的定义是什么,以及拥有 IO 之后,我们可以做些什么”
    完全没有提到是具体做了哪些事情达到 IO 的
    https://zh.wikipedia.org/wiki/%E4%B8%8D%E5%8F%AF%E5%8D%80%E5%88%86%E6%B7%B7%E6%B7%86
    根据中文 wiki 所说,IO [其存在性一直是未解问题]
    mxT52CRuqR6o5
        7
    mxT52CRuqR6o5  
       2022-01-11 18:43:21 +08:00
    如果 IO 不存在,这些理论全都是空谈
    mxT52CRuqR6o5
        8
    mxT52CRuqR6o5  
       2022-01-11 18:50:21 +08:00
    研究了一下英文版的 wiki 说明,看的不是很明白,感觉好像是需要特殊的硬件?
    sillydaddy
        9
    sillydaddy  
    OP
       2022-01-11 19:10:36 +08:00
    @yaoyao1128 #3 > “。。并且对于客户端 方案一和二的区别在功能上可以考虑不可区分 但是本体还是可区分的。。”
    @l00t #5 > “。。如果保留打开的功能,那么显然和删代码的版本相比,功能是不一样的。”

    不可区分混淆,针对的是运行时的功能,不是代码本体:通过 if(flag)注掉,或者把相关代码删掉,这两个在运行功能上来说,是完全没有区别的。
    SoloCompany
        10
    SoloCompany  
       2022-01-11 19:27:47 +08:00
    仍然是不知所云,没有看论文本身,也许只是解释的文字不知所云

    如果目的仅仅是分发一个 lite 版的代码, 那条件编译不是早就解决了,而且是真正意义的删除了代码
    Jooooooooo
        11
    Jooooooooo  
       2022-01-11 19:39:08 +08:00
    有没有一个可供尝试破解的实际软件呢?
    AoEiuV020CN
        12
    AoEiuV020CN  
       2022-01-11 20:17:05 +08:00 via Android
    太长不看,只要客户端的 Hello World 可以被反编译篡改成 Hello fuck 那就算是被破解,
    这个层面考虑我不觉得有任何技术可以杜绝,
    因此无法破解只能是玩文字游戏,
    felixcode
        13
    felixcode  
       2022-01-11 20:22:39 +08:00 via Android
    你搞个 demo 让这里的人练练手不就得了
    “Talk is cheap, show me the code.”
    taskorder
        14
    taskorder  
       2022-01-11 20:29:10 +08:00
    我耐着性子看完了文章,只能说是不知所云自欺欺人
    sillydaddy
        15
    sillydaddy  
    OP
       2022-01-11 23:03:29 +08:00
    @Jooooooooo #11
    @felixcode #13
    demo 效率应该是非常低。引用一下 wiki 上的资料(是 2017 年的,而不是最新进展的 2020 年,但可以参考):

    Practicability?
    There have been attempts to implement and benchmark IO candidates. For example, as of 2017, an obfuscation of the function x1∧x2∧⋯∧x32 at a security level of 80 bits took 23.5 minutes to produce and measured 11.6 GB, with an evaluation time of 77 ms. Additionally, an obfuscation of the Advanced Encryption Standard hash function at a security level of 128 bits would measure 18 PB and have an evaluation time of about 272 years. An open-source software implementation of an IO candidate was created in 2015.
    felixcode
        16
    felixcode  
       2022-01-11 23:17:07 +08:00
    @sillydaddy
    车子能不能跑,应该拿辆车子跑一下试试,跑起来就行,哪怕慢了也能验证原理。
    而不是说,车子跑太慢了,所以演示不了,但原理没问题。
    abersheeran
        17
    abersheeran  
       2022-01-12 10:30:23 +08:00
    只从机器码逆逻辑,怎么防止破解?机器码不可能被混淆逻辑。
    653513754
        18
    653513754  
       2022-01-12 10:38:56 +08:00
    只要能运行起来,就能破解.管你加了多少层密
    zmqiang
        19
    zmqiang  
       2022-01-12 18:22:48 +08:00
    不太理解文章里“功能一致”的约束范围,如果有两个程序,给同样的输入得到同样的输出,但是效率不同,这个算不算“功能一致”
    sillydaddy
        20
    sillydaddy  
    OP
       2022-01-12 19:30:18 +08:00
    @zmqiang 算的,功能一致应该是指 2 份代码的逻辑是一模一样的。

    不过说实话,这些概念都是有严格定义的,我没有去研究,只是大概了解了一下,然后头脑中有一个非常大概的轮廓。
    如果感兴趣的话,可以去看看主题里所提到的博客,相当于是科普版(这方面的中文资料很难找),有能力的话学习下原始的论文。

    楼上好多人摆脱不了狭隘的思维惯性,也是无法可说。
    2i2Re2PLMaDnghL
        21
    2i2Re2PLMaDnghL  
       2022-01-13 14:16:29 +08:00
    FHE 派的想法很有趣
    我们可以实现一个支持对程序进行全同态加密的 apply 函数 result = FHE_apply(ec, ...args)
    其中 ec = FHE(c)
    i0error
        22
    i0error  
       2022-01-13 19:49:50 +08:00
    只要我代码写得够烂,就不会被破解(🐶
    sillydaddy
        23
    sillydaddy  
    OP
       2022-01-14 09:20:35 +08:00
    @2i2Re2PLMaDnghL
    博文里也提到 iO 跟 FHE 的相似之处:FHE 是对某些数据操作,然后不暴露数据本身; iO 类似保留函数的功能,不暴露函数本身。
    2i2Re2PLMaDnghL
        24
    2i2Re2PLMaDnghL  
       2022-01-14 09:29:14 +08:00
    @sillydaddy 不过俺寻思 iO 和 FHE 希望支持的事物都是被 RMS 痛斥的现象
    一个叫做专有软件,一个叫做 SaaSS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:11 · PVG 02:11 · LAX 10:11 · JFK 13:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.