反編譯com
❶ 如何防止程序員反編譯
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就得跟著這個項目到處走啊!
❷ 反編譯是什麼意思
計算機軟體反向工程(Reverse engineering)也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(比如可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,
某些特定情況下可能推導出源代碼。反編譯作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。
(2)反編譯com擴展閱讀
反編譯是一個復雜的過程,反編譯軟體有:
1、SWF相關的反編譯程序
Action Script Viewer
第一個也是最強大的商業SWF反編譯工具,同類產品中,它的AS代碼反編譯效果最好,SWF轉Fla工程重建成功率最高。
2、Android相關的反編譯程序
SMALI/BAKSMAL
SMALI/BAKSMALI是一個強大的apk文件編輯工具,用於Dalvik虛擬機(Google公司自己設計用於Android平台的虛擬機)來反編譯和回編譯classes.dex。其語法是一種寬松式的Jasmin/dedexer語法,而且它實現了.dex格式所有功能(註解,調試信息,線路信息等)。
3、python相關的反編譯程序
uncompyle2
uncompyle2可以直接轉化為十分完美的python源碼,並可以將反編譯後的源碼再次生成位元組碼文件。
參考資料來源:網路-反向編譯
❸ 求各種好用的反編譯工具!!
如PB的,最常用的是 PB反編譯專家 SHUDEPB
.net,一般是Reflector
dephi,一般是dede
JAVA,比較出名的有小穎的反編譯專家
XJad(Java源代碼反編譯工具) V2.2
XJad是基於Jad核心的Java源程序反編譯軟體,內置Jad1.5.8e2。
XJad可處理多個*.class文件,可以處理文件夾內的所有文件,甚至可以處理*.jar文件。
XJad帶有多頁面文本編輯器,反編譯完成後可以直接編輯查看,編輯器支持java語法的高亮顯示功能。
XJad是一個純綠色軟體,為使用方便,可以在選項中設置集成到資源管理器中,這樣在*.class、*.java、*.jar文件和目錄上隨時點擊右鍵都可直接進行操作。
XJad還帶有導出當前編輯器中的代碼為HTML文件的功能,HTML文件保持代碼高亮顯示的樣式風格。
使用說明
===========
1、反編譯class文件:打開一個或者多個*.class文件,XJad反編譯後,重命名為*.java文件,保存至當前文件夾,並在編輯器中打開查看;
2、反編譯文件夾:在軟體中選擇反編譯文件夾或右鍵點擊文件夾選擇反編譯,XJad將該文件夾下所有*.class文件進行反編譯,並保存至該文件夾下,依據包路徑信息生成文件夾路徑,如com.spring.framework.*,將建立com\\spring\\framework的文件夾結構;
3、反編譯jar文件:打開一個*.jar文件,XJad將該Jar文件中的所有*.class文件解壓縮到臨時目錄並進行反編譯,並將源文件帶包路徑信息保存至當前文件夾下名稱為「~」 + *.jar 的文件夾中;
flash反編譯工具 閃客精靈
❹ 如何反編譯木馬程序
木馬程序是一種程序,它能提供一些有用的,或是僅僅令人感興趣的功能。但是它還有用戶所不知道的其他功能,例如在你不了解的情況下拷貝文件或竊取你的密碼。
RFC1244(Request for Comments:1244)中是這樣描述木馬的:「木馬程序是一種程序,它能提供一些有用的,或是僅僅令人感興趣的功能。但是它還有用戶所不知道的其他功能,例如在你不了解的情況下拷貝文件或竊取你的密碼。」隨著互聯網的迅速發展,木馬的攻擊、危害性越來越大。木馬實質上是一個程序,必須運行後才能工作,所以會在進程表、注冊表中留下蛛絲馬跡,我們可以通過「查、堵、殺」將它「緝拿歸案」。
查
1.檢查系統進程
大部分木馬運行後會顯示在進程管理器中,所以對系統進程列表進行分析和過濾,可以發現可疑程序。特別是利用與正常進程的CPU資源佔用率和句柄數的比較,發現異常現象。
2.檢查注冊表、ini文件和服務
木馬為了能夠在開機後自動運行,往往在注冊表如下選項中添加註冊表項:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
木馬亦可在Win.ini和System.ini的「run=」、「load=」、「shell=」後面載入,如果在這些選項後面載入程序是你不認識的,就有可能是木馬。木馬最慣用的伎倆就是把「Explorer」變成自己的程序名,只需稍稍改「Explorer」的字母「l」改為數字「1」,或者把其中的「o」改為數字「0」,這些改變如果不仔細觀察是很難被發現。
在Windwos NT/2000中,木馬會將自己作為服務添加到系統中,甚至隨機替換系統沒有啟動的服務程序來實現自動載入,檢測時要對操作系統的常規服務有所了解。
3.檢查開放埠
遠程式控制制型木馬以及輸出Shell型的木馬,大都會在系統中監聽某個埠,接收從控制端發來的命令,並執行。通過檢查系統上開啟的一些「奇怪」的埠,從而發現木馬的蹤跡。在命令行中輸入Netstat na,可以清楚地看到系統打開的埠和連接。也可從www.foundstone.com下載Fport軟體,運行該軟體後,可以知道打開埠的進程名,進程號和程序的路徑,這樣為查找「木馬」提供了方便之門。
4.監視網路通訊
對於一些利用ICMP數據通訊的木馬,被控端沒有打開任何監聽埠,無需反向連接,不會建立連接,採用第三種方法檢查開放埠的方法就行不通。可以關閉所有網路行為的進程,然後打開Sniffer軟體進行監聽,如此時仍有大量的數據,則基本可以確定後台正運行著木馬。
堵
1.堵住控制通路
如果你的網路連接處於禁用狀態後或取消撥號連接,反復啟動、打開窗口等不正常現象消失,那麼可以判斷你的電腦中了木馬。通過禁用網路連接或拔掉網線,就可以完全避免遠端計算機通過網路對你的控制。當然,亦可以通過防火牆關閉或過濾UDP、TCP、ICMP埠。
2.殺掉可疑進程
如通過Pslist查看可疑進程,用Pskill殺掉可疑進程後,如果計算機正常,說明這個可疑進程通過網路被遠端控制,從而使計算機不正常。
殺
1.手工刪除
對於一些可疑文件,不能立即刪除,有可能由於誤刪系統文件而使計算機不能正常工作。首先備份可疑文件和注冊表,接著用Ultraedit32編輯器查看文件首部信息,通過可疑文件裡面的明文字元對木馬有一個大致了解。當然高手們還可以通過W32Dasm等專用反編譯軟體對可疑文件進行靜態分析,查看文件的導入函數列表和數據段部分,初步了解程序的主要功能。最後,刪除木馬文件及注冊表中的鍵值。
2.軟體殺毒
由於木馬編寫技術的不斷進步,很多木馬有了自我保護機制。普通用戶最好通過專業的殺毒軟體如瑞星、金山毒霸等軟體進行殺毒,對於殺毒軟體,一定要及時更新,並通過病毒公告及時了解新木馬的預防和查殺絕技,或者通過下載專用的殺毒軟體進行殺毒(如近期的沖擊波病毒各大公司都開發了查殺工具)。
❺ 如何使用debug反匯編com文件並把結果存儲到文本文件
先編寫一個文件,名為:DDD.BAT,文件內容見如下:
------------------
N D:\A.COM
L
U
Q
------------------
存檔。(上面的兩條橫線,可不要鍵入文件哪。)
然後在DOS提示符下,鍵入:
DEBUG < DDD.BAT > D:\B.TXT <Enter>
即可。
DEBUG將按照DDD.BAT的內容進行操作,生成的結果都存入D:\B.TXT,屏幕上並沒有顯示。
❻ 如何反編譯EXE文件
Windows軟體開發工具包(SDK)提供一個叫做 DUMPBIN 的極有用的工具,它有許多有助編程分析的功能. 反編譯只是其功能之一.
反編譯命令格式:
mpbin /DISASM 你的文件.exe
DUMPBIN 詳細用法參考:
http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B121460
上述網頁談的是Windows NT, 其實也實用於其它視窗系統.
❼ 如何反編譯軟體序列號
這個需要學習反編譯知識啦給你資料http://www.99d.com/list/202/0_1_1.html
❽ 如何反編譯被BAT2EXEC 1.5編譯的bat->com
用ultraedit看exe里邊的字元串
❾ 什麼叫做反編譯啊
反編譯
計算機軟體反向工程(Reversepengineering)也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。