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

.net 的商业软件如何做到不被其他人逆向出源码?

  •  
  •   phantomer · 2017-04-22 20:42:03 +08:00 · 7834 次点击
    这是一个创建于 2772 天前的主题,其中的信息可能已经有所发展或是发生改变。

    .net 的商业软件如何做到不被其他人逆向出源码? 楼主目前工作遇到一个甲方希望自己的.net 商业软件无法被逆。 楼主多方打听了几个好基友,搞二进制的大佬,他们对.net 这方便也是比较接触的少,问了几家安全公司也几乎没搞加固.net 这方面的产品。

    所以我想问下大家,或大家所在的公司开发的.net 商业软件是如何加壳和混淆代码的?

    31 条回复    2017-04-25 09:49:00 +08:00
    phantomer
        1
    phantomer  
    OP
       2017-04-22 20:43:36 +08:00
    LZ 也给几个二进制大佬给的方案给了客户看,但是客户做依旧是可以被清楚的逆回来,看到源码
    Cbdy
        2
    Cbdy  
       2017-04-22 20:48:12 +08:00 via Android
    之前在 v 站看到过 Java 软件反逆向工程的讨论,可以去找来参考一下
    我感觉无外乎动中间码,动编译器和运行时了
    xenme
        3
    xenme  
       2017-04-22 20:48:18 +08:00 via iPhone
    先混淆名称,即使逆向完,看起来也头疼
    sun1991
        4
    sun1991  
       2017-04-22 20:48:47 +08:00
    keyword: .net obfuscator, 增加逆向难度. 要不考虑核心算法用 C 写.
    coderfox
        5
    coderfox  
       2017-04-22 20:49:53 +08:00 via Android
    用 CoreCLR ,修改文件解析部分做加密。
    可以参考腾讯做 Unity 加密的过程,以及 KLab 做 lua 加密的过程。
    liyvhg
        6
    liyvhg  
       2017-04-22 20:50:30 +08:00 via Android
    加多层壳上硬件 key 授权、上网络认证
    然而都没有好的办法防破(和楼主的想法可能有点出入)
    .net 是否是一种运行时解析的语言?
    JustFuckingDoIt
        7
    JustFuckingDoIt  
       2017-04-22 20:50:32 +08:00
    混淆
    JustFuckingDoIt
        8
    JustFuckingDoIt  
       2017-04-22 20:52:18 +08:00
    检测逆向工具,发现就崩溃或者格硬盘
    lany
        9
    lany  
       2017-04-22 20:53:03 +08:00
    DNGuard 能起到一部分作用
    h4x3rotab
        10
    h4x3rotab  
       2017-04-22 20:56:18 +08:00
    混淆、加猛壳。关键代码能放服务器就放服务器,不能可以考虑用 c++写。
    Pyjamas
        11
    Pyjamas  
       2017-04-22 21:05:59 +08:00
    混淆、反调试,目的在于增加逆向成本,当逆向成本过大的时候人家就不会来搞你了。
    无法被逆感觉不可能啊
    Mutoo
        12
    Mutoo  
       2017-04-22 21:08:57 +08:00
    商业应用可以考虑硬件加密狗咯,关键代码放到加密狗里,其它部分被逆向也没什么用。
    typcn
        13
    typcn  
       2017-04-22 21:12:27 +08:00
    90% 以上的工具全是垃圾,没什么用处

    我觉得唯一有难度的就是 DNGuard ,免费版也没用,那个商业版开了 HVM 之后效果非常强,之前遇到一软件,搞了一周多没搞定。
    kokutou
        14
    kokutou  
       2017-04-22 21:31:15 +08:00 via Android
    搜索 任意加密工具的名字 + 看雪
    就知道大概的强度了。。。
    Magentaize
        15
    Magentaize  
       2017-04-22 22:13:20 +08:00
    用 IL 写,逆向出来是不能被 MSBuild 编译的
    hjc4869
        16
    hjc4869  
       2017-04-22 22:16:24 +08:00
    这种需求一般混淆一下让逆出来的代码不可维护就差不多了吧
    neoblackcap
        17
    neoblackcap  
       2017-04-22 22:19:16 +08:00
    纵观各家的解决方案,我认为还是硬件狗最实际,而且最好是要求客户签 EULA , EULA 里面写明不允许逆向否则走法律途径。
    visonme
        18
    visonme  
       2017-04-22 22:41:30 +08:00   ❤️ 1
    三四年前看雪论坛的关于 net 的安全讨论还是很火的,上面也有不少这方面的资料,楼主可以搜搜,或许能找到一些有用的东西。(记得看雪某牛还出了本关于 net 安全的书,也可以看看,有几年了)

    说说自己以前公司的做法吧。
    1. 加壳 /混淆是肯定的,买商业软件,这些钱省不得。
    2. 对于部分核心的代码,自己内部做加密混淆或者模糊处理。
    3. 不要直接启动 net 主程序,通过 shel (一个简单的 exe 应用) l 来启动, shell 的作用就是做到一个环境的检测(我们那时候主要做调试环境和相关进程的检测)。
    4.通过 hack 技术,主要通过 hook 部分底层函数。
    czkwg8
        19
    czkwg8  
       2017-04-22 23:25:04 +08:00
    早已讨论过这个问题
    核心部分改用 C\C++编写
    .net 始终还是比较容易被逆的
    shot
        20
    shot  
       2017-04-22 23:25:42 +08:00
    https://github.com/yck1509/ConfuserEx

    功能非常强大,对付 中低水平的反编译和逆向工程绰绰有余。
    但是由于被黑客用于病毒加壳,当混淆等级过高时有很大几率被杀毒软件误伤,特别是某国产数字厂。
    kuretru
        21
    kuretru  
       2017-04-22 23:33:05 +08:00 via iPhone
    核心代码封装成 web 服务调用
    wdlth
        22
    wdlth  
       2017-04-22 23:42:14 +08:00
    没有所谓的无法被逆,连 Denuvo 那种级别的都可以被搞定,各种只有增加难度,延长时间而已。
    lauix
        23
    lauix  
       2017-04-22 23:42:46 +08:00
    二进制逆向我懂,反逆向我认为不存在。你怎么加密都能逆向回来,只是难度大不大而已。所以建议加壳混淆,不要有注释,代码尽量写乱点,自己看不懂这种程度最好。
    Mitt
        24
    Mitt  
       2017-04-22 23:50:44 +08:00   ❤️ 1
    @lauix 道理我都懂。。 但是哪个编译器会把注释编译到程序里的。
    zjlin1984
        25
    zjlin1984  
       2017-04-23 00:48:57 +08:00
    @visonme 能不能举个例子
    chinafeng
        26
    chinafeng  
       2017-04-23 10:24:05 +08:00
    DNGuard + Safengine, 核心函数用 C++ 或者其他语言重写, 也可在服务器上跑
    之前做商业软件, 需要用到一个 RSA 加密, 我丢到我服务器跑, 就算程序最后破解了, 也没太大作用
    朋友有个程序用的就是楼上说的一个方法, 一个子程序先启动, 循环检测环境和各类情况, 然后再调用起主程序
    Net 的混淆和破解还是挺容易的, 毕竟本身有中间层, 相当于扒光了
    beginor
        27
    beginor  
       2017-04-23 18:48:38 +08:00 via Android
    如果能兼容 mono 的话,可以试试它的静态编译。 虽然.net 也有本地编译,不过只支持 UWP 应用
    Jboys
        28
    Jboys  
       2017-04-23 19:59:36 +08:00
    以前的一个项目,公司买的有商业软件。驻场开发那边的人负责打包安装等一系列售后。
    zke1e
        29
    zke1e  
       2017-04-24 17:03:38 +08:00
    .net 做客户端很尴尬,确实太容易被破解了,个人觉得能用 c++写就尽量用 c++写,目前因为 u3d 游戏发展很好所以针对.net 的保护也有一些方案了,不过目前主要还是针对 u3d 的。
    tilv37
        30
    tilv37  
       2017-04-25 09:48:35 +08:00
    实心代码用 C++
    tilv37
        31
    tilv37  
       2017-04-25 09:49:00 +08:00
    @tilv37 核心
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 23:09 · PVG 07:09 · LAX 15:09 · JFK 18:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.