㈠ c#如何防反編譯
基本上無法防止反編譯,但是可以控制發編譯的效果,讓反編譯出來的代碼無法正常查看。
大都使用混淆器,譬如.NET Reactor等等。
.NET Reactor 是一款強大的 .NET 代碼保護和許可管理系統,安全可靠、簡單易用,主要用來幫助開發人員保護他們的 .NET 軟體產品。開發人員從此不必擔心如何保護他們的知識產權,可以將更多精力放在產品功能的開發上。與模糊工具(Obfuscator)相比,.NET Reactor 可以完全阻止對 .NET 程序集(由 C#, VB.NET, Delphi.NET, J#, MSIL... 等語言編寫)的反編譯。通俗的講,.NETReactor 在破解者和您的 .NET 代碼之間構建了強大的防破解保護屏障,生成一個基於 Windows 的而不是基於 MSIL 的兼容格式文件。原始的 .NET 代碼完整的封裝在本地代碼內,無論何時都不會釋放到硬碟,對於破解者是不可見的,目前還沒有任何工具可以反編譯 .NET Reactor 保護過的程序集。
使用方法:
將本地.NET程序集放在.NET Reactor程序中保護即可。
㈡ 如何破解.NET Reactor
NET Reactor是EZIRIZ公司出品的一款.net保護軟體,功能也相當強大,從3.3.1.1版本開始,他採用了新的加密方法,之前的版本如何破解,tankaiha已經發表過一篇文章,利用reflector+ildasm+ilasm,做起來非常簡單,但這個方法在3.3.1.1版以後就不能用了。現在我就來介紹如何破解3.3.1.1版。
准備的工具:
.NET Reactor破解他,當然要先安裝先下載地址:
.NET Generic Unpacker和SNSRemover,用來脫掉Reactor本身的殼和去去掉強名稱
Reflector,這個不用說了吧…
十六進制編輯器,主要有查找、替換和保存功能就OK了。
我們安裝完Reactor,發現他不是.NET程序,直接用Reflector不能反編譯他,這時候我們就要用.NET Generic Unpacker,將Reactor的殼脫掉如圖1。
(圖1 對Reactor進行脫殼)
每次脫出來的數量都不一定相同的。好了,我們用Reflector打開他看看,如圖2
(圖2 用Reflector對Reactor進行反編譯)
這時候,我們發現混淆後的類名竟然是亂碼,這個沒所謂,ilasm是支持亂碼的,是不是我們也可以用ildasm進行反編譯,然後修改他的代碼,然後用ilasm將他重新編譯呢?理論上是可以,但實際上由於反編譯出來的資源文件的文件名是亂碼,ilasm沒辦法找到那些文件,編譯會失敗。那怎麼辦,那就直接修改原程序的了。
首先用SNSRemover去掉他的強名稱先。
(圖3 用SNSRemover去掉Reactor的強名稱)
現在你是不是有這個疑問,本來脫出來的程序就已經不能運行的了,現在去掉了強名稱後,反而運行起來會提示出錯。不用怕,試一下用原版的Reactor對現在去掉強名稱後的Reactor進行一次加密。將加密出來的程序放在Reactor目錄下運行。
(圖4 重新加密後運行時發生的錯誤)
哈哈,看到是什麼錯誤沒有?現在這個已經不是驗證強名稱錯誤了,是一個運算錯誤,是某數除於0時時發生的錯誤。再看看他發生錯誤是在那裡,我們通過Reflector來找出–v. –c..cctor()這個方法,由於Reactor他本身是經過混淆的,已經不能用C#來反編譯,新版也做出了新的混淆,就算去掉了
L_0000: br L_0007
L_0005: pop
L_0006: ldc.i4.0
這三段代碼,也不能用C#來反編譯,我們只能用IL了。
(圖5 用Reflector找出發生異常的方法)
熟悉IL的就會知道,除的命令是div,那我們就在這里裡面搜索div,發現這段代碼:
L_004f: ldc.i4 0x10
L_0054: stloc.s num
L_0056: ldloc num
L_005a: ldloc num
L_005e: sub
L_005f: conv.u1
L_0060: stloc.s num
L_0062: ldloc num
L_0066: ldloc num
L_006a: div
L_006b: conv.u1
L_006c: stloc.s num
看到這里應該知道了吧,將他換成C#的代碼應該是
num = 0x10;
num = num - num;
num = num / num;
知道錯誤的原因了,那我們將這個div改掉就行了,但有一個問題,為什麼原版的程序就不會發生這個問題?原因很簡單,你搜索一下GetPublicKeyToken(),你就會發現上面那段代碼是他驗證強名稱失敗時才會執行的,因為我們去掉了強名稱,所以肯定會執行那段代碼的。
我們知道了出錯的原因了,但我們怎樣改呢?方法很簡單,因為Reflector他有提示該代碼對應的十六進制,
(圖6 找出該代碼對應的十六進制)
這時候我們是不是該想一下,其他的方法里是不是也同樣也有這樣的驗證。好,我們隨便找幾個方法,發現有些方法是有,有些是沒有。但有些的IL代碼不一樣,有點區別如:
L_003b: ldc.i4 0x24
L_0040: stloc.s num
L_0042: ldloc.s num
L_0044: ldloc.s num
L_0046: sub
L_0047: conv.u1
L_0048: stloc.s num
L_004a: ldloc.s num
L_004c: ldloc.s num
L_004e: div
L_004f: conv.u1
L_0050: stloc.s num
但運行出來的效果是一樣的,只不過是他對應的十六進制不一樣而已
(圖7 ldloc.s對應的十六進制)
好了,如果我們一個個方法都要去看,那花的時間太多了,不如我們先處理掉一部分先,如果再發現那裡的錯誤,我們就去那裡找出來。
我們很容易通過Reflector可以知道這兩段代碼對應的十六進制應該是
和
從Reflector那裡我們可以知道,sub對應是59,div對應是5B,那我們將5B換成59那程序就不會發生異常了,用十六進制編輯器,替換為,替換為
(圖8 替換代碼)
現在我們又用原版的Reactor重新加密一次我們剛處理完的文件。發現現在可以正常運行了。
我們已經可以正常運行我們脫殼後的程序了,現在開始我們就要將他變成正式版。
用Reflector打開我們剛處理完的文件,使用Reflector自帶的功能,跳到程序的入口點
(圖9 找到入口點)
分析一下程序的,不難的可以找到
L_0662: call bool –v.–c::『2()
這段代碼就是驗證的代碼了,但如果在這里直接修改,難度會相當大,不如我們修改『2()的返回值,只要他永遠返回true,那就達到我們的目的了。
(圖10 來到『2())
我們不難的找到了L_0000: br L_0007對應的地址是0x17cd28,將原來的3802改成172A
(圖10 修改3802為172A)
保存後,我們在次用原版的Reactor對剛處理完的程序進行加密,將加密後的程序放在Reactor目錄下運行。看看,現在是FULL VERSION了,但我們現在測試一下他,會發現出現這樣的異常
(圖11 修改完,運行出現的異常)
看一下他的異常,還是System.DivideByZeroException,也就是說還有一部分的強名稱驗證的代碼還沒有修改,只要重復上面的操作,找出他的十六進制,將5B換成59就行了。
該版本我已經發布了他的破解版,3.3.8.0也已經發布了,3.3.8.0的破解會比這個更難,有興趣的朋友可以來研究一下,可以拿3.3.8.9版來試一下,這個跟3.3.8.0是一樣的破解。..
㈢ Net Reactor 混淆後怎麼反編譯
reactor主界面上就有幾個復選框,試一下全部打勾,然後點proctect,混淆後的Dll再用反編譯軟體看看其中的代碼,lz自然會知道結果。
㈣ .NET 編譯出來的DLL文件,如何才能不被反編譯
1.有那種代碼混亂器,其實也就是改改類名字等,常用的有
DotFuscator, .NET Reactor, xenocode 。。。你可以自己搜索下載了
2.當代碼量很大的時候,反編譯去讀MSIL的代碼也是很辛苦的,工程量很大
3.一般.net寫的程序都是基於web的,放在伺服器上,WebService,所以盜版破解也顯得不是那麼有意義了。。。
友情提醒:事先備份好你的代碼!
㈤ 如何反編譯.Net Reactor加密過的C#程序
加密工具大都是通過「模糊」來實現的,使得反向工程成本大於重新開發成本,盡可能的合並函數為相同的無意義名稱.NET編譯成IL
可以用ILSpy試試。
㈥ 為什麼用visual studio生成的dll可以反編譯解決思路
第一、用某些程序集加密混淆工具,比如intellilock、.net reactor,但一定要最新版本的。
第二、核心演算法用c++寫成dll,然後c#調用這個dll;
第三、某些東西可以做在伺服器端,讓客戶端的程序需要時從伺服器端取。
㈦ .NET Reactor 4.5 是殼嗎
恩恩。是的。它可以看做是保護代碼的一種殼。。
.NET Reactor 是一款強大的 .NET 代碼保護和許可管理系統,主要用來幫助開發人員保護他們的 .NET 軟體產品。與模糊工具(Obfuscator)相比,.NET Reactor 可以完全阻止對 .NET 程序集(由 C#, VB.NET, Delphi.NET, J#, MSIL... 等語言編寫)的反編譯。
通俗的講,.NET Reactor 在破解者和您的 .NET 代碼之間構建了強大的防破解保護屏障,生成一個基於 Windows 的而不是基於 MSIL 的兼容格式文件。原始的 .NET 代碼完整的封裝在本地代碼內,無論何時都不會釋放到硬碟,對於破解者是不可見的,目前還沒有任何工具可以反編譯 .NET Reactor 保護過的程序集。