2016-11-17 76 views
-2

我的程序輸出的編碼指令,其看起來像這樣:如何從stdin中逐行反彙編?

0x81FB4300000090 
0x69FC4300000090 
0x81FC4300000090 
0x69FD4300000090 
0x81FD4300000090 
0x69FE4300000090 
0x81FE4300000090 
0x69FF4300000090 
0x81FF4300000090 
0x00054400000090 
0x01054400000090 
0x02054400000090 
0x03054400000090 
0x08054400000090 
0x09054400000090 
0x0A054400000090 
0x0B054400000090 
0x10054400000090 
0x11054400000090 
0x12054400000090 
0x13054400000090 
0x18054400000090 
0x19054400000090 
0x1A054400000090 
0x1B054400000090 
0x20054400000090 
0x21054400000090 
0x22054400000090 
0x23054400000090 
0x28054400000090 
0x29054400000090 
0x2A054400000090 
0x2B054400000090 
0x30054400000090 
0x31054400000090 
0x32054400000090 
0x33054400000090 
0x38054400000090 
0x39054400000090 
0x3A054400000090 
0x3B054400000090 
0x40054400000090 
0x41054400000090 
0x42054400000090 
0x43054400000090 
0x44054400000090 
0x45054400000090 
0x46054400000090 
0x47054400000090 

當上述各線是獨立的指令集,並需要被拆卸爲獨立的程序。每行包含7個字節的指令。我可以直接在二進制輸出它們,***在這種情況下,每個7字節的塊需要分開拆卸。

在運行我的程序的bash腳本中,我想過濾掉包含靜態跳轉的行。

那麼,如何從stdin分別拆分每一行? (我想做點像./my_C_program | the_disassembler | grep loopne
我試過objdump,但是它拒絕使用/dev/stdin作爲輸入文件。

+0

所以我需要一行一行的反彙編和grep分別搜索每一行的方式是一樣的。 – user2284570

+0

Downvotes?爲什麼呢? – user2284570

+0

大多數x86反彙編器都需要二進制輸入,因此您可能需要將非hexdump恢復爲二進制。如果你需要將每個代碼塊分開,可能需要編寫一個shell循環,一次「讀取」一行並將其提供給反彙編程序。 –

回答

0

由於您認爲分叉每個行的速度太慢,您需要某種方式來分隔一個反彙編程序輸出流。

使用諸如xxd -r之類的東西對你的輸入進行非六進制轉儲,並通過反彙編器進行管道輸出,並將反彙編程序輸出到管道程序或其他東西中。或者只是grep-with-context:grep -C8 loopne在找到匹配項時打印8條周圍線。


爲了幫助分離輸出反饋到單獨的記錄:也許添加某種定點(如UD2指令)不會出現在任何你行的。既然你說序列可能不會在指令邊界上結束,像90 90 90 90 90 90 90 90 90 0F 0B這樣的哨兵應該安全地吸收任何額外的字節。這是9個字節的NOP,如果一個序列以查找imm32和disp32作爲尋址模式一部分的指令開始結束。 (第9個NOP是好的措施,因爲我沒有檢查0x90意味着ModRM或SIB字節)。

如果你的序列是全部相同的字節數,你可以用它來尋找地址範圍。

順便說一句,我會建議像perl這樣的事情,以便輕鬆地將多行作爲一個可以模式匹配的組。

如果你需要這樣做是有效率的,你需要確保你可以將一個反彙編器流的輸出分成單獨的塊,否則你需要在產生這些行的進程中嵌入一個反彙編器(而不是首先將它們打印爲ASCII字符串)。

沒有完全一般的方法來做到這一點,這也是快速的。你不能吃你的蛋糕,也不能吃。如果這是一個問題,您將不得不讓數字生成程序更多地瞭解x86機器代碼。


另一種選擇,我可以看到的是,以創建標記每個塊的開始符號的目標文件,但是這意味着通過彙編飼養了整個事情,把每行變成像後:

label1234: dq 0x11054400000090 

這個選項看起來不好,所以我還沒有試圖解決任何字節順序問題。 它可能會使用大量的內存,因爲大多數x86彙編程序不是一次通過的,而且可能不是用於彙編海量數據而沒有跳轉指令,這些指令需要選擇短或長的編碼。

+0

我不知道從我的程序中產生了什麼。我的目標是找到一個序列,最後一個字節不是單獨的指令..我計劃生成10TB的指令。所以我不想創建任何文件。 – user2284570

+0

@ user2284570:所以使用這個想法的前半部分,然後通過反彙編。我添加了一個更新來更詳細地解釋它。 –

+0

我認爲通過略微修改[this](http://www.capstone-engine.org/lang_c.html),應該可以通過openmp並行地進行反彙編。 – user2284570

0
time bash -c 'for i in $(cat insns.txt); do \ 
     echo ".quad $i" | \ 
     as --64 | \ 
     objdump --disassemble; \ 
    done' 

我的機器花了192ms。永遠不要以爲你知道某事太慢了。

他們是一堆nop指令,後面跟着垃圾。他們錯了嗎?以十六進制寫入時,最重要的(最後一個)字節是第一個字節。

+0

我在我的問題中寫的只是顯示輸出的樣子。實際上有10Tb的未編碼指令是這樣的。我不想'insns.txt'大到21TB。 – user2284570