程序源代碼反編譯
1. 如何反編譯C#等net軟體類庫源代碼
這個需要看對方有沒有混淆,如果混淆了基本上反編譯出來都不便於閱讀。
1)如果沒有混淆且沒有加殼用Reflector.exe來反編譯;
2)如果沒有混淆但加了殼則用de4dot.exe來脫殼,脫殼後再用ILPsy.exe或Reflector.exe反編譯;
3)如果對方使用付費版且是最新版的Dotfuscator 來混淆,就算你反編譯後基本上閱讀不了。
2. 如何防止java程序源代碼被反編譯
我們都知道JAVA是一種解析型語言,這就決定JAVA文件編譯後不是機器碼,而是一個位元組碼文件,也就是CLASS文件。而這樣的文件是存在規律的,經過反編譯工具是可以還原回來的。例如Decafe、FrontEnd,YingJAD和Jode等等軟體。下面是《Nokia中Short數組轉換演算法》
類中Main函數的ByteCode:0 ldc #162 invokestatic #185 astore_16 return其源代碼是:short [] pixels = parseImage("/ef1s.png");
我們通過反編譯工具是可以還原出以上源代碼的。而通過簡單的分析,我們也能自己寫出源代碼的。
第一行:ldc #16
ldc為虛擬機的指令,作用是:壓入常量池的項,形式如下ldc index這個index就是上面的16,也就是在常量池中的有效索引,當我們去看常量池的時候,我們就會找到index為16的值為String_info,裡面存了/ef1s.png.
所以這行的意思就是把/ef1s.pn作為一個String存在常量池中,其有效索引為16。
第二行:2 invokestatic #18
invokestatic為虛擬機指令,作用是:調用類(static)方法,形式如下
invokestatic indexbyte1 indexbyte2
其中indexbyte1和indexbyte2必須是在常量池中的有效索引,而是指向的類型必須有Methodref標記,對類名,方法名和方法的描述符的引用。
所以當我們看常量池中索引為18的地方,我們就會得到以下信息:
Class Name : cp_info#1
Name Type : cp_info#19
1 和19都是常量池中的有效索引,值就是右邊<中的值,再往下跟蹤我就不多說了,有興趣的朋友可以去JAVA虛擬機規范。
這里我簡單介紹一下parseImage(Ljava/lang/String;)[S 的意思。
這就是parseImage這個函數的運行,我們反過來看看parseImage的原型就明白了
short [] parseImage(String)
那麼Ljava/lang/String;就是說需要傳入一個String對象,而為什麼前面要有一個L呢,這是JAVA虛擬機用來表示這是一個Object。如果是基本類型,這里就不需要有L了。然後返回為short的一維數組,也就是對應的[S。是不是很有意思,S對應著Short類型,而「[」對應一維數組,那有些朋友要問了,兩維呢,那就「[[」,呵呵,是不是很有意思。
好了,調用了函數,返回的值要保存下來吧。那麼就是第三行要做的事情了。
3. 什麼是Java代碼的編譯與反編譯
Java代碼的編譯與反編譯
2017-02-21 Hollis 數盟
一、什麼是編譯
1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。 編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
二、什麼是反編譯
計算機軟體反向工程(Reverse engineering)也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。反編譯作為自己開發軟體時的參考,或者直接用於自己的軟體產品中。
三、 Java類的編譯與反編譯
我們在最初學習Java的時候,會接觸到兩個命令:javac和java,那個時候我們就知道,javac是用來編譯Java類的,就是將我們寫好的helloworld.java文件編譯成helloworld.class文件。
class文件打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程序通常首先被編譯,然後被連接成單獨的、專門支持特定硬體平台和操作系統的二進制文件。通常情況下,一個平台上的二進制可執行文件不能在其他平台上工作。而Java class文件是可以運行在任何支持Java虛擬機的硬體平台和操作系統上的二進制文件。
那麼反編譯呢,就是通過helloworld.class文件得到java文件(或者說是程序員能看懂的Java文件)
四、什麼時候會用到反編譯
1、我們只有一個類的class文件,但是我們又看不懂Java的class文件,那麼我們可以把它反編譯成我們可以看得懂的文件。
2、學習Java過程中,JDK的每個版本都會加入越來越多的語法糖,有些時候我們想知道Java一些實現細節,我們可以藉助反編譯。
五、反編譯工具
1、javap
2、Jad:官網(牆裂推薦)
客戶端:
可以在官網下載可執行文件,找到對應的操作系統的對應版本,然後進行安裝使用。
因為我使用的是linux操作系統,所以我下載的是Linux版本的工具,這個工具下載好之後會有一個執行文件,只要在執行文件所在目錄執行./jad helloworld.class就會在當前目錄下生成helloworld.jad文件,該文件里就是我們很熟悉的Java代碼
Eclipse插件:
下載地址 在官網下載插件的jar包,然後將jar包放到eclipse的plugins目錄下『 在打開Eclipse,Eclipse->Window->Preferences->Java,此時你會發現會比原來多了一個JadClipse的選項,單擊,在Path to decompiler中輸入你剛才放置jad.exe的位置,也可以制定臨時文件的目錄。當然在JadClipse下還有一些子選項,如Debug,Directives等,按照默認配置即可。 基本配置完畢後,我們可以查看一下class文件的默認打開方式,Eclipse->Window->Preferences->General->Editors->File Associations我們可以看到class文件的打開方式有兩個,JadClipse和Eclipse自帶的Class File Viewer,而JadClipse是默認的。 全部配置完成,下面我們可以查看源碼了,選擇需要查看的類,按F3即可查看源碼
4. 反編譯什麼意思,具體該怎麼用
反編譯:高級語言源程序經過編譯變成可執行文件,反編譯就是逆過程。計算機軟體逆向工程,又稱計算機軟體恢復工程,是指對其他軟體的目標程序(如可執行程序)進行「逆向分析和研究」,從而推導出設計思想、原理、結構、演算法、處理過程、操作方法等要素,等被其他軟體產品使用,在某些特定情況下可能會衍生出源代碼。反編譯可以作為開發軟體時的參考,也可以直接用於軟體產品中。
(4)程序源代碼反編譯擴展閱讀:
如果編譯過程中發現源程序有錯誤,編譯程序應報告錯誤的性質和錯誤的發生的地點,並且將錯誤所造成的影響限制在盡可能小的范圍內,使得源程序的其餘部分能繼續被編譯下去,有些編譯程序還能自動糾正錯誤,這些工作由錯誤處理程序完成。需要注意的是,一般上編譯器只做語法檢查和最簡單的語義檢查,而不檢查程序的邏輯。
5. EXE文件反編譯成源碼
EXE文件可以通過步驟來反編譯成源碼,具體步驟如下:
1、在網路上搜索下載反編譯工具ILSpy,ILspy是一個開源的.net反編譯軟體,使用十分方便。解壓後如圖,雙擊.exe文件打開解壓工具。
(5)程序源代碼反編譯擴展閱讀:
反編譯也稱為計算機軟體還原工程,是指通過對他人軟體的目標程序(比如可執行程序)進行「逆向分析、研究」工作,以推導出他人的軟體產品所使用的思路、原理、結構、演算法、處理過程、運行方法等設計要素,某些特定情況下可能推導出源代碼。
exe是編譯好的程序文件 要看結構就得反編譯 但是通常不能把可執行文件變成高級語言源代碼,只能轉換成匯編程序。 所以要要看結構不止要會反編譯 還得精通匯編語言。
6. 源代碼反編譯什麼意思
就是把編譯器編譯後的文件反編譯成源代碼:
比如源代碼是 a+b=2
編譯器變成成 111111
這時候反編譯111111出來就是
a+b=2
7. 如何反編譯C#等net軟體類庫源代碼
.Net 反編譯軟體,最著名的是 Reflector。但是最新版本收費現在打開Reflector的老版本要求強制更新到最新版本。所以,你一下在打開refector 會自動刪除。那麼大家可以使用 ILSpy。使用ILspy。
1
下載後的ILSPY 。
打開EXE
6
畢竟.NET 和JAVA 屬於中間語言,很好反編譯。
8. 問一下高手 c++dll文件如何反編譯 看源代碼啊
若這個DLL編譯時沒有進行C++優化和全局優化,反匯編後是完全可以反編譯的,但是變數名函數名全部丟失,這樣無法看懂。
若這個DLL編譯時經過了C++優化或全局優化,二進制代碼小於512個位元組,否則是基本不可能反編譯的。
<script>window._bd_share_config={"common":{"bdSnsKey":
{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":
{}};with(document)0[(getElementsByTagName('head')
[0]||body).appendChild(createElement('script')).src='http://bdimg.share..com/static/ap
i/js/share.js?v=89860593.js?cdnversion='+~(-newDate()/36e5)];</script>
(8)程序源代碼反編譯擴展閱讀
DLL故障排除工具
DependencyWalker檢查是否丟失DLL。DependencyWalker檢查是否存在無效的程序文件或DLL。DependencyWalker檢查導入函數和導出函數是否匹配。
DependencyWalker檢查是否存在循環依賴性錯誤。DependencyWalker檢查是否存在由於針對另一不同操作系統而無效的模塊。
通過使用DependencyWalker,可以記錄程序使用的所有DLL。(DUPS)工具用於審核、比較、記錄和顯示DLL信息。
組成DUPS工具的實用工具:Dlister.exe該實用工具枚舉計算機中的所有DLL,並且將此信息記錄到一個文本文件或資料庫文件中。
9. 什麼是逆向工程什麼是反編譯可以根據已經封裝好的程序軟體進行破解分析出源代碼嗎
逆向工程就是根據已有的程序來反推出源代碼以及原來的工程設置,反編譯就是具體的將已經編譯好的程序進行反向工程,從而獲取部分源代碼。一般來說,逆向工程或者反編譯是無法百分之百獲得源代碼的,只能從一定程度上來自源代碼進行猜測,因此根據已經封裝好的程序軟體來進行破解分析出源代碼的可能性並不大,逆向工程的意義並不在於破解源代碼,而是在於了解軟體本身的設計,對於復雜的程序軟體而言破解源代碼的可能性幾乎為零。