当前位置:首页 » 编程软件 » 防止dll反编译

防止dll反编译

发布时间: 2022-06-16 23:46:08

① C# DLL如何保护防止被破解

.net的实时编译(JIT)特性决定了用它开发的程序可以被轻松反编译,同时由于采用反射等技术,使得DLL能被未授权调用。

所以要想不被破解,一是不能被反编译看到源码,二是不能被随意调用。

什么混淆加壳加密等,都是可逆的。鉴于.net代码可以包含非托管代码,我们可以用C++解析C#代码生成DLL,这个DLL在被调用时验证调用者信息,就可以解决针对C#的破解,以及非授权调用了。

参考链接:http://blog.csdn.net/qwsf01115/article/details/52169574

② C#怎样防止反编译

我使用的方法是利用加壳工具:virboxProtectorStandalone。直接进行加壳。高级混淆、虚拟化代码、智能压缩等加密策略。如果要授权控制,可使用许可版本的virboxProtector。

未经加壳保护的 ILspy 反编译效果如下:

public int add(int a, int b){
return a + b;}public int div(int a, int b){
return a / b;}public int mul(int a, int b){
return a * b;}public int sub(int a, int b){
return a - b;}

解决方案:

深思自主研发了为 C# .net 语言做保护的外壳(Virbox Protector)。将C# .net 编译成的执行程序(.exe),动态库(.dll)直接拖入加壳工具即可完成保护操作,十分方便。并且在效果上已经完全看不到源码中的逻辑。

加密后的效果

public int add(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16416u, 21, 16384u, 32u, 31516u, 5).Invoke(this, new object[]
{
this,
a,
b
});}
public int div(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16956u, 21, 16924u, 32u, 31516u, 2).Invoke(this, new object[]
{
this,
a,
b
});}
public int mul(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16776u, 21, 16744u, 32u, 31516u, 3).Invoke(this, new object[]
{
this,
a,
b
});}
public int sub(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16596u, 21, 16564u, 32u, 31516u, 4).Invoke(this, new object[]
{
this,
a,
b
});}

架构支持

IIS 服务架构的后台逻辑 DLL 文件

windows PC 应用程序 EXE 文件

windows PC 应用程序动态库 DLL 文件

UG等第三方绘图工具使用的 DLL 文件

Unity3d 编译使用的 DLL 文件

③ 如何防止U3D游戏引擎代码被反编译

经过查看不少的资料,发现目前针对的U3D游戏引擎代码防反编译,主要是通过DLL文件进行混淆,而支持的DLL混淆的服务商有爱加密等等,通过DLL文件本身进行加密,防止DLL被反编译,并且对加密算法和密钥进行加密,对加密过程也进行了加密。

④ 如何对编译的dll文件进行加密来防止反编译

为防止这类反向工程的威胁,最有效的办法是模糊。
模糊工具运用各种手段达到这一目标,但主要的途径是让变量名字不再具有指示其作用的能力、加密字符串和文字、插入各种欺骗指令使反编译得到的代码不可再编译。
例子:
对未经模糊处理的代码执行反向工程:
Private
Sub
CalcPayroll(ByVal
employeeGroup
As
SpecialList)
While
employeeGroup.HasMore
employee
=
employeeGroup.GetNext(True)
employee.updateSalary
DistributeCheck(employee)
End
While
End
Sub
同样的代码,经过模糊处理再执行反向工程:
Private
Sub
a(ByVal
b
As
a)
While
b.a
a
=
b.a(True)
a.a
a(a)
End
While
End
Sub
显然,两段代码的处理逻辑相同。但是,要说清楚第二段代码到底在做些什么极其困难,甚至要判断它正在访问哪些方法、哪些变量也很困难。
这种改变变量名称的功能是可配置的,例如,假设正在构造一个DLL,可以要求不改动API,有趣的是,这一处理过程显然只是简单地把大量变量的名称简缩成单个字符,但获得了非常好的模糊效果。

⑤ 如何防止程序员反编译

java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如Android开发的app),有时候,公司为了商业技术的保密考虑,不希望这里面的一些核心代码能够被人破解(破解之后,甚至可以被简单改改就发布出去,说严重点,就可能会扰乱公司的正常软件的市场行为),这时候就要求这些java代码不能够被反编译。

这里要先说一下反编译的现象。因为java一直秉持着开放共享的理念,所以大家也都知道,我们一般共享一个自己写的jar包时,同时会共享一个对应的source包。但这些依然与反编译没有什么关系,但java的共享理念,不只是建议我们这样做,而且它自己也在底层上“强迫”我们这么做!在java写的.java文件后,使用javac编译成class文件,在编译的过程,不像C/C++或C#那样编译时进行加密或混淆,它是直接对其进行符号化、标记化的编译处理,于是,也产生了一个逆向工程的问题:可以根据class文件反向解析成原来的java文件!这就是反编译的由来。

