2013-07-25 39 views
0

說,我的意思是讓我們說我們有這個可以寫不可能的彙編代碼嗎?

xx xx xx xx xx xx xx xx xx xx xx ... 

字節流。

現在,如果反彙編程序經歷了該流的每個可能的組合,它會在任何時候抱怨命令是不可能的?我希望反彙編爲每種可能的組合提供一個LEGIT輸出,不管它做什麼,但我希望它能成功地吐出指令,不管它是什麼。

這可能嗎?

回答

8

當然,這種情況經常發生。代碼通常也包含數據。像內聯字符串或表一樣,就像爲switch語句生成的類型一樣。跳轉表,包含地址而不是代碼。反編譯器傾向於在這樣的代碼上糟糕透頂。他們通常可以發現第一個表格是一個地址,但不知道表格有多長。

但是,這通常只會產生損壞的彙編代碼,典型的處理器沒有那麼多不可能的指令。他們傾向於將任何字節值映射到指令。因人而異。

+0

+1可能這是OP要求的。 – m0skit0

3

奇怪的問題,不知道我在正確認識你,但是......

不,不可能。並非每個位的組合都對應於有效的指令。指令具有預定義的格式。任何不符合此格式的內容都會引發「無效指令」硬件異常/陷阱/中斷。

此外,如果字節流太長,則具有所有可能的組合可能需要一些時間。

3

某些處理器使用固定長度指令,並且指令中出現的每個可能的位組合都具有明確定義的含義。有些使用固定長度指令,但某些位組合不具有任何定義的含義(製造商不指定如果嘗試執行此類組合時會發生什麼情況)。無論哪種情況,確定執行哪些代碼都很容易。

在許多其他處理器上,代碼字節序列的含義取決於開始解析它的位置。在6502處理器,該字節序列(開始於地址0xFFC0):如果在執行開始於地址0xFFC3

A9 00 2C A9 01 85 73 ... 

將被處理爲

FFC0: A9 00 -- LDA #$00 
FFC2: 2C A9 01 -- BIT $01A9 
FFC5: 85 73 -- STA $73 
FFC6: ... 

,然而,該序列將被處理爲

FFC3: A9 01 -- LDA #$01 
FFC5: 85 73 -- STA $73 
FFC6: ... 

這是不可能有把握地說,A9 01地址0xFFC3是否爲「LDA#$ 01」指令,或操作數爲「BIT」的指令。事實上,在一些真實世界的6502代碼中,相同的字節可用於兩種目的(BIT $ 01A9指令的唯一影響通常是設置一些標誌,因此$ 2C操作碼可以有效地跳過下兩個字節) 。

在許多處理器上,沒有針對所有可能的字節代碼的唯一定義的助記符。因此,以彙編語言生成它們的唯一方法可能是顯式使用定義字節指令。例如,在6502上,嘗試執行某些字節值(包括0x02,0x12和0x22)會使處理器停頓,直到下一次復位。由於這種行爲沒有用,所以沒有爲它們分配已定義的操作碼。一些後來的6502衍生產品在執行這些操作碼時會執行更多有用的操作,而針對這些特定衍生產品的彙編器將具有能夠生成它們的助記符,但反彙編程序的常見行爲要麼是反彙編0x02,就像「??? 「或」?02「,或假定與其明顯功能(例如」KIL「)相關的通用僞操作碼。

+0

+1關於從何處開始分析的好處。 – m0skit0

+0

順便說一下,有一些操作碼像0xA7,這些操作碼在一天之內不會由任何6502彙編器生成,但它仍然可能是有用的。處理器將所有形式爲「101001xx」的操作碼視爲從零頁面加載內容的請求。如果兩個寄存器均未設置,則讀取值將被Y寄存器鎖存。如果第一個'x'被設置,X寄存器。如果第二個,累加器。碰巧,如果兩個x都被設置(操作碼10100111),則該值被累加器和X寄存器鎖存。 – supercat

相關問題