首页 数据库 mysql教程 .NET 源代码的安全性(源代码工具真正比拼) (論)(2)

.NET 源代码的安全性(源代码工具真正比拼) (論)(2)

Jun 07, 2016 pm 03:17 PM
.net 安全性 工具 打字 比拼 源代码

打字好累,所以废话少讲,我们切入正题。 今天被屠宰的对象就是 我们公司使用 vb.net开发的一套管理系统。名字就不说了,此系统主程序约3M,其中共有约 3000个方法,事件,等等。是一个中大型的程序,源代码约有 5万行左右(去掉一些自动生成的代码计算后)

打字好累,所以废话少讲,我们切入正题。

今天被屠宰的对象就是 我们公司使用vb.net开发的一套管理系统。名字就不说了,此系统主程序约3M,其中共有约 3000个方法,事件,等等。是一个中大型的程序,源代码约有 5万行左右(去掉一些自动生成的代码计算后),其中有底层硬件操作类,也有水晶报表操作,数据库操作。我们最关心的是其中的一块,注册类,以及一些核心代码。而我们演示的时候将会把注册代码拿出来演示(当然,不是原来的注册代码。。。那个拿出去,BOSS要杀我的)

<span> </span>

而代码保护工具的主角是:

1.   Dotfuscator Community Edition //微软推荐的东东,我个人认为非常烂

2.   XeonCode              //最近最好的混淆器,有可取点.它号称安全,我们今

//天来看看是不是真的安全

3.   MaxtoCode            //一个不同于混淆的.NET源码工具 MaxtoCode

//目前普及版只支持 WindowsApplication的加密

//以后开放 WEB APPlication and Class Library

<span> </span>

我们的反编译目标分为二种:

1.      C#语言

2.      MSIL语言

使用的全是市场上流通的免费反编译工具,我知道收费的反编译工具还会自动还源混淆.收费的我也没有条件去测试

<span> </span>

<span> </span>

,开始测试:

我们分别使用上面三样对代码进行混淆或加密。

完毕,测试程序所有功能:

1.      Dotfuscator Community Edition 我最不喜欢的混淆器,由于是1.2免费版,所以必须混淆所有模块,导致部分功能不能使用。但我们不关心那些,我们一会将展现被混淆的注册代码(因为类和方法都被混淆,所以必须要花点时间)

2.      XeonCode 一个相对强大的混淆工具,我一直认为他与某著名的反编译工具捆绑,导至其它工具能反编译的代码而它不能反编译。我们把它的强度开到最大,勾上所有能勾的选项。(它混淆的Windows Application可以正常运行)

3.      MaxtoCode 这是一个加密器,可以与XeonCode叠加使用,并且在2.0版中,将会加入自混淆功能,成为混淆加密一体化的工具。(它混淆的 Windows Applicaton 可以正常运行)

<span> </span>

我们最关心的是混淆或加密的结果。OK,请不要急,让我们先看看源代码,再比较一下反编译后的代码。

<span> </span>

    Private Function Encrypt(ByVal inStr As String) As String

<span> </span>

        Dim key As String = "a#2151336fdaghksfges"

        Dim out As String

        Dim j, i, s As Integer

        i = inStr.Length

        s = 0

        For j = 0 To i - 1

            out = out + inStr.Substring(j, 1) + key.Substring(s, 1)

            s = s + 1

            If s >= 20 Then s = 0

        Next

        Return out

<span> </span>

    End Function

<span> </span>

    Private Function Register(ByVal instr As String) As String

        Dim pRsa As New System.Security.Cryptography.RSACryptoServiceProvider

        Dim en As New System.Text.ASCIIEncoding

        Return en.GetString(pRsa.Encrypt(en.GetBytes(Encrypt(instr)), False))

        'Dim a As String

        'a = Encrypt(instr)

        'Dim b() As Byte

        'Dim c() As Byte

        'b = en.GetBytes(a)

        'c = pRsa.Encrypt(b, False)

        'Return en.GetString(c)

          这里怕大家看不清楚,特别加了展开的代码

End Function

<span> </span>

源代码很清楚,即是对字符串进行插入,然后使用 RSA 进行加密(这里省去了RSA的KEY)

 

好,那么我们首先来看看使用上面三种工具混淆后的C#代码

<span> </span>

1.   Dotfuscator Community Edition

