怎樣防止程序員反編譯
Java代碼的編譯與反編譯
2017-02-21Hollis數盟
一、什麼是編譯
1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
二、什麼是反編譯
計算機軟體反向工程(Reverseengineering)也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。反編譯作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。
三、Java類的編譯與反編譯
我們在最初學習Java的時候,會接觸到兩個命令:javac和java,那個時候我們就知道,javac是用來編譯Java類的,就是將我們寫好的helloworld.java文件編譯成helloworld.class文件。
class文件打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程序通常首先被編譯,然後被連接成單獨的、專門支持特定硬體平台和操作系統的二進制文件。通常情況下,一個平台上的二進制可執行文件不能在其他平台上工作。而Javaclass文件是可以運行在任何支持Java虛擬機的硬體平台和操作系統上的二進制文件。
那麼反編譯呢,就是通過helloworld.class文件得到java文件(或者說是程序員能看懂的Java文件)
四、什麼時候會用到反編譯
1、我們只有一個類的class文件,但是我們又看不懂Java的class文件,那麼我們可以把它反編譯成我們可以看得懂的文件。
2、學習Java過程中,JDK的每個版本都會加入越來越多的語法糖,有些時候我們想知道Java一些實現細節,我們可以藉助反編譯。
五、反編譯工具
1、javap
2、Jad:官網(牆裂推薦)
客戶端:
可以在官網下載可執行文件,找到對應的操作系統的對應版本,然後進行安裝使用。
因為我使用的是linux操作系統,所以我下載的是Linux版本的工具,這個工具下載好之後會有一個執行文件,只要在執行文件所在目錄執行./jadhelloworld.class就會在當前目錄下生成helloworld.jad文件,該文件里就是我們很熟悉的Java代碼
Eclipse插件:
下載地址在官網下載插件的jar包,然後將jar包放到eclipse的plugins目錄下『在打開Eclipse,Eclipse->Window->Preferences->Java,此時你會發現會比原來多了一個JadClipse的選項,單擊,在Pathtodecompiler中輸入你剛才放置jad.exe的位置,也可以制定臨時文件的目錄。當然在JadClipse下還有一些子選項,如Debug,Directives等,按照默認配置即可。基本配置完畢後,我們可以查看一下class文件的默認打開方式,Eclipse->Window->Preferences->General->Editors->FileAssociations我們可以看到class文件的打開方式有兩個,JadClipse和Eclipse自帶的ClassFileViewer,而JadClipse是默認的。全部配置完成,下面我們可以查看源碼了,選擇需要查看的類,按F3即可查看源碼
⑵ 程序員看劇的時候,如果看到有敲代碼頁面,會暫停看代碼嗎
我有過一次類似的經歷。某次在某大型石化變電站內給電力監控系統配套資料庫,由於資料庫程序修改量大白天干不完,,我和同事把數據拷貝到筆記本中,回到酒店繼續工作。到了飯點肚子實在餓,又怕用餐影響思維進程,就和同事把各自的筆記本帶到酒店餐廳,找個偏僻位置一邊用餐一邊討論繼續修改程序。
不過一旦發現是 HTML/CSS/Javascript/Java/Python/C 在搞向標准輸出列印,Web/HTTP 這種就沒了興致。改進的話,語言上整點 Racket/OCaml/Haskell/Idris/Rust/C#/Elixir,然後開 Visual Studio Code 全屏,裝好對應代碼高亮插件,貼點不明覺厲的代碼片段比如 Chez Scheme 的代碼上去,豎直副屏全屏打開一個 Terminal 不斷往外蹦符合演出敘事的消息。畢竟影視劇里的編程是表演的一部分,需要通過編程表演藝術裝屄的時候,請劇組盡力保證演出效果。
⑶ 公司如何保護源代碼不被員工泄漏
您好。感謝您給我這次回答的機會。
首先,我認為這個有兩種方法,看你怎麼選。
第一種:
限制代碼庫只能在公司內網訪問,公司之外懷能下載代碼;
限制只能用公司的電腦下載代碼、編寫代碼、提交代碼;
限制訪問代碼庫的許可權,發人員不授予訪問和自己不相關代碼庫的許可權;
能訪問代碼的電腦上安裝監控軟體,號稱可以監控所有員工活動;
設置公司網路防火牆,禁止訪問github這樣的開源網站;
把上面所有的規矩記錄下來,教育員工知道,讓他們簽字畫押必須遵守,鈑者開除而且報警。
第二種:
招募受過良好教育、品行良好、專業團隊工作經驗的開發者;
對開發者友善,讓他們不會對公司心懷怨恨;
把開發者的利益和公司利益關聯起來,讓他們不想為了蠅頭小利犧牲公司利益。
其次,你可能不知道的東西。
1.絕大部分的公司(bat另說) 手中的源代碼商業價值根本不高。
2.絕大部分的公司的源碼質量都比不過github的哪些開源類庫。
3.絕大部分的公司的源碼都屬於高度定製化的開發(就是換個公司,這個軟體幾乎就沒有什麼價值了)。
4.絕大部分的公司都不是靠「軟體技術」賺錢的。
5.絕大部分的人都不會傻到直接把偷來的源碼用於「商業活動」(非但不一定賺錢還可能吃官司,還不如去github上扒開源代碼)
6."防禦"的成本數倍於"重新開發一套"軟體.
所以看淡一點源碼,它在絕大多數公司中其實並不值」幾個錢「雖然它的創造成本可能」很貴「。
所以說,這些東西掌握以後,就基本上不用擔心代碼被泄露了。
理論上做到公司電腦無法和外界連通,進出人員不得攜帶任何外設就可以徹底解決代碼泄漏的問題。但是商業公司比較難做到。下面我們來的分析一下員工有沒必要竊取代碼,有沒能力竊取到下完整的代碼。
現在有一定規模的公司應用都是服務化的,不同的小組負責不同的服務,有各自的代碼查看許可權。所以一個或者幾個程序員無法拿到全部代碼。
超大規模的應用就更復雜了,有前台,中台,後台,APP等,架構也極其復雜,就算某個程序員獲得到了全部代碼,也沒有能力搭建並運行起來。
小規模公司的代碼基本都是業務邏輯代碼,泄不泄漏可能也沒有太大關系。
防止別人偷拿代碼是很難的,倒不如加強企業文化,提高員工的職業素養。尊重是互相的,做到用人不疑,我想大部分人也不會以怨報德。
說說我們公司是怎麼做的吧:
1. 封了網路文庫、網路網盤、CSDN等網站凡是能上傳文件的網站,我們公司都封了,這樣就防止員工把內部文件上傳到這些網站被泄密。但是這樣做的一個後果就是員工想查一些資料,在這些網站都打不開,只能用自己的手機去查了,造成了一些工作的不便。
2. 封了USB、藍牙介面,以及光碟機凡是能從電腦上拷貝文件到外部的介面,我們公司都封了,這樣員工就無法把公司的文件拷到外面了,避免了泄密。這樣做的後果也給我們帶來了一些工作上的不便。比如以前我們做藍牙測試的時候,需要把測試的App拷貝到手機上舊非常困難。後來公司了解了我們的困難,允許我們提申請,經過上級領導的批准後,可以給電腦開通USB許可權,但是拷貝的內容也是被公司監控,所以也只能拷貝需要的內容。申請的時候有選擇開通的時間,到期後,USB許可權自動關閉了。
3. 禁止將公司電腦帶出公司為了防止員工私下裡想辦法把公司電腦的文件拷走,公司禁止把電腦帶出辦公室。如果需要帶電腦去客戶那裡,則需要向公司提出申請,申請的時候也要選擇帶出和帶回的時間,這樣基本上就杜絕了員工泄密的可能。如果員工在外出途中丟失了電腦,這就會成為一個大事件,會匯報到公司最高層,對員工個人的影響也很大。公司有一套流程專門應對這類事件。曾經我們公司有人帶電腦去客戶那裡,跟客戶吃飯喝醉了,打車回家把電腦弄丟了,引起了很大的後果,這個事經常會作為事例來教育全體員工。
4. 電腦里安裝監控軟體公司的電腦里都安裝有監控軟體,網管可以監控到每一台電腦。員工在電腦上列印,發傳真、發郵件這些活動都受到監控。列印機也能看到每個人列印、傳真的內容。員工如果有泄密的行為都可以及時監控到。至於員工對著電腦拍照,公司應該也能檢測到。所以公司的電腦不要做一些私人的事情,很容易被監控到。
5. 封了QQ、微信等可以傳輸文件的社交軟體QQ、微信這類可以傳遞文件的社交軟體在公司的電腦上是不能安裝的,也防止了員工通過這些軟體把文件傳輸到外面。公司內部只能使用微軟自帶的聊天工具Lync,這個軟體也不能傳輸文件,只能聊天。如果公司內部需要傳輸文件,只能用公司的伺服器或者郵件。有些大的文件,只能盡量壓縮,否則傳輸會非常不方便。
6. 禁止員工安裝公司允許之外的軟體嚴格監控員工的軟體安裝列表。公司給出了允許安裝的軟體列表,超出范圍的安裝軟體會被監控到,讓員工刪除掉。這樣員工無法安裝一些上傳文件的軟體了,防止泄密了。員工也不能隨意從網路上下載安裝文件,防止一些木馬病毒藏在軟體里,盜取公司文件。
公司防止員工泄密的手段是很多的,每年還要對員工進行安全教育,規范員工的行為。
虛擬化桌面伺服器,使用虛擬桌面和瘦客戶機,瘦客戶機禁止usb存儲。瘦客戶機不能聯網但可以連虛擬化伺服器,伺服器不能連外網。單獨設立一台機器可以聯網,也可以連接一台ftp虛擬機(虛擬化伺服器中的FTP用於內外網共享文件),聯網機器下載的東西了上傳到ftp供其他桌面虛擬機使用。桌面虛擬機上傳的文件需要管理員通過才能被這台外網機器看到下載。
1,不允許攜帶電子設備進入工作區域,進門經過金屬探測。
2,公司電腦不允許連接外網。
3,封死USB等外設介面。
4,機箱鎖死,防止拆硬碟。
5,安裝攝像頭對准每一個工位,一旦發現使用拍照設備等,進行相應處罰。
這幾個只有一起用才能完全防止泄露,否則都有辦法。
你去看看某研究院的一些規章。禁止筆記本等帶入,不小心帶入了,對不起,設備留置24小時,徹底格式化。手機,存儲設備也一樣禁止帶入。開發機全部內網。沒有WIFI,滑鼠鍵盤全部有線,粘死。機箱上鎖。USB等介面全部封掉。人員許可權限制,絕大部分人員不能下載全部代碼。
首先管理層面,領導要重視信息安全,然後按照iso27000系列信息安全標准去做。信息安全和物理安全是要互相配合的。辦公區要根據安全級別設置不同的管理措施,信息資產要根據價值設置不同的標簽,區分關鍵資產和非關鍵資產,另外信息資產只能有一個出口要經過審批後才能出去。技術層面的措施也可以用,但是不能亂用。另外開發環境安全可以參考15408的站點審查部分。
防止不了,有合作公司管理嚴格,我們都用手機拍照溝通,所以除非禁用手機和一切拍照設備,否則都給你拍出來。
我覺吧吧,關鍵是人。而不是制度。
這么說吧,光有源代碼屁也不是。要是沒人build都困難。別說上線和運行了。
所以,你要是選信任的人,而不是選信任的方法。那麼就算別人真偷了,拿一堆源代碼回去,都沒辦法build,有什麼用?
反之,就算沒有源代碼。人家拍拍屁股走人。然後還他媽實現,你有什麼辦法?
⑷ 如何防止程序員反編譯
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就得跟著這個項目到處走啊!
⑸ 如何對編譯的dll文件進行加密來防止反編譯
使用過.NET的程序員都知道,.NET是一個巨大的跨時代進步,它開發效率高、功能強、界面美觀、耐用、新的語言C#已經提交為行業規范、CLR共公運行庫資源豐富,這所有的特點標志著它成為主流編程語言是必然的。
可是他也有一個缺點,那就是編譯好的程序集可以完全被反編譯成源代碼,這給一些不法份子提供了很好的機會,試想想,您辛苦的勞動成果就這樣輕易的給別人利用,是多麼不公平的事阿?所以如何保護我們的知識產權成了一個大問題。
MAXTOCODE 已經完全超越了傳統的混淆手段來保護源代碼的方式,他將完全加密您的代碼,使您的代碼完全沒有辦法反編譯。保護強度已經不是混淆器可以與之抗衡,是目前保護強度最大,最完美的.NET產品保護方案。
MAXTOCODE 是 Aiasted.SOFT 完全自主開發的一款 .NET 代碼保護工具。它是目前世界上高強度保護工具之一。
第一種代碼保護方案是混淆,這是一個不錯的方案,可惜強度還是無法保證,如果要做一個大的逆向工程有一定困難,但針對某個演算法或功能進行解讀還是很容易的。反觀混淆原理則發現,混淆其實只是一個與障眼法差不多的技術。第二種就是MAXTOCODE的保護技術了,MAXOTCODE 採用了難以理解的機器語言來加密您的.NET程序集,(特別注意:MAXTOCODE的強度建立在加密演算法之上,而不上簡單的混淆。)在程序集運行時運態解放源代碼,所以在原理上已經比混淆強度提高了許多。我們保護您所有的代碼,不讓不法份子看到您任何一個有效的代碼,使不法份子完全無法被反編譯。
⑹ 如何防止Android程序被反編譯
代碼混淆(code obfuscation)是指將計算機程序的代碼,轉換成一種功能上等價,所謂功能上的等價是指其在變換前後功能相同或相近。其解釋如下:程序P經過混淆變換為P『,若P沒有結束或錯誤結束,那麼P』也不能結束或錯誤結束;而且P『程序的結果應與程序P具有相同的輸出。否則P』不是P的有效的混淆。
目前對於混淆的分類,普遍是以Collberg 的理論為基礎,分為布局混淆(layout obfuscation)、數據混淆(data obfuscation)、控制混淆(control obfuscation)和預防混淆(preventive obfuscation)這四種類型。
1. 布局混淆
布局混淆是指刪除或者混淆軟體源代碼或者中間代碼中與執行無關的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。軟體源代碼中的注釋文本、調試信息可以直接刪除,用不到的方法和類等代碼或數據結構也可以刪除,這樣即可以使攻擊者難以理解代碼的語義,也可以減小軟體體積,提高軟體裝載和執行的效率。軟體代碼中的常量名、變數名、類名和方法名等標識符的命名規則和字面意義有利於攻擊者對代碼的理解,布局混淆通過混淆這些標識符增加攻擊者對軟體代碼理解的難度。標識符混淆的方法有多種,例如哈希函數命名、標識符交換和重載歸納等。哈希函數命名是簡單地將原來標識符的字元串替換成該字元串的哈希值,這樣標識符的字元串就與軟體代碼不相關了;標識符交換是指先收集軟體代碼中所有的標識符字元串,然後再隨機地分配給不同的標識符,該方法不易被攻擊者察覺;重載歸納是指利用高級編程語言命名規則中的一些特點,例如在不同的命名空間中變數名可以相同,使軟體中不同的標識符盡量使用相同的字元串,增加攻擊者對軟體源代碼的理解難度。布局混淆是最簡單的混淆方法,它不改變軟體的代碼和執行過程。
2. 數據混淆
數據混淆是修改程序中的數據域,而對代碼段不作處理。常用的數據混淆方式有合並變數、分割變數、數組重組、字元串加密等。
合並變數是將幾個變數合並為一個數據,原來的每個變數占據其中一個區域,類似於一個大的數據結構。分割變數則是將一個變數分割為兩個變數,對分割前後提供一種映射關系,將對一個變數的操作轉化為對分割後兩個變數的操作。
數組重組有數組的分割、合並、折疊和平滑等幾種方式。分割是將一個數組分成2個或多個相同維度的數組;合並則相反;折疊是增加數組的維數;平滑則是相反。
在ELF文件中,全局變數和常量字元串存放在數據段中,反匯編工具可以輕易查找到字元串與代碼之間的引用關系。在軟體破解中,通過一些字元串提示可以很方便的找到代碼關鍵語句,從而破解軟體。字元串加密則可以對這些明顯的字元串進行加密存儲,在需要時再進行解密。
3. 控制混淆
控制混淆也稱流程混淆,它是改變程序的執行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟體的目的。一般採用的技術有插入指令、偽裝條件語句、斷點等。偽裝條件語句是當程序順序執行從A到B,混淆後在A和B之間加入條件判斷,使A執行完後輸出TRUE或FALSE,但不論怎麼輸出,B一定會執行。
控制混淆採用比較多的還有模糊謂詞、內嵌外聯、打破順序等方法。
模糊謂詞是利用消息不對稱的原理,在加入模糊謂詞時其值對混淆者是已知的,而對反混淆者卻很難推知。所以加入後將干擾反匯編者對值的分析。模糊謂詞的使用一般是插入一些死的或不相關的代碼(bogus code),或者是插入在循環或分支語句中,打斷程序執行流程。
內嵌(in-line)是將一小段程序嵌入到被調用的每一個程序點,外聯(out-line)是將沒有任何邏輯聯系的一段代碼抽象成一段可被多次調用的程序。
打破順序是指打破程序的局部相關性。由於程序員往往傾向於把相關代碼放在一起,通過打破順序改變程序空間結構,將加大破解者的思維跳躍。
4. 預防混淆
預防混淆一般是針對專用的反編譯器設計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設計。預防混淆對於特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進行設計。
⑺ 怎麼給mt4指標加時間限制代碼可以加密更好,防反編譯。
添加一句語句:date>20110807時返回。
然後加密就是
⑻ 對於一個已經編程好的程序,是否可以對他進行反編程
當然可以, 上網搜,可以搜到大把反編譯器, 這樣可以把別人做好的應用程序反編譯成程序代碼,從而進行分析。
以java為例,java代碼寫好後,編譯並打包成 .jar 可運行文件(相當於.exe)。這時可以上網找到比如「小穎反編譯器」之類的工具進行反編,這樣又可以把.jar反編成一堆原始的java代碼。
由於有這個問題,所以程序員們為了防止自己的工作成果被人抄襲後來就產生了混洧器, 利用混洧器可以將jar文件中的資源進行混洧,這樣雖然可以將.jar還原成源代碼,但現在的源代碼被隨機地打亂了,很難看懂,基本不具備可讀性。
當然有矛就有盾, 再歷害的混淆器也有歷害的反編器來破解它。
就像病毒和殺毒軟體一樣相生相剋