初步說明
首先,我們需要就二進製程序的正確反彙編是什麼達成共識。我會提出以下定義:
二進製程序的正確反彙編將給出程序可能執行的所有可能指令集,無論其輸入如何
另一種表示方式是說,我們在每個可能接受的輸入上公開程序所有可能執行的指令。
停止問題
在這裡我們已經可以與圖靈機上的停止問題相提並論,可以將其定義為以下內容( Wikipedia):
停止問題是根據任意計算機程序的描述和輸入來確定程序將結束運行還是永遠繼續運行的問題。
這個(顯然)非常簡單的問題已被圖靈證明無法確定,這意味著,即使我們可以使用程序自動處理一定數量的病例,某些病理病例也總是會從我們的程序將無法告訴您機器/程序是否會在給定的輸入上停止。
當然,這種病理情況非常多(因此,沒有希望枚舉它們的機會)
回到我們的反彙編問題!
探究程序的所有可能路徑確實是不可確定的由於停頓問題 >!
的確,解決停頓問題的一種雙重方法是可訪問性問題,您要在其中想知道是否有輸入可以使您到達問題的特定點。程序。並且,知道程序是否可以到達內存中的特定位置並將其解釋為一條指令(即,指令指針在某個時候獲取該地址的值)是可訪問性問題。
因此,不可分解。
但是,在現實世界中?
我知道,我知道,這只是數學...並非現實...大多數混淆(自願或非自願)都可以解決並自動從二進制代碼中刪除...
好吧,這主要是因為進行這些混淆的人並不習慣於不確定問題...
想像一下,您在程序中插入了一個無法確定的問題的計算,甚至只是一個足夠困難和復雜的東西,都會破壞應用於它的任何自動推理。 >舉個例子,讓我們以Collatz序列( Wikipedia)為例,推測該序列總是在1點後結束。但是,其背後的算術問題是如此復雜,以至於大約一個世紀以來就一直存在這種猜想……這是一個完美的不透明謂詞!當然,可能存在這種猜想的證明,但是這個問題非常複雜,足以開始在其上進行構建,並使計算機探索程序的狀態空間感到困惑。
事實上,這是當前的如今,在強力混淆方面的研究方向...我們幾乎已經用過以前使用過的小技巧,人們開始在有更好根據的問題上構建事物。即使我們在軟件混淆方面仍想與 Shannon (信息論之父)相提並論,以與密碼學進行比較。
最後一句話
因此,我們看到拆卸問題與停止問題緊密相關。而且,使用高度複雜的問題可能是現代軟件混淆的下一步。
我要說的最後一個事實是,如果我們必須堅持拆卸技術的最新水平,那麼當前的拆卸工具可能遠遠落後於我們可以做的事情。當我看到當前的史前工具是多麼的時候,我總是在痛苦中哭泣……但是將所有現代技術付諸實踐將需要大量的開發和維護工作,以致似乎沒有人願意為此做準備(但這只是我的本能。拙見)。