動態庫防止反編譯
㈠ C#怎樣防止反編譯
我使用的方法是利用加殼工具:virboxProtectorStandalone。直接進行加殼。高級混淆、虛擬化代碼、智能壓縮等加密策略。如果要授權控制,可使用許可版本的virboxProtector。
未經加殼保護的 ILspy 反編譯效果如下:
public int add(int a, int b){
return a + b;}public int div(int a, int b){
return a / b;}public int mul(int a, int b){
return a * b;}public int sub(int a, int b){
return a - b;}
解決方案:
深思自主研發了為 C# .net 語言做保護的外殼(Virbox Protector)。將C# .net 編譯成的執行程序(.exe),動態庫(.dll)直接拖入加殼工具即可完成保護操作,十分方便。並且在效果上已經完全看不到源碼中的邏輯。
加密後的效果
public int add(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16416u, 21, 16384u, 32u, 31516u, 5).Invoke(this, new object[]
{
this,
a,
b
});}
public int div(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16956u, 21, 16924u, 32u, 31516u, 2).Invoke(this, new object[]
{
this,
a,
b
});}
public int mul(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16776u, 21, 16744u, 32u, 31516u, 3).Invoke(this, new object[]
{
this,
a,
b
});}
public int sub(int a, int b){
return (int)dm.dynamic_method((object)this, System.Reflection.MethodBase.GetCurrentMethod(), 16596u, 21, 16564u, 32u, 31516u, 4).Invoke(this, new object[]
{
this,
a,
b
});}
架構支持
IIS 服務架構的後台邏輯 DLL 文件
windows PC 應用程序 EXE 文件
windows PC 應用程序動態庫 DLL 文件
UG等第三方繪圖工具使用的 DLL 文件
Unity3d 編譯使用的 DLL 文件
㈡ 如何防止程序員反編譯
java從誕生以來,其基因就是開放精神,也正因此,其可以得到廣泛愛好者的支持和奉獻,最終很快發展壯大,以至於有今天之風光!但隨著java的應用領域越來越廣,特別是一些功能要發布到終端用戶手中(如Android開發的app),有時候,公司為了商業技術的保密考慮,不希望這裡面的一些核心代碼能夠被人破解(破解之後,甚至可以被簡單改改就發布出去,說嚴重點,就可能會擾亂公司的正常軟體的市場行為),這時候就要求這些java代碼不能夠被反編譯。
這里要先說一下反編譯的現象。因為java一直秉持著開放共享的理念,所以大家也都知道,我們一般共享一個自己寫的jar包時,同時會共享一個對應的source包。但這些依然與反編譯沒有什麼關系,但java的共享理念,不只是建議我們這樣做,而且它自己也在底層上「強迫」我們這么做!在java寫的.java文件後,使用javac編譯成class文件,在編譯的過程,不像C/C++或C#那樣編譯時進行加密或混淆,它是直接對其進行符號化、標記化的編譯處理,於是,也產生了一個逆向工程的問題:可以根據class文件反向解析成原來的java文件!這就是反編譯的由來。
但很多時候,有些公司出於如上述的原因考慮時,真的不希望自己寫的代碼被別人反編譯,尤其是那些收費的app或桌面軟體(甚至還有一些j2ee的wen項目)!這時候,防止反編譯就成了必然!但前面也說過了,因為開放理念的原因,class是可以被反編譯的,那現在有這樣的需求之後,有哪些方式可以做到防止反編譯呢?經過研究java源代碼並進行了一些技術實現(結果發現,以前都有人想到過,所以在對應章節的時候,我會貼出一些寫得比較細的文章,而我就簡單闡述一下,也算偷個懶吧),我總共整理出以下這幾種方式:
代碼混淆
這種方式的做法正如其名,是把代碼打亂,並摻入一些隨機或特殊的字元,讓代碼的可讀性大大降低,「曲線救國」似的達到所謂的加密。其實,其本質就是打亂代碼的順序、將各類符號(如類名、方法名、屬性名)進行隨機或亂命名,使其無意義,讓人讀代碼時很累,進而讓人乍一看,以為這些代碼是加過密的!
由其實現方式上可知,其實現原理只是擾亂正常的代碼可讀性,並不是真正的加密,如果一個人的耐心很好,依然可以理出整個程序在做什麼,更何況,一個應用中,其核心代碼才是人們想去了解的,所以大大縮小了代碼閱讀的范圍!
當然,這種方式的存在,而且還比較流行,其原因在於,基本能防範一些技術人員進行反編譯(比如說我,讓我破解一個混淆的代碼,我寧願自己重寫一個了)!而且其實現較為簡單,對項目的代碼又無開發上的侵入性。目前業界也有較多這類工具,有商用的,也有免費的,目前比較流行的免費的是:proguard(我現象臨時用的就是這個)。
上面說了,這種方式其實並不是真正加密代碼,其實代碼還是能夠被人反編譯(有人可能說,使用proguard中的optimize選項,可以從位元組流層面更改代碼,甚至可以讓JD這些反編譯軟體可以無法得到內容。說得有點道理,但有兩個問題:1、使用optimize對JDK及環境要求較高,容易造成混淆後的代碼無法正常運行;2、這種方式其實還是混淆,JD反編譯有點問題,可以有更強悍的工具,矛盾哲學在哪兒都是存在的^_^)。那如何能做到我的class代碼無法被人反編譯呢?那就需要我們下面的「加密class」!
加密class
在說加密class之前,我們要先了解一些java的基本概念,如:ClassLoader。做java的人已經或者以後會知道,java程序的運行,是類中的邏輯在JVM中運行,而類又是怎麼載入到JVM中的呢(JVM內幕之類的,不在本文中闡述,所以點到為止)?答案是:ClassLoader。JVM在啟動時是如何初始化整個環境的,有哪些ClassLoader及作用是什麼,大家可以自己問度娘,也不在本文中討論。
讓我們從最常見的代碼開始,揭開一下ClassLoader的一點點面紗!看下面的代碼:
Java代碼
publicclassDemo{
publicstaticvoidmain(String[]args){
System.out.println(「helloworld!」);
}
}
在編譯代碼時(如使用ant或maven),使用插件將代碼進行加密(加密方式自己選),將class文件裡面的內容讀取成byte[],然後進行加密後再寫回到class文件(這時候class文件裡面的內容不是標準的class,無法被反編譯了)
在啟動項目代碼時,指定使用我們自定義的ClassLoader就行了,而自定義的部分,主要就是在這里做解密工作!
上面這段代碼,大家都認識。但我要問的是:如果我們使用javac對其進行編譯,然後使用java使其運行(為什麼不在Eclipse中使用Runas功能呢?因為Eclipse幫我們封閉,從而簡化了太多東西,使我們忽略了太多的底層細節,只有從原始的操作上,我們才能看到本質),那麼,它是怎麼載入到JVM中的?答案是:通過AppClassLoader載入的(相關知識點可以參考:http://hxraid.iteye.com/blog/747625)!如果不相信的話,可以輸出一下System.out.println(Thread.currentThrea().getContextLoader());看看。
那又有一個新的問題產生了:ClassLoader又是怎樣載入class的呢?其實,AppClassLoader繼承自java.lang.ClassLoader類,所以,基本操作都在這個類裡面,讓我們直接看下面這段核心代碼吧:
看到這里,已經沒有必要再往下面看了(再往下就是native方法了,這是一個重大伏筆哦),我們要做的手腳就在這里!
手腳怎麼做呢?很簡單,上面的代碼邏輯告訴我們,ClassLoader只是拿到class文件中的內容byte[],然後交給JVM初始化!於是我們的邏輯就簡單了:只要在交給JVM時是正確的class文件就行了,在這之前是什麼樣子無所謂!所以,我們的加密的整個邏輯就是:
如此,搞定!以上的做法比較完整的闡述,可以仔細閱讀一下這篇文章:https://www.ddtsoft.com/#developerworks/cn/java/l-secureclass/文章中的介紹。
通過這個方法貌似可以解決代碼反編譯的問題了!錯!這里有一個巨大的坑!因為我們自定義的ClassLoader是不能加密的,要不然JVM不認識,就全歇菜了!如果我來反編譯,呵呵,我只要反編譯一下這個自定義的ClassLoader,然後把裡面解密後的內容寫到指定的文件中保存下來,再把這個加了邏輯的自定義ClassLoader放回去運行,你猜結果會怎樣?沒錯,你會想死!因為你好不容易想出來的加密演算法,結果人家根本不需要破解,直接就繞過去了!
現在,讓我們總結一下這個方法的優缺點:實現方式簡單有效,同時對代碼幾乎沒有侵入性,不影響正常開發與發布。缺點也很明顯,就是很容易被人破解!
當然啦,關於缺點問題,你也可以這么干:先對所有代碼進行混淆、再進行加密,保證:1、不容易找到我們自定義的那個ClassLoader;2、就算找到了,破解了,代碼可讀性還是很差,讓你看得吐血!(有一篇文章,我覺得寫得不錯,大家可以看一看:http://www.scjgcj.com/#blog/851544)
嗯,我覺得這個方法很好,我自己也差點被這個想法感動了,但是,作為一個嚴謹的程序員,我真的不願意留下一個隱患在這里!所以,我繼續思索!
高級加密class
前面我們說過有個伏筆來著,還記得吧?沒錯,就是那個native!native定義的方法是什麼方法?就是我們傳說中的JNI調用!前面介紹過的有一篇文章中提到過,其實jvm的真實身份並不是java,而是c++寫的jvm.dll(windows版本下),java與dll文件的調用就是通過JNI實現的!於是,我們就可以這樣想:JNI可以調用第三方語言的類庫,那麼,我們可不可以把解密與裝載使用第三方語言寫(如C++,因為它們生成的庫是不好反編譯的),這樣它可以把解密出來的class內容直接調jvm.dll的載入介面進行初始化成class,再返回給我們的ClassLoader?這樣,我們自定義的ClassLoader只要使用JNI調用這個第三方語言寫的組件,整個解密過程,都在黑盒中進行,別人就無從破解了!
嗯,這個方法真的很不錯的!但也有兩個小問題:1.使用第三方語言寫,得會第三方語言,我說的會,是指很溜!2.對於不同的操作系統,甚至同一操作系統不同的版本,都可能要有差異化的代碼生成對應環境下的組件(如window下是exe,linux是so等)!如果你不在乎這兩個問題,我覺得,這個方式真的挺不錯的。但對於我來說,我的信條是,越復雜的方式越容易出錯!我個人比較崇尚簡潔的美,所以,這個方法我不會輕易使用!
對了,如果大家覺得這個方法還算可行的話,可以推薦一個我無意中看到的東西給大家看看(我都沒有用過的):jinstall,
更改JVM
看到這個標題,我想你可能會震驚。是的,你沒看錯,做為一個程序員,是應該要具有懷疑一切、敢想敢做的信念。如果你有意留心的話,你會發現JVM版本在業界其實也有好幾個版本的,如:Sun公司的、IBM的、Apache的、Google的……
所以,不要阻礙自己的想像力,現在沒有這個能力,並不代表不可能。所以,我想到,如果我把jvm改了,在裡面對載入的類進行解密,那不就可以了嗎?我在設計構思過程中,突然發現:人老了就是容易糊塗!前面使用第三方語言實現解密的兩個問題,正好也是更改JVM要面對的兩個問題,而且還有一個更大的問題:這個JVM就得跟著這個項目到處走啊!
㈢ 如何防止java文件被反編譯
所謂魔高一尺,道高一丈
這種事是很難做到絕對防止反編譯的
㈣ Android APP的破解技術有哪些如何防止反編譯
由於Android系統的開放性,導致Android
APK很容易被他人破解或是反編譯,下面給大家介紹常用的APP破解工具和技術要求。同時根據自己以往的防破解經驗,跟大家分析下如何防止反編譯。
Android
APK運行環境依賴的文件/文件夾
res、DEX、主配文件Lib
只是簡單的加密甚至沒有任何保護措施。APKtool(一種反編譯工具)可輕易將其輕松破解,再配合其他各種工具基本可以做到:源碼暴露(代碼混淆也幾乎起不到任何安全作用)、資源文件裸奔、主配文件可任意修改、核心SO庫暴露、暴力破解惡意利用等。部分大公司會對其應用APK包進行防二次打包和防APKtool破解,但其代碼都是寫在JAVA層,另外APKtool的可升級導致其安全保護級別也是非常低的。
㈤ 如何對編譯的dll文件進行加密來防止反編譯
使用過.NET的程序員都知道,.NET是一個巨大的跨時代進步,它開發效率高、功能強、界面美觀、耐用、新的語言C#已經提交為行業規范、CLR共公運行庫資源豐富,這所有的特點標志著它成為主流編程語言是必然的。
可是他也有一個缺點,那就是編譯好的程序集可以完全被反編譯成源代碼,這給一些不法份子提供了很好的機會,試想想,您辛苦的勞動成果就這樣輕易的給別人利用,是多麼不公平的事阿?所以如何保護我們的知識產權成了一個大問題。
MAXTOCODE 已經完全超越了傳統的混淆手段來保護源代碼的方式,他將完全加密您的代碼,使您的代碼完全沒有辦法反編譯。保護強度已經不是混淆器可以與之抗衡,是目前保護強度最大,最完美的.NET產品保護方案。
MAXTOCODE 是 Aiasted.SOFT 完全自主開發的一款 .NET 代碼保護工具。它是目前世界上高強度保護工具之一。
第一種代碼保護方案是混淆,這是一個不錯的方案,可惜強度還是無法保證,如果要做一個大的逆向工程有一定困難,但針對某個演算法或功能進行解讀還是很容易的。反觀混淆原理則發現,混淆其實只是一個與障眼法差不多的技術。第二種就是MAXTOCODE的保護技術了,MAXOTCODE 採用了難以理解的機器語言來加密您的.NET程序集,(特別注意:MAXTOCODE的強度建立在加密演算法之上,而不上簡單的混淆。)在程序集運行時運態解放源代碼,所以在原理上已經比混淆強度提高了許多。我們保護您所有的代碼,不讓不法份子看到您任何一個有效的代碼,使不法份子完全無法被反編譯。
㈥ 易語言模塊有什麼辦法防止被反編譯嗎
易語言論壇中的方法:防止模塊被反編譯的有效方法:
請在模塊中建立一個或多個窗口,將其"可視"屬性設置為假,窗口上放一些隨機類型的組件(盡量不要用常用組件),重要數據分散放在這些組件的屬性裡面,模塊中的代碼動態載入這些窗口,從這些組件屬性中讀入相關數據使用.
原理: 由於易語言有相當多類型的組件,而每個組件的屬性數據保存格式都不一樣,模塊反編譯想把每種組件中的屬性數據反編譯出來具有相當的難度,所以數據放在組件屬性裡面是安全的.
個人方法:你可以把模塊轉化成動態鏈接庫DLL,這樣就不容易反編譯了
㈦ C# dll 文件有什麼好的混淆工具防止反編譯
首先 C#沒有任何辦法反編譯其次 C#只能混淆代碼,起到一定的功效最後 C#混淆工具很多,VS自帶的並不強大,可以用些比如Dotfuscator、xeoncode、foxit等等
㈧ 如何防止android代碼被反編譯
關鍵演算法通過NDK 實現並生成動態庫, 用jni 與android 進行數據交互,這樣就是在牛逼的程序員也反編譯不了你的核心演算法和介面
㈨ 有哪些防止反編譯 Java 類庫 jar 文件的辦法
java本就是開源的,你加密感覺怪怪的。
想防止反編譯,最簡單的方法就是你可以向Jar注入無效代碼。比如建一個類,建一個沒有意義的方法private class Invalid{ },然後輸出為jar。用解壓縮軟體打開這個jar,以文本方式找到那個類的class,然後將那個方法名的一個字母刪掉,然後更新入壓縮文件中。用jd-gui反編譯提示錯誤。這種方式不能用於android中。
還有種方法就是混淆代碼,加密class和高級加密class,方式比較復雜,可以自行網路。
㈩ Unity3D代碼加密如何做到防止反編譯
Unity3D主要使用C#語法和開源mono運行開發商的代碼邏輯,所有代碼都不是編譯到EXE,而是位於{APP}\build\game_Data\Managed\Assembly-CSharp.dll。而且mono執行原理跟微軟.NET Framework兼容但是執行原理完全不一樣。傳統的.NET Framework加殼全部失效,因為Assembly-CSharp.dll不是PE格式的動態庫也不是.NET的動態庫,無法從 .NET Framework 載入,而是由mono.dll讀取 Assembly-CSharp.dll的裡面C#腳本解釋執行。
Virbox Protector 對 Assembly-CSharp.dll 做加密,無需手動加密 Assembly-CSharp.dll 代碼,自動編譯 mono, Assembly-CSharp.dll 代碼按需解密,只有調用到才會在內存解密,不調用不解密,黑客無法一次解出所有的代碼。一鍵加密代碼邏輯,無法反編譯,無法mp內存。不降低游戲幀數,自帶反黑引擎,驅動級別反調試,秒殺市面的所有調試器。
Uinty3D 主要的游戲資源都在 resources.assets ,游戲裡面所有放在 resources 文件夾下的東西都會放在這里,DSProtector工具可以對Unity軟體中的 .resS和resources等資源文件進行加密防止軟體或游戲中的資源被非法提取。