Maison base de données tutoriel mysql .NET 源代码的安全性(源代码工具真正比拼) (論)(2)

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

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

打字好累,所以废话少讲,我们切入正题。 今天被屠宰的对象就是 我们公司使用 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">
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<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">
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<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">
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span>      </span><font>string</font> <b>text2</b> = <span>"a#2151336fdaghksfges"</span>;</span>
Copier après la connexion
<span><span>      </span><font>int</font> <b>num1</b> = A_0.<font>Length</font>;</span>
Copier après la connexion
<span><span>      </span><font>int</font> <b>num3</b> = <span>0</span>;</span>
Copier après la connexion
<span><span>      </span><font>int</font> <b>num4</b> = num1 - <span>1</span>;</span>
Copier après la connexion
<span><span>      </span><span>for</span> (<font>int</font> <b>num2</b> = <span>0</span>; num2 </span>
Copier après la connexion
<span><span>      </span>{</span>
Copier après la connexion
<span><span>            </span>text3 = text3 + A_0.<font>Substring</font>(num2, <span>1</span>) + text2.<font>Substring</font>(num3, <span>1</span>);</span>
Copier après la connexion
<span><span>            </span>num3++;</span>
Copier après la connexion
<span><span>            </span><span>if</span> (num3 >= <span>20</span>)</span>
Copier après la connexion
<span><span>            </span>{</span>
Copier après la connexion
<span><span>                  </span>num3 = <span>0</span>;</span>
Copier après la connexion
<span><span>            </span>}</span>
Copier après la connexion
<span><span>      </span>}</span>
Copier après la connexion
<span><span>      </span><span>return</span> text3;</span>
Copier après la connexion
<span>}</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

<span> </span>

<span>private</span><span> <font>string</font> <b>a</b>(<font>string</font> A_0)</span>
Copier après la connexion
<span>{</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span>      </span><font>RSACryptoServiceProvider</font> <b>provider1</b> = <span>new</span> <font>RSACryptoServiceProvider</font>();</span>
Copier après la connexion
Copier après la connexion
<span><span>      </span><font>ASCIIEncoding</font> <b>encoding1</b> = <span>new</span> <font>ASCIIEncoding</font>();</span>
Copier après la connexion
Copier après la connexion
<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>
Copier après la connexion
<span>}</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

<span> </span>

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

<span> </span>

2.   XeonCode

<span> </span>

<span>private string x246b032720dd4c0d(string x96c91b85a03f00b0)</span>
Copier après la connexion
<span><span><span>        </span>{</span></span>
Copier après la connexion
<span><span><span>            </span>string str2;</span></span>
Copier après la connexion
<span><span> </span></span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>string str3;</span></span>
Copier après la connexion
<span><span> </span></span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>int k;</span></span>
Copier après la connexion
<span><span> </span></span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>int j;</span></span>
Copier après la connexion
Copier après la connexion
<span><span> </span></span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<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>
Copier après la connexion
<span><span><span>            </span>int i1 = x96c91b85a03f00b0.Length;</span></span>
Copier après la connexion
<span><span><span>            </span>k = 0;</span></span>
Copier après la connexion
Copier après la connexion
<span><span><span>          </span><span>  </span>i2 = i1 - 1;</span></span>
Copier après la connexion
<span><span><span>            </span>j = 0;</span></span>
Copier après la connexion
<span><span><span>            </span>goto IL_003c;</span></span>
Copier après la connexion
<span><span><span>            </span>VariableExp: k</span></span>
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>ConstantExp: 20</span></span>
Copier après la connexion
<span><span><span>      </span>IL_0029:<span>  </span>blt.s<span>      </span>IL_0038<span>  </span>//自动的跳转混合</span></span>
Copier après la connexion
<span><span><span>            </span>k = 0;</span></span>
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>goto IL_0038;<span>  </span><span>  </span>//花指令</span></span>
Copier après la connexion
<span><span><span>            </span>ConstantExp: 1</span></span>
Copier après la connexion
<span><span><span>      </span>IL_0031:<span>  </span>add.ovf<span>    </span></span></span>
Copier après la connexion
<span><span><span>      </span>IL_0032:<span>  </span>stloc.s<span>    </span>5</span></span>
Copier après la connexion
<span><span><span>            </span>VariableExp: k</span></span>
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>int j;</span></span>
Copier après la connexion
Copier après la connexion
<span><span> </span></span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span><span>            </span>int i2;</span></span>
Copier après la connexion
<span><span> </span></span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span>IL_0038:</span></span>
Copier après la connexion
<span><span><span>            </span>j++;</span></span>
Copier après la connexion
<span><span><span>            </span>if (j > i2)</span></span>
Copier après la connexion
<span><span>            </span>{</span>
Copier après la connexion
<span><span><span>                </span>return str3;</span></span>
Copier après la connexion
<span><span>            </span>}</span>
Copier après la connexion
<span><span><span>            </span>str3 = String.Concat(str3, x96c91b85a03f00b0.Substring(j, 1), str2.Substring(k, 1));</span></span>
Copier après la connexion
<span><span><span>        </span>}</span></span>
Copier après la connexion

<span> </span>

