zoukankan      html  css  js  c++  java
  • C# 反编译防范

    C# 编写的代码通过VS编译器生成 dll 或 exe ,很容易被一些反编译工具查看到源码或对源码进行修改。
    为防止代码被反编译或被篡改,我们可以进行一定的防范措施。但不能杜绝,因为DotNet编写代码运行必须编译成IL 中间语言,IL是很规则,同时也很好反编译。

    反编译防范措施:

    • 设置项目代码反汇编属性
    • 混淆

    方法一:防止 Ildasm.exe(MSIL 反汇编程序) 反汇编程序集

    方法很简单在项目文件AssemblyInfo.cs中增加SuppressIldasm属性。

    当项目中增加SuppressIldasm属性后在使用ildasm.exe反编译代码,会提示:"受保护的模块 -- 无法进行反汇编"

    ildasm.exe 读取项目中包含 SuppressIldasm 属性就不对此程序集进行反编译。但ILSyp,Reflector等反编译工具针对程序集设置SuppressIldasm属性置之不理,一样可以反编译源码。

    缺点:
    可见SuppressIldasm 属性只针对ildasm.exe工具起效果,同时也能删除ildasm.exe工具的此项限制。参考:《去掉ILDasm的SuppressIldasmAttribute限制》

    方法二:混淆

    混淆原理:将VS编译出的文件(exe 或 dll)通过ildasm对文件进行重命名,字符串加密,移动等方式将原始代码打乱。这种方式比较常见。

    VS2013 自带混淆工具:工具-->PreEmptive Dotfuscator and Analytics

    但VS2013自带Dotfuscator 5.5 需购买激活才能使用全部功能。目前百度提供 DotfuscatorPro 4.9 破解版版本下载。

    打开 DotfuscatorPro 4.9 主界面

    Settings->Global Options 全局配置
    常用功能配置:Disable String Encryption=NO 启用字符串加密

    选择需混淆C#编译代码(dll 或 exe)
    其中Library不要勾选,否则有些类、变量等等不会混淆;

    Rename 重命名配置
    常用功能配置: 勾选 = use enhanced overload induction 使用增强模式
    重命名方案 Renaming Scheme = Unprintable (不可打印字符,即乱码),也可以选择其他如小写字母、大写字符、数字的方式。

    String Encryption 字符串加密
    勾选需要加密字符串文件(exe 或 dll)

    可根据各自需求可进行其他相关配置。(如:control flow,Output,Setting ->Build Settings,Settings --> Project Properties等)
    最后生成混淆文件 Build Project。

    Build Project 生成混淆项目错误:
    Could not find a compatible version of ildasm to run on assembly C:Users***binDebugWindowsFormsApplication1.exe.??This assembly was originally built with .NET Framework v4.0.30319.
    Build Error.

    处理方法:
    ILASM_v4.0.30319 = C:WindowsMicrosoft.NETFrameworkv4.0.30319ilasm.exe
    ILDASM_v4.0.30319 = C:Program Files (x86)Microsoft SDKsWindowsv8.1AinNETFX 4.5.1 Toolsildasm.exe [安装VS版本不同对应目录会有所变化]

    混淆代码对比

    未使用混淆工具,反编译出的源码:

    使用混淆工具,反编译出的源码:

    效果很明显,很难看出反编译代码所写的真正逻辑。

    缺点:
    C#代码通过混淆工具生成后,增加了很多转换过程。这使得反编译工具无法很直观看到源码真正逻辑。但源码代码过多转换会使软件本身运行效率降低,甚至会出现报错情况。

    ************转摘:https://www.cnblogs.com/caokai520/p/7711136.html

  • 相关阅读:
    面向对象的特征有哪些方面?
    构造器(constructor)是否可被重写(override)?
    swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
    Java的运算符
    staitc关键字
    final关键字
    java的基本知识技能(二)
    java的基本操作和基本知识技能
    java概述------
    java中有几种方法实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
  • 原文地址:https://www.cnblogs.com/linybo/p/13358809.html
Copyright © 2011-2022 走看看