• 彩神彩票

    解釋、編譯與反編譯

            說到軟件的加密就不得不提提與之相關的各種編程語言,在大多數的時候我們並不關心我們所使用的編程語言所編製出來的程序是如何執行的,但如果你設計了一種特有的算法又不希望別人知道的情況下,所采用的加密手段往往同你的編程語言有很大的關係。

            在大學裏麵學習過編譯原理課程的人都知道,我們現在所使用的語言無非是兩種,一種是解釋執行的,另一種就是編譯後才能夠執行的語言。解釋執行的語言因為解釋器不需要直接同機器碼打交道所以實現起來較為簡單、而且便於在不同的平台上麵移植,這一點從現在的編程語言解釋執行的居多就能看出來,如 Visual Basic、Visual Foxpro、Power Builder、Java...。編譯執行的語言因為要直接同CPU 的指令集打交道,具有很強的指令依賴性和係統依賴性,但編譯後的程序執行效率要比解釋語言要高的多,像現在的 Visual C/C++、Delphi 等都是很好的編譯語言。

            對於解釋語言與編譯語言所編製出來的代碼安全性上而言,可以說是各有優缺點。曾經在 Windows 下跟蹤調式過 VB3 或 VB4 程序的朋友一般都知道,程序代碼 99% 的時間裏都是在 VBRUNxx 裏轉來轉去,根本看不出一個所以然來。這是因為你跟蹤的是 VB 的解釋器,要從解釋器中看出代碼的目的是什麽是相當困難的。但解釋語言有一個致命的弱點,那就是解釋語言的程序代碼都是以偽碼的方式存放的,一旦被人找到了偽碼與源碼之間的對應關係,就很容易做出一個反編譯器出來,你的源程序等於被公開了一樣。而編譯語言因為直接把用戶程序編譯成機器碼,再經過優化程序的優化,很難從程序返回到你的源程序的狀態,但對於熟悉匯編語言的解密者來說,也很容易通過跟蹤你的代碼來確定某些代碼的用途。

            下麵我根據我的了解對各種具有反編譯器的語言進行一下簡單的介紹:

            1、Visual Basic:據我所知 VB3、VB4 都有相應的反編譯器存在。而 VB5、VB6 不再是單純的解釋程序了,雖然裏麵還有解釋執行的部分,但起碼主程序部分是真正編譯的,沒有人做出 VB5 以上的反編譯器了。

            2、Foxpro:這種語言是反編譯器的主要市場,我幾乎見到過所有版本 FoxPro 的反編譯器,不管是DOS 版的還是 Windows 版的。其代碼的安全性十分令人擔憂。另外提一句,現在的外殼加密程序對它也是毫無幫助的,因為大多數的外殼程序都不會對程序中的偽碼部分進行處理,外殼程序加密的隻是其解釋器部分。

            3、Cliper:DOS 下的一種數據庫語言,不知道現在是否還有人在使用它,但至少我看到過它的反編譯器。

            4、Java:我至少見到過 3-4 種 Java 語言的反編譯器,據使用過的人說,其中有些反編譯器效果極好,能把那些 .class 結尾的文件反的一點不差。看來我至少要等到有編譯版本的 Java 出來後再考慮學習這種時髦的語言了。

            5、Install Shield:我沒寫錯,Install Shield 其實也是一種解釋語言,雖然它僅僅是為了做安裝程序用的,但有很多人用它來編寫序列號的檢查部分,其實它的偽碼都是放在 setup.ins 中,而且我看到了這個偽碼的反編譯程序,看來以後用 Install Shield 做安裝程序的朋友們要小心了。

            6、C:這種語言還是令人放心的,網絡上雖然有個叫做 EXE to C 的程序,但用過的人沒有不說上當的。

            那麽是不是用 C 語言編寫的程序就可以令人放心了呢?這個問題不是太好回答,主要看你程序的魅力有多大,如果你有一個能印製人民幣的程序給我,我兩個月就能搞出份源程序給你(一笑)。其實 C語言的反編譯也不是不可能的,但需要反編譯者對照匯編程序一行行的寫出來,其工作量之巨大可想而知。而且現有的反匯編程序如 IDA Pro、Sourcer 等反匯編出來的程序沒有一個能夠直接編譯回去的,它反編譯的結果主要是給人看的,而不是給人用的。如果你真有一個印製人民幣的程序要編的化,我在這裏給你提點建議:

            1、千萬不能編製功能強大的子程序,如過你程序的一個子程序就能印錢的化,我就不需要看別的了。

            2、多用全局變量,最好是全局的臨時變量,這個變量在每個子程序中的用法都不一樣,程序結構可能不太好,但能造成牽一發動全身的效果。

            3、如果能用 C++ 的化,盡量用 C++ 來編程,最好把你的算法全用類來實現,哪怕是一個加法減法也給它定義個類,再從子類上麵繼承繼承再繼承。

            4、編譯後的程序不能小於 500K.

    彩神彩票