2011-02-16 73 views
3

假設我們有一個exe,可以很容易地轉換爲程序集?軟件作者有沒有辦法阻止/阻止?所有程序都可以轉換爲程序集嗎?

+3

你的意思是diassembly? – moatPylon 2011-02-16 13:32:07

+0

相關:[是否可以「反編譯」一個Windows .exe?或者至少查看大會?](http://stackoverflow.com/questions/273145/is-it-possible-to-decompile-a-windows-exe-or-at-least-view-the-assembly) – 2011-02-16 13:40:12

回答

2

總之,沒有。就像你不能阻止某人閱讀和分析你給他們的書。

4

可執行文件被設計爲由計算機處理器執行(因此得名)。彙編語言是計算機處理器執行的機器代碼的頂層。如果您的程序可以作爲機器代碼運行,那麼它可以作爲程序集讀取。

您可能有這樣的情況:專有的C/C++書面程序正在分發給客戶端。有些客戶的意圖不夠誠實,他們將程序反編譯爲程序集,更改某些指令(例如防止惡意使用程序,無限期擴展程序試用功能的指令),然後重新編譯程序。

在這種情況下,或者類似情況,您必須認識到所有程序在未執行時都只是作爲磁盤上的數據。任何人都可以閱讀這些數據並根據自己的喜好進行更改。如果這確實是一個問題,那麼您將不得不想出另一種方法來保護您的程序:例如,將重要邏輯委託給執行它的web服務並將結果發回。例如:谷歌的搜索算法運行在自己的網絡服務器上 - 沒有人確切知道它是如何工作的。

2

如果通過「轉換」,你的意思是編譯,而你的意思是編譯成機器碼,絕對是。在任何盒子上運行的每一行代碼都是作爲機器代碼運行的。對於任何特定的語言,答案都會根據是否存在創建不需要語言的運行時庫的獨立可執行文件的工具而有所不同。

如果通過「轉換」您的意思是在Assembly中手動編碼它,請參閱其他答案。我們不這樣做,因爲編寫代碼需要很長時間。

至於模糊處理,我在第一段中提到的轉換/編譯並不適用於此。當你「編譯」類似Java或C#的東西時,源代碼會被翻譯成運行時庫中的很多指針。這些指針可以很容易地進行反向設計,並重新生成原始代碼。

6

不可以。只有系統能夠理解程序,程序才能運行;如果它理解它,它可能是機器代碼,它可以直接轉換爲程序集。

你可以做的是嘗試使用代碼混淆方法,以使反彙編後的二進制儘可能難以理解。

http://en.wikibooks.org/wiki/X86_Disassembly/Code_Obfuscation

編輯:想補充一點,當然,隨着時間的推移和足夠的資源,有人會最終弄清楚如何讀你的混淆代碼。這是不可避免的。混淆的方式是儘可能不方便地對你的工作進行逆向工程,使其不值得他們的時間去追求它,所以只有那些想要嚴格反向工程的人才會這樣做。

1

我認爲maranas迄今爲止已經有了最好的答案,但會補充說我認爲你可以在某些條件下反彙編程序。首先以這種方式考慮它,如果它是真正可執行的,意味着可以由處理器執行,那麼絕對可以通過與處理器完全相同的方式解析該二進制文件,這意味着您可以解析每個位和字節,轉換成ASCII碼/彙編程序的可讀形式。如果程序可以執行,這總是可行的。

現在,有沒有什麼東西可以防止工作,如果你有的只有.exe文件,當然,很多東西和maranas答案都與其中一些鏈接,例如加密,以及如果加密的密鑰是在硬件或用戶密碼或沒有包含在.exe文件中的東西,那麼你可能無法弄清楚,它是遊戲結束。

多年來寫作反彙編我已經看到了不同的技巧,有時是故意的,有時不是。例如,如果你閱讀Michael Abrash的Assembly of Zen,我似乎相信在8088/86上討論了預取器,討論是從另一個處理器告訴處理器(記住這是在緩存之前),但也是擊敗黑客。你可以做的例子是有一條指令修改下一條指令,增加它可以說。這將會完美執行,因爲第二條指令已經被獲取並且在管道中,所以修改後的指令只在內存中,未修改的指令會被執行。當然,這需要是隻有在該指令在RAM中修改時才運行的代碼。這樣做特別是阻止人們用調試器單步執行代碼,因爲調試器會執行修改後的指令並崩潰或執行類似的操作。如果你的反彙編人員試圖模擬這個程序,並且沒有考慮到硬件再次運行的方式,那麼你將被引入雜草。我也看到使用加載一個立即數爲零的寄存器,接着是一個分支,如果爲零,這與無條件分支相同(假設寄存器實際上不需要爲零),請遵循一些數據導致反彙編程序被絆倒。您需要使用可變字長指令集才能正常工作。對於人類來說,找出發生的事情並不困難,並且手動調整反彙編過程以避免不是指令的數據字,但是對於自動化工具(它不是模擬器)更困難。技巧列表不斷變化...

底線是如果您的程序可以被處理器執行,那麼是的,您絕對可以將機器代碼轉換回人類可讀的彙編形式。是的,你可以做的事情,特別是使用硬件功能,這些功能對於反彙編程序來說是祕密的或不明顯的,它只查看可執行文件,可以防止反彙編。與任何安全措施一樣,如果用戶可以物理訪問該事物,他們可能會擊敗它,如果他們有能力在硬件上運行該程序,他們可能有能力打敗您的安全措施並對其進行反彙編。

相關問題