<span>private</span><span> <font>string</font> <b>b</b>(<font>string</font> A_0)<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span>{<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span>      </span><font>string</font> <b>text3</b>;<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span>      </span><font>string</font> <b>text2</b> = <span>"a#2151336fdaghksfges"</span>;</span>
登录后复制
<span><span>      </span><font>int</font> <b>num1</b> = A_0.<font>Length</font>;</span>
登录后复制
<span><span>      </span><font>int</font> <b>num3</b> = <span>0</span>;</span>
登录后复制
<span><span>      </span><font>int</font> <b>num4</b> = num1 - <span>1</span>;</span>
登录后复制
<span><span>      </span><span>for</span> (<font>int</font> <b>num2</b> = <span>0</span>; num2 </span>
登录后复制
<span><span>      </span>{</span>
登录后复制
<span><span>            </span>text3 = text3 + A_0.<font>Substring</font>(num2, <span>1</span>) + text2.<font>Substring</font>(num3, <span>1</span>);</span>
登录后复制
<span><span>            </span>num3++;</span>
登录后复制
<span><span>            </span><span>if</span> (num3 >= <span>20</span>)</span>
登录后复制
<span><span>            </span>{</span>
登录后复制
<span><span>                  </span>num3 = <span>0</span>;</span>
登录后复制
<span><span>            </span>}</span>
登录后复制
<span><span>      </span>}</span>
登录后复制
<span><span>      </span><span>return</span> text3;</span>
登录后复制
<span>}</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

<span> </span>

<span>private</span><span> <font>string</font> <b>a</b>(<font>string</font> A_0)</span>
登录后复制
<span>{</span>
登录后复制
登录后复制
登录后复制
登录后复制
<span><span>      </span><font>RSACryptoServiceProvider</font> <b>provider1</b> = <span>new</span> <font>RSACryptoServiceProvider</font>();</span>
登录后复制
登录后复制
<span><span>      </span><font>ASCIIEncoding</font> <b>encoding1</b> = <span>new</span> <font>ASCIIEncoding</font>();</span>
登录后复制
登录后复制
<span><span>      </span><span>return</span> encoding1.<font>GetString</font>(provider1.<font>Encrypt</font>(encoding1.<font>GetBytes</font>(<span>this</span>.<font>b</font>(A_0)), <span>false</span>));</span>
登录后复制
<span>}</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

<span> </span>

评价:跟原代码一模一样,只是混淆了类和方法名称,代码中根本未进行混淆,由于是免费版,也只能提供这么多功能.毫无意义

<span> </span>

2.   XeonCode

<span> </span>

<span>private string x246b032720dd4c0d(string x96c91b85a03f00b0)</span>
登录后复制
<span><span><span>        </span>{</span></span>
登录后复制
<span><span><span>            </span>string str2;</span></span>
登录后复制
<span><span> </span></span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span><span>            </span>string str3;</span></span>
登录后复制
<span><span> </span></span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span><span>            </span>int k;</span></span>
登录后复制
<span><span> </span></span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span><span>            </span>int j;</span></span>
登录后复制
登录后复制
<span><span> </span></span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span><span>            </span>str2 = String.Intern(x1110bdd110cdcea4._d574bb1a8f3e9cbc("/uec3b/uf2fa/ufa06/u0102/u0803/u0efc/u15fb/u1cf8/u23f8/u2b25/u3220/u391a/u401d/u471b/u4e1b/u5520/u5c10/u630e/u6a09/u7114", 281144282));</span></span>
登录后复制
<span><span><span>            </span>int i1 = x96c91b85a03f00b0.Length;</span></span>
登录后复制
<span><span><span>            </span>k = 0;</span></span>
登录后复制
登录后复制
<span><span><span>          </span><span>  </span>i2 = i1 - 1;</span></span>
登录后复制
<span><span><span>            </span>j = 0;</span></span>
登录后复制
<span><span><span>            </span>goto IL_003c;</span></span>
登录后复制
<span><span><span>            </span>VariableExp: k</span></span>
登录后复制
登录后复制
<span><span><span>            </span>ConstantExp: 20</span></span>
登录后复制
<span><span><span>      </span>IL_0029:<span>  </span>blt.s<span>      </span>IL_0038<span>  </span>//自动的跳转混合</span></span>
登录后复制
<span><span><span>            </span>k = 0;</span></span>
登录后复制
登录后复制
<span><span><span>            </span>goto IL_0038;<span>  </span><span>  </span>//花指令</span></span>
登录后复制
<span><span><span>            </span>ConstantExp: 1</span></span>
登录后复制
<span><span><span>      </span>IL_0031:<span>  </span>add.ovf<span>    </span></span></span>
登录后复制
<span><span><span>      </span>IL_0032:<span>  </span>stloc.s<span>    </span>5</span></span>
登录后复制
<span><span><span>            </span>VariableExp: k</span></span>
登录后复制
登录后复制
<span><span><span>            </span>int j;</span></span>
登录后复制
登录后复制
<span><span> </span></span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span><span>            </span>int i2;</span></span>
登录后复制
<span><span> </span></span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><span>IL_0038:</span></span>
登录后复制
<span><span><span>            </span>j++;</span></span>
登录后复制
<span><span><span>            </span>if (j > i2)</span></span>
登录后复制
<span><span>            </span>{</span>
登录后复制
<span><span><span>                </span>return str3;</span></span>
登录后复制
<span><span>            </span>}</span>
登录后复制
<span><span><span>            </span>str3 = String.Concat(str3, x96c91b85a03f00b0.Substring(j, 1), str2.Substring(k, 1));</span></span>
登录后复制
<span><span><span>        </span>}</span></span>
登录后复制

<span> </span>

<span>private</span><span> <font>string</font> <b>x2a0cb95ab84ba877</b>(<font>string</font> x5b3e4cba383dedd9)</span>
登录后复制
<span>{</span>
登录后复制
登录后复制
登录后复制
登录后复制
<span><span>      </span><font>RSACryptoServiceProvider</font> <b>provider1</b> = <span>new</span> <font>RSACryptoServiceProvider</font>();</span>
登录后复制
登录后复制
<span><span>      </span><font>ASCIIEncoding</font> <b>encoding1</b> = <span>new</span> <font>ASCIIEncoding</font>();</span>
登录后复制
登录后复制
<span><span>      </span><span>return</span> encoding1.<font>GetString</font>(provider1.<font>Encrypt</font>(encoding1.<font>GetBytes</font>(<span>this</span>.<font>x246b032720dd4c0d</font>(x5b3e4cba383dedd9)), <span>false</span>));</span>
登录后复制
<span>}</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span> </span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span>评价<span lang="EN-US">:<font>功能强大许多,对于较长的代码会加入花指令进行混淆,从而达到混淆反编译器的目地.<br>     </font></span></span><span><span lang="EN-US"><font>这种混淆已经是XeonCode的最大混淆较果,虽然有达到混淆反编译的较果,但耐心仔细的看,并结合IL<br>     </font></span></span><span><font>代码一起阅读</font><span lang="EN-US"><font>,想得到其其算法是一件很容易的事情,最重要的是,<br>     有某些反编译器竟然可以去掉花指令,从而达反混淆的较果.<br>     所以使用它来保护你的知识版权是不是还不够强大呢?</font></span></span>
登录后复制
<span> </span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

3.   MaxtoCode

<span>private</span><span> <font>string</font> <b>Encrypt</b>(<font>string</font> inStr)</span>
登录后复制
<span>{</span>
登录后复制
登录后复制
登录后复制
登录后复制
<span>}</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span> </span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span>private</span><span> <font>string</font> <b>Register</b>(<font>string</font> instr)</span>
登录后复制
<span>{</span>
登录后复制
登录后复制
登录后复制
登录后复制
<span>}</span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span> </span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span>评价<span lang="EN-US">:<font>代码呢????代码已经不见了……不过这就是MaxtoCode的功效,它是加密,不是混淆,你看不到代码了,<br>     你完全无法入手去分析,那怕一点珠丝马迹都没有.您还可以结合XeonCode一起使用,<br>     达到双重的保护(因为现版本的MaxtoCode不提供混淆功能,您能清楚的看到类及方法的正确名称)</font></span></span>
登录后复制
<span> </span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
<span><strong>好</strong><span lang="EN-US"><strong>,刚刚展现的是反编译出来的C#代码,那么,我们再深入一点,真接反汇编为MSIL代码看看能达到什么较果</strong></span></span>
登录后复制
<span>待继。。。<span lang="EN-US"></span></span>
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何解读Debian Sniffer的输出结果 如何解读Debian Sniffer的输出结果 Apr 12, 2025 pm 11:00 PM

DebianSniffer是一个网络嗅探工具,用于捕获和分析网络数据包时间戳(Timestamp):显示数据包捕获的时间,通常以秒为单位。源IP地址(SourceIP):发送数据包的设备的网络地址。目标IP地址(DestinationIP):接收数据包的设备的网络地址。源端口(SourcePort):发送数据包的设备使用的端口号。目标端口(Destinatio

如何检查Debian OpenSSL配置 如何检查Debian OpenSSL配置 Apr 12, 2025 pm 11:57 PM

本文介绍几种检查Debian系统OpenSSL配置的方法,助您快速掌握系统安全状态。一、确认OpenSSL版本首先,验证OpenSSL是否已安装及版本信息。在终端输入以下命令:opensslversion若未安装,系统将提示错误。二、查看配置文件OpenSSL主配置文件通常位于/etc/ssl/openssl.cnf。您可以使用文本编辑器(例如nano)查看:sudonano/etc/ssl/openssl.cnf此文件包含密钥、证书路径及加密算法等重要配置信息。三、利用ope

Debian Tomcat日志安全设置有哪些 Debian Tomcat日志安全设置有哪些 Apr 12, 2025 pm 11:48 PM

提升DebianTomcat日志安全性,需关注以下关键策略:一、权限控制与文件管理:日志文件权限:默认日志文件权限(640)限制了访问,建议修改catalina.sh脚本中的UMASK值(例如,从0027改为0022),或在log4j2配置文件中直接设置filePermissions,以确保合适的读写权限。日志文件位置:Tomcat日志通常位于/opt/tomcat/logs(或类似路径),需定期检查该目录的权限设置。二、日志轮转与格式:日志轮转:配置server.xml

Tomcat日志如何帮助排查内存泄漏 Tomcat日志如何帮助排查内存泄漏 Apr 12, 2025 pm 11:42 PM

Tomcat日志是诊断内存泄漏问题的关键。通过分析Tomcat日志,您可以深入了解内存使用情况和垃圾回收(GC)行为,从而有效定位和解决内存泄漏。以下是如何利用Tomcat日志排查内存泄漏:1.GC日志分析首先,启用详细的GC日志记录。在Tomcat启动参数中添加以下JVM选项:-XX: PrintGCDetails-XX: PrintGCDateStamps-Xloggc:gc.log这些参数会生成详细的GC日志(gc.log),包含GC类型、回收对象大小和时间等信息。分析gc.log

Debian Sniffer在DDoS攻击检测中的作用 Debian Sniffer在DDoS攻击检测中的作用 Apr 12, 2025 pm 10:42 PM

本文探讨DDoS攻击检测方法,虽然未找到“DebianSniffer”的直接应用案例,但以下方法可用于DDoS攻击检测:有效的DDoS攻击检测技术:基于流量分析的检测:通过监控网络流量的异常模式,例如突发性的流量增长、特定端口的连接数激增等,来识别DDoS攻击。这可以使用多种工具实现,包括但不限于专业的网络监控系统和自定义脚本。例如,Python脚本结合pyshark和colorama库可以实时监控网络流量并发出警报。基于统计分析的检测:通过分析网络流量的统计特征,例如数据

Debian Sniffer与Wireshark的比较 Debian Sniffer与Wireshark的比较 Apr 12, 2025 pm 10:48 PM

本文探讨网络分析工具Wireshark及其在Debian系统中的替代方案。需要明确的是,不存在名为“DebianSniffer”的标准网络分析工具。Wireshark是业界领先的网络协议分析器,而Debian系统则提供其他功能类似的工具。功能特性对比Wireshark:这是一款功能强大的网络协议分析器,支持实时网络数据捕获和深入的数据包内容查看,并提供丰富的协议支持、过滤和搜索功能,便于网络问题的诊断。Debian系统中的替代工具:Debian系统包含诸如tcpdump和tshark等网

如何利用Debian Apache日志提升网站性能 如何利用Debian Apache日志提升网站性能 Apr 12, 2025 pm 11:36 PM

本文将阐述如何通过分析Debian系统下的Apache日志来提升网站性能。一、日志分析基础Apache日志记录了所有HTTP请求的详细信息,包括IP地址、时间戳、请求URL、HTTP方法和响应代码等。在Debian系统中,这些日志通常位于/var/log/apache2/access.log和/var/log/apache2/error.log目录下。理解日志结构是有效分析的第一步。二、日志分析工具您可以使用多种工具分析Apache日志:命令行工具:grep、awk、sed等命令行工具可

如何在Debian上监控Nginx SSL性能 如何在Debian上监控Nginx SSL性能 Apr 12, 2025 pm 10:18 PM

本文介绍如何在Debian系统上有效监控Nginx服务器的SSL性能。我们将使用NginxExporter将Nginx状态数据导出到Prometheus,再通过Grafana进行可视化展示。第一步:配置Nginx首先,我们需要在Nginx配置文件中启用stub_status模块来获取Nginx的状态信息。在你的Nginx配置文件(通常位于/etc/nginx/nginx.conf或其包含文件中)中添加以下代码段:location/nginx_status{stub_status

See all articles