但很多时候,有些公司出于如上述的原因考虑时,真的不希望自己写的代码被别人反编译,尤其是那些收费的app或桌面软件(甚至还有一些j2ee的wen项目)!这时候,防止反编译就成了必然!但前面也说过了,因为开放理念的原因,class是可以被反编译的,那现在有这样的需求之后,有哪些方式可以做到防止反编译呢?经过研究java源代码并进行了一些技术实现(结果发现,以前都有人想到过,所以在对应章节的时候,我会贴出一些写得比较细的文章,而我就简单阐述一下,也算偷个懒吧),我总共整理出以下这几种方式:

代码混淆

这种方式的做法正如其名,是把代码打乱,并掺入一些随机或特殊的字符,让代码的可读性大大降低,“曲线救国”似的达到所谓的加密。其实,其本质就是打乱代码的顺序、将各类符号(如类名、方法名、属性名)进行随机或乱命名,使其无意义,让人读代码时很累,进而让人乍一看,以为这些代码是加过密的!

由其实现方式上可知,其实现原理只是扰乱正常的代码可读性,并不是真正的加密,如果一个人的耐心很好,依然可以理出整个程序在做什么,更何况,一个应用中,其核心代码才是人们想去了解的,所以大大缩小了代码阅读的范围!

当然,这种方式的存在,而且还比较流行,其原因在于,基本能防范一些技术人员进行反编译(比如说我,让我破解一个混淆的代码,我宁愿自己重写一个了)!而且其实现较为简单,对项目的代码又无开发上的侵入性。目前业界也有较多这类工具,有商用的,也有免费的,目前比较流行的免费的是:proguard(我现象临时用的就是这个)。

上面说了,这种方式其实并不是真正加密代码,其实代码还是能够被人反编译(有人可能说,使用proguard中的optimize选项,可以从字节流层面更改代码,甚至可以让JD这些反编译软件可以无法得到内容。说得有点道理,但有两个问题:1、使用optimize对JDK及环境要求较高,容易造成混淆后的代码无法正常运行;2、这种方式其实还是混淆,JD反编译有点问题,可以有更强悍的工具,矛盾哲学在哪儿都是存在的^_^)。那如何能做到我的class代码无法被人反编译呢?那就需要我们下面的“加密class”!

加密class

在说加密class之前,我们要先了解一些java的基本概念,如:ClassLoader。做java的人已经或者以后会知道,java程序的运行,是类中的逻辑在JVM中运行,而类又是怎么加载到JVM中的呢(JVM内幕之类的,不在本文中阐述,所以点到为止)?答案是:ClassLoader。JVM在启动时是如何初始化整个环境的,有哪些ClassLoader及作用是什么,大家可以自己问度娘,也不在本文中讨论。

让我们从最常见的代码开始,揭开一下ClassLoader的一点点面纱!看下面的代码:

