.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">Salin selepas log masukSalin selepas log masuk
<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>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Dalam sistem Debian, panggilan sistem Readdir digunakan untuk membaca kandungan direktori. Jika prestasinya tidak baik, cuba strategi pengoptimuman berikut: Memudahkan bilangan fail direktori: Split direktori besar ke dalam pelbagai direktori kecil sebanyak mungkin, mengurangkan bilangan item yang diproses setiap panggilan readdir. Dayakan Caching Kandungan Direktori: Bina mekanisme cache, kemas kini cache secara teratur atau apabila kandungan direktori berubah, dan mengurangkan panggilan kerap ke Readdir. Cafh memori (seperti memcached atau redis) atau cache tempatan (seperti fail atau pangkalan data) boleh dipertimbangkan. Mengamalkan struktur data yang cekap: Sekiranya anda melaksanakan traversal direktori sendiri, pilih struktur data yang lebih cekap (seperti jadual hash dan bukannya carian linear) untuk menyimpan dan mengakses maklumat direktori

Panduan ini akan membimbing anda untuk belajar cara menggunakan syslog dalam sistem Debian. SYSLOG adalah perkhidmatan utama dalam sistem Linux untuk sistem pembalakan dan mesej log aplikasi. Ia membantu pentadbir memantau dan menganalisis aktiviti sistem untuk mengenal pasti dan menyelesaikan masalah dengan cepat. 1. Pengetahuan asas syslog Fungsi teras syslog termasuk: mengumpul dan menguruskan mesej log secara terpusat; menyokong pelbagai format output log dan lokasi sasaran (seperti fail atau rangkaian); Menyediakan fungsi tontonan log dan penapisan masa nyata. 2. Pasang dan konfigurasikan syslog (menggunakan rsyslog) Sistem Debian menggunakan rsyslog secara lalai. Anda boleh memasangnya dengan arahan berikut: sudoaptupdatesud

Artikel ini membincangkan cara meningkatkan kecekapan pemprosesan data Hadoop pada sistem Debian. Strategi pengoptimuman meliputi peningkatan perkakasan, pelarasan parameter sistem operasi, pengubahsuaian konfigurasi Hadoop, dan penggunaan algoritma dan alat yang cekap. 1. Pengukuhan sumber perkakasan memastikan bahawa semua nod mempunyai konfigurasi perkakasan yang konsisten, terutama memberi perhatian kepada prestasi CPU, memori dan peralatan rangkaian. Memilih komponen perkakasan berprestasi tinggi adalah penting untuk meningkatkan kelajuan pemprosesan keseluruhan. 2. Sistem operasi Tunes deskriptor fail dan sambungan rangkaian: Ubah suai fail /etc/security/limits.conf untuk meningkatkan had atas deskriptor fail dan sambungan rangkaian yang dibenarkan dibuka pada masa yang sama oleh sistem. Pelarasan Parameter JVM: Laraskan fail Hadoop-env.sh

Artikel ini menerangkan cara membersihkan pakej perisian yang tidak berguna dan membebaskan ruang cakera dalam sistem Debian. Langkah 1: Kemas kini senarai pakej Pastikan senarai pakej anda terkini: Sudoaptupdate Langkah 2: Lihat pakej yang dipasang Gunakan arahan berikut untuk melihat semua pakej yang dipasang: DPKG-Get-Selections | GREP-VDEINSTALL Langkah 3: Kenal pasti pakej berlebihan Gunakan alat kebolehan untuk mencari pakej yang tidak lagi diperlukan. Aptitude akan memberikan cadangan untuk membantu anda memadam pakej dengan selamat: sudoaptitudesearch '~ pimportant' Perintah ini menyenaraikan tag

Pengoptimuman prestasi laman web tidak dapat dipisahkan dari analisis mendalam log masuk. Nginx Log merekodkan maklumat terperinci pengguna yang melawat laman web. Pandai menggunakan data ini dengan berkesan dapat meningkatkan kelajuan laman web. Artikel ini akan memperkenalkan beberapa kaedah pengoptimuman prestasi laman web berdasarkan log nginx. 1. Analisis tingkah laku pengguna dan pengoptimuman. Dengan menganalisis log Nginx, kita dapat memperoleh pemahaman yang mendalam tentang tingkah laku pengguna dan membuat pengoptimuman yang disasarkan berdasarkan ini: Pengenalan IP akses frekuensi tinggi: Cari alamat IP dengan kekerapan akses tertinggi, dan mengoptimumkan konfigurasi sumber pelayan untuk alamat IP ini, seperti meningkatkan jalur lebar atau meningkatkan kelajuan tindak balas kandungan tertentu. Analisis Kod Status: Menganalisis kekerapan kod status HTTP yang berbeza (seperti 404 kesilapan), cari masalah dalam navigasi laman web atau pengurusan kandungan, dan teruskan

Memperkukuhkan keselamatan log pelayan Debianapache memerlukan usaha kerjasama dari pelbagai aspek. Strategi berikut dapat mengurangkan risiko keselamatan: 1. Pemantauan log dan analisis analisis log automatik: Gunakan LogCheck, Logrotate dan alat lain untuk memeriksa dan menganalisis log secara berkala untuk mengesan aktiviti yang mencurigakan dengan segera dan serangan yang berpotensi. Sistem pemantauan masa nyata: Mewujudkan sistem pemantauan log, seperti Elkstack (Elasticsearch, Logstash, Kibana), untuk merealisasikan pemantauan dan analisis masa nyata data log. 2. Tetapan kebenaran yang ketat untuk kebenaran fail log: munasabah tetapkan kebenaran fail log, seperti menggunakan chmod640/var/log

Fungsi Readdir dalam sistem Debian adalah panggilan sistem yang digunakan untuk membaca kandungan direktori dan sering digunakan dalam pengaturcaraan C. Artikel ini akan menerangkan cara mengintegrasikan Readdir dengan alat lain untuk meningkatkan fungsinya. Kaedah 1: Menggabungkan Program Bahasa C dan Pipeline Pertama, tulis program C untuk memanggil fungsi Readdir dan output hasilnya:#termasuk#termasuk#includeintMain (intargc, char*argv []) {dir*dir; structdirent*entry; if (argc! = 2) {

Langkah -langkah untuk memasang sijil SSL pada pelayan mel Debian adalah seperti berikut: 1. Pasang OpenSSL Toolkit terlebih dahulu, pastikan bahawa OpenSSL Toolkit telah dipasang pada sistem anda. Jika tidak dipasang, anda boleh menggunakan arahan berikut untuk memasang: sudoapt-getupdateudoapt-getinstallopenssl2. Menjana permintaan kunci dan sijil peribadi seterusnya, gunakan OpenSSL untuk menjana kunci peribadi RSA 2048-bit dan permintaan sijil (CSR): Membuka