<span>private</span><span> <font>string</font> <b>x2a0cb95ab84ba877</b>(<font>string</font> x5b3e4cba383dedd9)</span>
Copier après la connexion
<span>{</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><span>      </span><font>RSACryptoServiceProvider</font> <b>provider1</b> = <span>new</span> <font>RSACryptoServiceProvider</font>();</span>
Copier après la connexion
Copier après la connexion
<span><span>      </span><font>ASCIIEncoding</font> <b>encoding1</b> = <span>new</span> <font>ASCIIEncoding</font>();</span>
Copier après la connexion
Copier après la connexion
<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>
Copier après la connexion
<span>}</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span> </span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<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>
Copier après la connexion
<span> </span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

3.   MaxtoCode

<span>private</span><span> <font>string</font> <b>Encrypt</b>(<font>string</font> inStr)</span>
Copier après la connexion
<span>{</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span>}</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span> </span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span>private</span><span> <font>string</font> <b>Register</b>(<font>string</font> instr)</span>
Copier après la connexion
<span>{</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span>}</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span> </span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span>评价<span lang="EN-US">:<font>代码呢????代码已经不见了……不过这就是MaxtoCode的功效,它是加密,不是混淆,你看不到代码了,<br>     你完全无法入手去分析,那怕一点珠丝马迹都没有.您还可以结合XeonCode一起使用,<br>     达到双重的保护(因为现版本的MaxtoCode不提供混淆功能,您能清楚的看到类及方法的正确名称)</font></span></span>
Copier après la connexion
<span> </span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
<span><strong>好</strong><span lang="EN-US"><strong>,刚刚展现的是反编译出来的C#代码,那么,我们再深入一点,真接反汇编为MSIL代码看看能达到什么较果</strong></span></span>
Copier après la connexion
<span>待继。。。<span lang="EN-US"></span></span>
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La production de pages H5 nécessite-t-elle une maintenance continue? La production de pages H5 nécessite-t-elle une maintenance continue? Apr 05, 2025 pm 11:27 PM

La page H5 doit être maintenue en continu, en raison de facteurs tels que les vulnérabilités du code, la compatibilité des navigateurs, l'optimisation des performances, les mises à jour de sécurité et les améliorations de l'expérience utilisateur. Des méthodes de maintenance efficaces comprennent l'établissement d'un système de test complet, à l'aide d'outils de contrôle de version, de surveiller régulièrement les performances de la page, de collecter les commentaires des utilisateurs et de formuler des plans de maintenance.

Pourquoi les zones réduites pourpre dans la disposition Flex sont-elles considérées à tort «espace de débordement»? Pourquoi les zones réduites pourpre dans la disposition Flex sont-elles considérées à tort «espace de débordement»? Apr 05, 2025 pm 05:51 PM

Questions sur les zones de slash violet dans les dispositions flexibles Lorsque vous utilisez des dispositions flexibles, vous pouvez rencontrer des phénomènes déroutants, comme dans les outils du développeur (D ...

Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Comment résoudre ce problème? Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Comment résoudre ce problème? Apr 05, 2025 pm 10:18 PM

Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Pendant la programmation, les marges négatives dans CSS (négatif ...

Pourquoi les feuilles de style personnalisées peuvent-elles prendre effet sur les pages Web locales de Safari mais pas sur les pages Baidu? Pourquoi les feuilles de style personnalisées peuvent-elles prendre effet sur les pages Web locales de Safari mais pas sur les pages Baidu? Apr 05, 2025 pm 05:15 PM

Discussion sur l'utilisation de styles de style personnalisés dans Safari aujourd'hui, nous allons discuter d'une question sur l'application de feuilles de style personnalisées pour le navigateur Safari. Novice frontal ...

Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Apr 05, 2025 pm 04:09 PM

Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Lorsque vous utilisez CSS pour disposer des pages Web, vous rencontrez souvent des marges négatives (négatifs ...

Comment utiliser CSS pour obtenir efficacement divers effets concaves? Comment utiliser CSS pour obtenir efficacement divers effets concaves? Apr 05, 2025 pm 02:18 PM

De nombreuses façons d'atteindre les effets concaves dans le CSS, de nombreux développeurs ont rencontré la nécessité d'obtenir des effets concaves dans les pages Web. Récemment, un développeur mentionné sur le forum ...

Comment créer des styles de cartes complexes à l'aide de la propriété Clip-path de CSS? Comment créer des styles de cartes complexes à l'aide de la propriété Clip-path de CSS? Apr 05, 2025 pm 11:09 PM

Comment créer des styles de cartes complexes à l'aide de CSS? Dans la conception quotidienne de sites Web, le style de carte est une méthode de mise en page commune et importante. Aujourd'hui, nous voulons expliquer ...

Où obtenir le matériel pour la production de pages H5 Où obtenir le matériel pour la production de pages H5 Apr 05, 2025 pm 11:33 PM

Les principales sources de matériel H5 Page sont: 1. Site Web de matériel professionnel (payé, de haute qualité, Copyright clair); 2. Matériel fait maison (unicité élevée, mais qui prend du temps); 3. Bibliothèque de matériaux open source (gratuit, doit être soigneusement dépisté); 4. site Web d'image / vidéo (le droit d'auteur vérifié est requis). De plus, le style de matériau unifié, l'adaptation de la taille, le traitement de la compression et la protection des droits d'auteur sont des points clés auxquels il faut faire attention.

See all articles