c#如何防反编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#如何防反编译相关的知识,希望对你有一定的参考价值。
C#开发的程序怎么防止反编译?
基本上无法防止反编译,但是可以控制发编译的效果,让反编译出来的代码无法正常查看。大都使用混淆器,譬如.NET Reactor等等。
.NET Reactor 是一款强大的 .NET 代码保护和许可管理系统,安全可靠、简单易用,主要用来帮助开发人员保护他们的 .NET 软件产品。开发人员从此不必担心如何保护他们的知识产权,可以将更多精力放在产品功能的开发上。与模糊工具(Obfuscator)相比,.NET Reactor 可以完全阻止对 .NET 程序集(由 C#, VB.NET, Delphi.NET, J#, MSIL... 等语言编写)的反编译。通俗的讲,.NETReactor 在破解者和您的 .NET 代码之间构建了强大的防破解保护屏障,生成一个基于 Windows 的而不是基于 MSIL 的兼容格式文件。原始的 .NET 代码完整的封装在本地代码内,无论何时都不会释放到硬盘,对于破解者是不可见的,目前还没有任何工具可以反编译 .NET Reactor 保护过的程序集。
使用方法:
将本地.NET程序集放在.NET Reactor程序中保护即可。 参考技术A .net是中间语言十分容易被反编译,通常都使用混淆作为一种加密手段。不过混淆不算真正防反编译,反编译后只不过代码难读懂而已,并且现在破解混淆的方式也比较多。所以真正要防反编译还是需要通过加密代码的方式。比如德国威步他们提供一种对.NET代码完全加密保护的方式来防止反编译的,曾经测试过用Reflector(.net反编译工具)反编译他们加密软件加密的.NET程序,的确完全无法看到源代码了。本回答被提问者采纳
android防反编译技术初体验——混淆
这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ
1.项目防反编译技术步骤:
a) 加密、
b) 混淆、
c) 加壳(加固);
2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密;
3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩、优化、混淆、预检的功能,AcFlash项目的Android端使用了ProGuard,以下是使用步骤:
a) 在model中build.gradle配置文件设置minifyEnabled为true;
b) 设置混淆默认数据,在proguard-rules.pro配置文件中配置:
#指定代码的压缩级别:0-7
-optimizationpasses 5
#混淆时不使用大小写混淆,混淆后的类名为小写
-dontusemixedcaseclassnames
#不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
#不优化输入的类文件
-dontoptimize
#不做预校验,android不需要
-dontpreverify
#忽略警告
-ignorewarning
#混淆后产生映射文件:包含有类名->混淆后类名的映射关系
-verbose
#混淆时所采用的算法,谷歌推荐,一般不修改
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
c) 设置项目中所有数据都混淆后,接下来该设置项目哪些内容不需要混淆;
i. 四大组件不被混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
ii. 被外部调用的类不被混淆
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v7.app.Fragment
-keep class android.support.** { *; }
-keep public class * extends android.support.**
-keep public class * extends android.view.View
iii. 实体类不能混淆
-keep public class com.leadpcom.acflash.bean.** {
public void set*(***);
public *** get*();
public *** is*();
}
iv. 自定义控件类不被混淆
-keepclasseswithmembers class * {
public <init>(android.content.Context,android.util.AttributeSet);
}
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context,android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
v. 为了防止在布局中设置onClick事件失效,所以保留在Activity中方法参数是view的方法:
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
vi. Parcelable和Serializable都是为了进行序列化,前者是android所特有的,比后者更高效,可以intent传递数据,也可进程间通信(IPC),保持 Parcelable、Serializable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[]
serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
vii. 资源类不混淆
-keepclassmembers class **.R$* {
public static <fields>;
}
viii. 记录生成的日志数据,gradle build时在本项目根目录输出
#apk 包内所有 class 的内部结构
-dump proguard/class_files.txt
#未混淆的类和成员
-printseeds proguard/seeds.txt
#列出从 apk 中删除的代码
-printusage proguard/unused.txt
#混淆前后的映射
-printmapping proguard/mapping.txt
ix. 移除Log类打印各个等级日志的代码,除了这种禁止log打印的方法,还有一种是通过BuildConfig.DEBUG的变量来控制
-assumenosideeffects class android.util.Log {
public static *** v(...);
public static *** i(...);
public static *** d(...);
public static *** w(...);
public static *** e(...);
}
x. 引入第三方json解析包不混淆(一般第三方jar包都已混淆过)
-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }
xi. proguard会检查每一引用是否正确,但第三方库里常常会有不会用到的类,没有正确引用,如果不配置,会报错
-dontwarn android.support.**
xii. 枚举enum不被混淆:暂无
xiii. native方法不被混淆:暂无
xiv. Jni不被混淆:暂无
xv. 对含有反射类的处理:暂无
xvi. 某些功能所涉及到的类及子类不被混淆,如下拉刷新:暂无
xvii. ......(根据项目功能代码,可再补充混淆)
4.加壳:混淆之后,利用乐固(腾讯推出)进行加固,生成最终的apk文件。
以上是关于c#如何防反编译的主要内容,如果未能解决你的问题,请参考以下文章