.NET 源代码的安全性(源代码工具真正比拼) (論)(2)
打字好累,所以废话少讲,我们切入正题。 今天被屠宰的对象就是 我们公司使用 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>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









GiteEpages 정적 웹 사이트 배포 실패 : 404 오류 문제 해결 및 해결시 Gitee ...

Avue 구성 요소 라이브러리에서 Avue-Crud 행 편집을 구현하는 Onblur 이벤트는 Avue-Crud 구성 요소를 수동으로 트리거합니다. 편리한 인라인 편집 기능을 제공하지만 때로는 ... 때로는 ...

백엔드 개발에서 프론트 엔드 페이지를 신속하게 구축하는 방법은 무엇입니까? 그는 3-4 년의 경험을 가진 백엔드 개발자로서 기본 JavaScript, CSS 및 HTML을 마스터했습니다.

웹 페이지 자동화 및 숫자 계산 : 브라우저 임베디드 스크립트를 기반으로 한 구현이 기사는 브라우저 임베디드 스크립트를 사용하여 웹 페이지 요소 작업 및 숫자를 구현하는 방법을 살펴 봅니다 ...

크롬을 사용하여 Chromedevtools에서 요청 된 쿠키를 효과적으로 수정하고 재생하는 방법 ...

npx를 사용하여 React 응용 프로그램을 생성하기 위해 NPM 대신 PNPM을 사용하는 정보 ...

카드 쿠폰 레이아웃의 갭 효과를 실현하십시오. 카드 쿠폰 레이아웃을 설계 할 때 특히 배경이 그라디언트 일 때 카드 쿠폰에 간격을 추가 해야하는 경우가 종종 있습니다.

웹 디자인에서 독립적으로 움직이는 스크롤 막대와 요소의 페이지 고정 효과 구현, 때로는 스크롤 막대가 스크롤 할 때 특별 효과를 얻어야합니다 ...
