彙編與反彙編之小技巧

2021-04-18 18:33:41 字數 2259 閱讀 6963

大家都知道,對於位於當前除錯目標中的指令,可以使用windbg的u命令進行反彙編。u命令的引數是要反彙編**的位址值或者符號,如果不指定,那麼windbg會使用當前程式指標暫存器所指向的**,例如:

0:001> u

ntdll!dbgbreakpoint:

7c901230 cc              int     3

7c901231 c3              ret

如果要想將彙編指令翻譯為機器碼,那麼應該使用a命令,a命令使用的引數格式與u命令相同,只不過引數的含義代表的是要產生的機器碼要存放的起始地 址。例如執行a 0x400000命令後,windbg會啟動互動式編輯提示符(input>),而後便可以輸入彙編指令,沒輸入一條後,按回車,然後可以繼續輸入 下一條,結束時直接按回車。

舉個實際的例子,啟動記事本程式,然後將windbg附加上去,此時執行u命令看到的就是上面的反彙編結果,也就是eip指向的是ntdll中的dbgbreakpoint函式,這個函式只有兩條指令。接下來執行a命令,在input提示符後輸入nop然後按回車,而後再按回車結束彙編操作。

此時再執行u ntdll!dbgbreakpoint命令,可以看到:

0:001> u

ntdll!dbgbreakpoint: 7c901230 90              nop

7c901231 c3              ret

可見本來的int 3指令被替換為nop指令(機器碼為90)了。

輸入g命令恢復記事本程式執行,然後再按ctrl+break試圖將其中斷到偵錯程式,發現不立刻反應了,這是因為遠端中斷所依賴的

ntdll!dbgbreakpoint

函式的int 3

指令被我們替換為

nop(空指令)了

。不過當windbg發現中斷操作超時後會使用掛起的方式來中斷(感興趣的讀者,可以參考《軟體除錯》的10.6.7節)。

上面是基本的反彙編和彙編用法。下面再說一種特殊的用法。

如果我們在日誌檔案或者其它環境中看到一段機器碼,那麼如何將其翻譯為彙編指令呢?u命令是不支援後面直接跟隨機器碼的。

這時一種簡單的方法就是找一段記憶體,然後將要反彙編的機器碼輸入到這段記憶體中,然後再使用u命令。**找這段記憶體呢?這段記憶體必須可以寫。通常可以 選擇棧。具體來說,先使用r命令觀察目前的棧頂位址,即esp暫存器的值。為了不破壞棧上的資料,應該使用比esp小的空閒區域。

例如:0:001> r

eax=7ffd7000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005

eip=7c901230 esp=00beffcc ebp=00befff4 iopl=0         nv up ei pl zr na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246

ntdll!dbgbreakpoint:

7c901230 90              nop

上面的esp=00beffcc,如果我們要反彙編十幾個位元組的機器碼,那麼就可以使用00beff00開始的一段,即輸入eb 00beff00,開始互動式編輯記憶體,輸入要反彙編的機器碼。

89.1e.83.c9.ff.f0.0f.c1.08.ff.75.08.e8.fd.0a.fd.ff.8b.45.08

.5e.5b.5d.c2.08.00.cc.cc.cc.cc.cc.

輸入結束後,再執行u 00beff00

0:001> u 00beff00 00beff00 891e            mov     dword ptr [esi],ebx

00beff02 83c9ff          or      ecx,0ffffffffh

00beff05 f00fc108        lock xadd dword ptr [eax],ecx

00beff09 ff7508          push    dword ptr [ebp+8]

00beff0c e8fd0afdff      call    00bc0a0e

00beff11 8b4508          mov     eax,dword ptr [ebp+8]

00beff14 5e              pop     esi

00beff15 5b              pop     ebx

反彙編 迴圈

includeint main 00401010 55 push ebp 00401011 8bec mov ebp,esp 00401013 83ec 44 sub esp,44 00401016 53 push ebx 00401017 56 push esi 00401018 57 push ...

反彙編簡介

在傳統的軟體開發模型中,程式設計師使用編譯器 彙編器 鏈結器中的乙個或者幾個建立可執行程式,為了回溯程式設計過程,可以使用各種工具來撤銷彙編和編譯過程,這些工具就叫做反彙編器和反編譯器。反彙編器 以機器語言作為輸入,得到組合語言形式的輸出結果 反編譯器 以機器語言作為輸入,得到高階語言形式的輸出結果...

你知道彙編與反彙編的區別嗎?

本人不才,小白一枚,今天在看書的過程中被彙編 反彙編這兩個詞搞懵了。趕緊用了搜dog,發現講的都不是很清楚,這裡說一下我的總結。有什麼不對的大家見諒。彙編 反彙編這兩個詞可做動詞,可做名詞。我們先看乙個圖,乙個c程式如何變成乙個可執行程式。ps 這個圖主要為下面講解用,具體不再講解,感興趣的自行查詢...