OllyDbg完全教程 示例 不完整

2021-04-07 12:30:20 字數 3466 閱讀 4536

不幸的是,您不能通過這種方式除錯ollydbg的外掛程式,外掛程式關聯到ollydbg.exe檔案,windows系統不能在同乙個應用程式裡載入並執行兩個可執行檔案。

解碼提示[decoding hints]

在某些情況下,分析器不能區分**和資料。讓我們看看下面的例子:

const char s[11] = "0123456789";

...for (i=0x30; i<0x3a; i++) t[i-0x30]=s[i-0x30];

好的編譯器將會將上面的**優化成如下樣子: e

for (i=0x30; i<0x3a; i++) (t-0x30)=(s-0x30);

這裡t-0x30 和 s-0x30 都是常量,並編譯成如下形式:

mov al,[byte s_minus_30+ebx]

mov [byte t_minus_30+ebx],al

編譯器也可能將常量字串"0123456789"插入到執行**中。在1.10版本中,我打算用暫存器的值來決定是否的資料或**。當遇到上面的命令,分析器將假定位址

s_minus_30處包含字元資料。但事實上,可能那裡是**。

萬一出現上述問題,我們應該怎麼辦呢?有兩種辦法:最快最笨的辦法是:將分析錯誤的部分刪除(快捷鍵:退格鍵),這樣ollydbg將使用預設的反彙編器進行解碼。

更好的辦法是使用解碼提示[decoding hints]。您可以告訴ollydbg如何解釋選中的記憶體內容。這種方法在重新分析(ctrl+a)時,解釋依然有效。

設定提示的方法:在反彙編視窗中,選中需要修正提示的**或資料,然後在快捷選單中選擇 分析[analysis]|在下次分析時,將選擇部分視為[during next analysis, treat selection as]。選擇以下選項之一:

命令[command] - 第乙個被選中的位元組開始的有效命令。這條命令,還有所有後面的部分,直到有jump或return命令出現,以及含有jump或call命令所到達位置的部分,都會被視為命令;

位元組[byte],

字[word],

雙字[doubleword] - 選中的前1、2、4位元組視為對應大小的資料;

所有選中命令[commands] - 全部選中部分(直到第乙個無效命令)和可以到達由有效命令集組成的目的位址;

位元組[bytes],

字[words],

雙字[doublewords], - 全部選中部分以1、2、或 4位元組分組;

ascii字串[ascii text],

unicode字串[unicode text] - 全部選中部分為ascii 或 unicode 字串;

預設(移除提示)[default (remove hints)] - 從選中部分中移除全面提示;

移除全部提示[remove all hints] - 從全部模組中移除解碼提示。

ollydbg 儲存提示到.udd檔案中。

表示式賦值[evaluation of expressions]

[code]

ollydbg能夠支援非常複雜的表示式。表示式的語法格式將在這個主題的後面進行介紹,但我想您對此不一定真的感興趣。那麼我先舉幾個例項來說明:

10 - 常量 0x10 (無符號)。所有整數常量都認為是十六進製制的,除非後面跟了點;

10. - 十進位制常量10(帶符號);

'a' - 字元常量 0x41;

eax - 暫存器eax的內容,解釋為無符號數;

eax. -暫存器eax的內容,解釋為帶符號數;

[123456] - 在位址123456處的無符號雙字內容。預設情況,ollydbg假定是雙字長運算元;

dword ptr [123456] - 同上。關鍵字 ptr 可選;

[signed byte 123456] - 在位址123456處帶符號單位元組。ollydbg支援類ma**和類ideal兩種記憶體表示式;

string [123456] - 以位址123456作為開始,以零作為結尾的ascii字串。中括號是必須的,因為您要顯示記憶體的內容;

[[123456]] - 在位址123456處儲存的雙字所指向的位址內的雙字內容;

2+3*4 - 值為14。ollydbg 按標準c語言的優先順序進行算術執行;

(2+3)*4 - 值為20。使用括號改變運算順序。

eax.<0. - 如果eax在0到0x7fffffff之間,則值為0,否則值為1。注意0也是有符號的。當帶符號數與無符號數比較時,ollydbg會將帶符號數轉成無符號數。

eax<0 - 總為0(假),因為無符號數永遠是正的。

msg==111 - 如果訊息為wm_command,則為真。0x0111是命令 wm_command 的數值。msg只能用於設定在程序訊息函式的條件斷點內。

[string 123456]=="brown fox" - 如果從位址0x00123456開始的記憶體為ascii字串"brown fox"、"brown fox jumps"、 "brown fox???",或類似的串,那麼其值為1。比較不區分大小寫和文字長度。

eax=="brown fox" - 同上,eax按指標對待。

unicode [eax]=="brown fox" - ollydbg認為eax是乙個指向unicode串的指標,並將其轉換為ascii,然後與文字常量進行比較。

[esp+8]==wm_paint - i在表示式中您可以使用上百種windows api符號常量。

([byte esi+dword ds:[450000+15*(eax-1)]] & 0f0)!=0 - 這絕對是個有效的表示式。

現在我們介紹語法格式。在大括號({})內的每個元素都只能出現一次,括號內的元素順序可以交換:

表示式 = 記憶體中間碼|記憶體中間碼《二元操作符》記憶體中間碼

記憶體中間碼 = 中間碼| [表示式 ]

中間碼 = (表示式)| 一元操作符 記憶體中間碼 | 帶符號暫存器 | 暫存器 | fpu暫存器 | 段暫存器 | 整型常量 | 浮點常量 | 串常量 | 引數 | 偽變數

一元操作符 = ! | ~ | + |

帶符號暫存器 = 暫存器.

暫存器 = al | bl | cl ... | ax | bx | cx ... | eax | ebx | ecx ...

fpu暫存器 = st | st0 | st1 ...

段暫存器 = cs | ds | es | ss | fs | gs

整型常量 = 《十進位制常量》. | 《十六進製制常量》 | 《字元常量》 | >

4 比較 < <= > >=

5 比較 == !=

6 按位與 &

7 按位異或 ^

8 按位或 |

9 邏輯與 &&

10 邏輯或 ||

在計算時,中間結果以 dword 或 float10 形式儲存。某些型別組合和操作是不允許的。例如:qwodrd 型別只能顯示;string 和 unicode 只能進行加減操作(像c語言裡的指標)以及與 string、unicode 型別或串常量進行比較操作;您不能按位移動 浮點[float] 型別,等等。

不完全型別

c 允許在乙個 檔案中存放多個類,但這樣往往不便於類的管理,所以一向是提倡乙個檔案中只存放乙個類。不過呢,隨著類規模的不斷膨脹,乙個檔案中存放乙個類也有些顯得臃腫,或者是在某個角度上不便於 的組織。因此,c 2.0中引入了不完全型別的概念,即啟用了新的修飾符partial。借助該修飾符,我們可以在多...

不完全型別

不完全型別指 函式之外 型別的大小不能被確定的型別 總結一下,c的型別分為 結構體的宣告就是乙個不完全型別的典型例子。struct woman tag struct man tag struct woman tag 這樣是沒問題的。如果將man tag結構中的struct woman tag wif...

不完全型別

有時候我們在一些編譯器寫 的時候會碰見不完全型別這個編譯錯誤,那麼什麼是不完全型別,為啥會出現呢 不完全型別指 函式之外 型別的大小不能被確定的型別 只能以有限方式使用。不能定義該型別的物件。不完全型別只能用於定義指向該型別的指標及引用 1 或者用於宣告使用該型別作為形參型別或者返回值型別。c的型別...