Java代码

  • publicclassDemo{

  • publicstaticvoidmain(String[]args){

  • System.out.println(“helloworld!”);

  • }

  • }

  • 上面这段代码,大家都认识。但我要问的是:如果我们使用javac对其进行编译,然后使用java使其运行(为什么不在Eclipse中使用Runas功能呢?因为Eclipse帮我们封闭,从而简化了太多东西,使我们忽略了太多的底层细节,只有从原始的操作上,我们才能看到本质),那么,它是怎么加载到JVM中的?答案是:通过AppClassLoader加载的(相关知识点可以参考:http://hxraid.iteye.com/blog/747625)!如果不相信的话,可以输出一下System.out.println(Thread.currentThrea().getContextLoader());看看。

    那又有一个新的问题产生了:ClassLoader又是怎样加载class的呢?其实,AppClassLoader继承自java.lang.ClassLoader类,所以,基本操作都在这个类里面,让我们直接看下面这段核心代码吧:



    看到这里,已经没有必要再往下面看了(再往下就是native方法了,这是一个重大伏笔哦),我们要做的手脚就在这里!

    手脚怎么做呢?很简单,上面的代码逻辑告诉我们,ClassLoader只是拿到class文件中的内容byte[],然后交给JVM初始化!于是我们的逻辑就简单了:只要在交给JVM时是正确的class文件就行了,在这之前是什么样子无所谓!所以,我们的加密的整个逻辑就是:

  • 在编译代码时(如使用ant或maven),使用插件将代码进行加密(加密方式自己选),将class文件里面的内容读取成byte[],然后进行加密后再写回到class文件(这时候class文件里面的内容不是标准的class,无法被反编译了)

  • 在启动项目代码时,指定使用我们自定义的ClassLoader就行了,而自定义的部分,主要就是在这里做解密工作!

  • 如此,搞定!以上的做法比较完整的阐述,可以仔细阅读一下这篇文章:https://www.ddtsoft.com/#developerworks/cn/java/l-secureclass/文章中的介绍。

    通过这个方法貌似可以解决代码反编译的问题了!错!这里有一个巨大的坑!因为我们自定义的ClassLoader是不能加密的,要不然JVM不认识,就全歇菜了!如果我来反编译,呵呵,我只要反编译一下这个自定义的ClassLoader,然后把里面解密后的内容写到指定的文件中保存下来,再把这个加了逻辑的自定义ClassLoader放回去运行,你猜结果会怎样?没错,你会想死!因为你好不容易想出来的加密算法,结果人家根本不需要破解,直接就绕过去了!

    现在,让我们总结一下这个方法的优缺点:实现方式简单有效,同时对代码几乎没有侵入性,不影响正常开发与发布。缺点也很明显,就是很容易被人破解!

    当然啦,关于缺点问题,你也可以这么干:先对所有代码进行混淆、再进行加密,保证:1、不容易找到我们自定义的那个ClassLoader;2、就算找到了,破解了,代码可读性还是很差,让你看得吐血!(有一篇文章,我觉得写得不错,大家可以看一看:http://www.scjgcj.com/#blog/851544)

    嗯,我觉得这个方法很好,我自己也差点被这个想法感动了,但是,作为一个严谨的程序员,我真的不愿意留下一个隐患在这里!所以,我继续思索!

    高级加密class

    前面我们说过有个伏笔来着,还记得吧?没错,就是那个native!native定义的方法是什么方法?就是我们传说中的JNI调用!前面介绍过的有一篇文章中提到过,其实jvm的真实身份并不是java,而是c++写的jvm.dll(windows版本下),java与dll文件的调用就是通过JNI实现的!于是,我们就可以这样想:JNI可以调用第三方语言的类库,那么,我们可不可以把解密与装载使用第三方语言写(如C++,因为它们生成的库是不好反编译的),这样它可以把解密出来的class内容直接调jvm.dll的加载接口进行初始化成class,再返回给我们的ClassLoader?这样,我们自定义的ClassLoader只要使用JNI调用这个第三方语言写的组件,整个解密过程,都在黑盒中进行,别人就无从破解了!

    嗯,这个方法真的很不错的!但也有两个小问题:1.使用第三方语言写,得会第三方语言,我说的会,是指很溜!2.对于不同的操作系统,甚至同一操作系统不同的版本,都可能要有差异化的代码生成对应环境下的组件(如window下是exe,linux是so等)!如果你不在乎这两个问题,我觉得,这个方式真的挺不错的。但对于我来说,我的信条是,越复杂的方式越容易出错!我个人比较崇尚简洁的美,所以,这个方法我不会轻易使用!

    对了,如果大家觉得这个方法还算可行的话,可以推荐一个我无意中看到的东西给大家看看(我都没有用过的):jinstall,

    更改JVM

    看到这个标题,我想你可能会震惊。是的,你没看错,做为一个程序员,是应该要具有怀疑一切、敢想敢做的信念。如果你有意留心的话,你会发现JVM版本在业界其实也有好几个版本的,如:Sun公司的、IBM的、Apache的、Google的……

    所以,不要阻碍自己的想象力,现在没有这个能力,并不代表不可能。所以,我想到,如果我把jvm改了,在里面对加载的类进行解密,那不就可以了吗?我在设计构思过程中,突然发现:人老了就是容易糊涂!前面使用第三方语言实现解密的两个问题,正好也是更改JVM要面对的两个问题,而且还有一个更大的问题:这个JVM就得跟着这个项目到处走啊!

⑥ 如何让C++写的dll不被反编译

简单回答:
1、理论上不能保证程序不被反编译。
2、一些加壳软件可以做到加大被反编译的难度,迫使操作者先解壳才能做反编译,但同时会降低程序的运行效率。
3、当前的技术条件下,一般而言,反编译出的“源代码”一般而言并不能作学习,参考的源代码,多数情况下只能用于分析区部片断分析,主要用于破解或小范围类修改。
4、一些简单的加壳软件:ASPACK、UPX、PECompact等,如果想尝试,自个去搜索下载后试试。加壳后的软件还有可能被某些杀软当成恶意软件。
5、这也正是很多对安全要求高的系统使用“三层架构”(类似访问网页/网站)的原因。因为在三层架构中,核心软件、数据不被用户直接接触。

************以下是相关知识,有耐心可看看************
一、关于反编译与破解。
1、以当前的技术来说,理论上,所有的程序都存在被反编译的可能。
2、但是反编译出来的代码并不一定能被技术不高的人看懂,因为反编译出来的“源代码”与编写者写出的原代码在80%以上是不同的。这是因为反编译的原理是根据机器码(或中间码),让机算机进行反向生成高级语言,而不是找出编写者原有的代码,找出原有的代码是不可能的。反编译出来的代码在可理解性、可阅读性上,一般而言是非常差的。
3、但是,这并不代码反编译出来的“源代码”没有价值,对于内行来说,分析反编译出来的代码中的某些特定片段,就可以对程序进行破解,找出程序的关键点、口令、数据来源等等。因为破坏总是比建设要容易,分析局部比规划全局要容易得多。
4、如果考虑到被反编译将关键代码进行特殊处理的话,可能加大相关的难度,比如将特定的字符串分成多个字串在程序中存储,或是进行加密后存储,在使用时合成/生成,不用时即时在内存中清除等等……。
5、反编译后对关键部分的定位往往是根据字符串来进行的,比如在用户没有注册时,跳出一行对话,告诉用户“请注册后再使用”,破解者就会在反编译后追查这个字串所在,然后查到这个字串对应的变量与地址,再追查调用这个变量或地址的代码,然后再延伸查到什么情况下调用“调用这个变量或地址的代码”,最后,设定跳过语句。这就是最典型的破解注册的方法。破解完再将修改了的“源代码”进行编译,或是根据“源代码”直接修正程序中对应的代码,OK,破解版正式完成。
二、关于加壳。
1、理论上,同样,没有破解不了的壳。
2、但是有些加壳软件使用了一些特别的方法,使得破解壳的难度变得非常难,技术不够的朋友很难下手,比如将原程序代码拆分、变型、植入自校验等等技术。
3、但加壳软件同样是程序,它自身就存在被反编的可能,加了壳可以类比成,在一个木箱外面再加个保险柜。但千万别以为保险柜就一定是保险的,面对各种技术开锁、暴力开箱,再强的保险柜也只能是加大难度而已。
4、越复杂的加壳,就会使得程序运行时效率降得越低,这是必然的,因为原本只关注目标任务的程序现在还要时时提防着被提取、被监测。

⑦ C# dll 文件有什么好的混淆工具防止反编译

首先 C#没有任何办法反编译其次 C#只能混淆代码,起到一定的功效最后 C#混淆工具很多,VS自带的并不强大,可以用些比如Dotfuscator、xeoncode、foxit等等

⑧ 如何有效防止C#编写的DLL被反编译

为防止这类反向工程的威胁,最有效的办法是模糊。
模糊工具运用各种手段达到这一目标,但主要的途径是让变量名字不再具有指示其作用的能力、加密字符串和文字、插入各种欺骗指令使反编译得到的代码不可再编译。
例子:
对未经模糊处理的代码执行反向工程:
Private Sub CalcPayroll(ByVal employeeGroup As SpecialList)
While employeeGroup.HasMore
employee = employeeGroup.GetNext(True)
employee.updateSalary
DistributeCheck(employee)
End While
End Sub

同样的代码,经过模糊处理再执行反向工程:
Private Sub a(ByVal b As a)
While b.a
a = b.a(True)
a.a
a(a)
End While
End Sub

显然,两段代码的处理逻辑相同。但是,要说清楚第二段代码到底在做些什么极其困难,甚至要判断它正在访问哪些方法、哪些变量也很困难。
这种改变变量名称的功能是可配置的,例如,假设正在构造一个DLL,可以要求不改动API,有趣的是,这一处理过程显然只是简单地把大量变量的名称简缩成单个字符,但获得了非常好的模糊效果。

⑨ C#如何防止被别人反编译

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

反编译防范措施:

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

  • 混淆

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

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

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

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

⑩ .NET 编译出来的DLL文件,如何才能不被反编译

1.有那种代码混乱器,其实也就是改改类名字等,常用的有
DotFuscator, .NET Reactor, xenocode 。。。你可以自己搜索下载了
2.当代码量很大的时候,反编译去读MSIL的代码也是很辛苦的,工程量很大
3.一般.net写的程序都是基于web的,放在服务器上,WebService,所以盗版破解也显得不是那么有意义了。。。

友情提醒:事先备份好你的代码!

热点内容
我配置很高了ae为什么卡 发布:2025-05-17 14:54:50 浏览:166
python数据分析实战pdf 发布:2025-05-17 14:49:42 浏览:950
海澜之家广告脚本 发布:2025-05-17 13:56:06 浏览:30
手文件夹恢复 发布:2025-05-17 13:53:32 浏览:993
linux怎么看进程 发布:2025-05-17 13:53:30 浏览:303
thinkphp字段缓存 发布:2025-05-17 13:52:01 浏览:575
山灵app安卓版如何设置 发布:2025-05-17 13:51:49 浏览:388
帆布压缩袋 发布:2025-05-17 13:26:27 浏览:457
c语言16进制表示方法 发布:2025-05-17 13:11:25 浏览:480
ftp单位 发布:2025-05-17 13:10:03 浏览:142