什麼是寄存器,有什麼作用?
寄存器用來做什麼,什麼是寄存器? 處理器在執行程序時需要一個助手。當執行一條指令時,例如将兩個内存單元中存放的内容
相加,處理器需要先把其中一個的内容置入寄存器,然後再把另一個内容置入,這是使用寄存器的一個例子(注 1)。
ESP 指向堆棧最頂端的地址,現在來看一下這個“登錄程序.exe”(注 2)。
ESP 為 19FF74,如果你看一下 OllyDbg 的堆棧窗口,
我們看到寄存器顯示了在我們的堆棧最上方的值,打個比方,它就是一堆信件最上方的那一封。
EIP——另一個非常重要的寄存器,它指向當前将要執行的指令。
我們在下面截圖中看到 Crack Me 第一條将執行的指令的地址為 449DOD,很明顯,這正是 EIP所指向的值。
如果你按下 F7,那麼将執行第一條指令,然後切到第二條将執行的指令。
EIP 現在為 449DOE,在反彙編窗口第一條指令已經走過,現在位于第二條上。
其它寄存器包含有不同的值來為幫助處理器執行指令提供服務。
記住 OllyDbg 在哪裡顯示這些寄存器。
在這裡,顯示有 EAX,ECX,,EDX,,EBX, ESP, EBP,,ESI,,EDI 和 EIP 等
它們都被稱為 32 位寄存器。
在 OllyDbg 中,它們的内容以十六進制顯示。例如,EAX 的最小值為 00000000,最大值為 FFFFFFFF,用二進制表示将是 11111111111111111111111111111111
我們看到它為 32 位,每一位可被設為 0 或 1,所以這些寄存器被稱為是 32 位的。
你可以在彙編語言教材中查閱參考這些 32 位寄存器。
現在,在 OllyDbg 中完成一個使用寄存器的例子,來獲得一些實踐經驗。
打開 OllyDbg,加載“登錄程序.exe”(也可以加載其它的程序)。把 EAX 更改為我們需要的值,這裡 假如為 12345678
在打開的窗口的 十六進制(英文版OD:Hexadecimal)處填入 12345678。
然後點擊“确定”(英文版OD:OK)
現在 EAX 變為了我們的期望值,OllyDbg 将變化的值用紅色高亮顯示。
如果你要用到 EAX 寄存器的一部分,在這個例子中,AX 是 EAX 的一部分,是 16 位寄存器, 例如,在上述例子中,它的值為 5678,我們在命令欄(Command Bar) 中進行輸入也可以看到。
? AX(問号也可用于查詢寄存器的值)
看到了 5678,AX 包含的值為 EAX 的後 4 位數字。還可繼續分為 AL 和 AH(注:16 位寄存 器 AX 的低八位和高八位),它們的值在 OllyDbg 中同樣能夠觀察到。
? AL
? AH
或者這樣更直觀,如果 EAX = 12345678,那麼 AX 就是它的後四位數字。
同樣的,EBX 可被分為 BX,BL 和 BH。幾乎所有其它寄存器都可以如此分割(注 3)。
如何更改寄存器的值
我們已經看到了,OllyDbg 可以更改寄存器的值。我們在 EAX 上進行的一切操作同樣适用于 其它寄存器:檢查寄存器,看哪一個是你想要更改的,然後右鍵點擊它選擇 Modify。但 EIP 是唯一一個例外的,它指向下一條将要執行的指令。
要改變頭的值,需要如下操作。
EIP 指向将要執行的指令,隻需簡單地在反彙編窗口中選擇新的指令起始點
一旦選擇,例如 449DD0,在其上點擊鼠标右鍵,選擇 New origin here(漢化版翻譯為:此
處為新的 EIP),EIP 就會改變為 449DD0,這樣,程序就将會從這條指令執行。
在這裡你會看到,EIP 指向了 449DD0.
什麼是标志寄存器
就像我們在第一章看到的,在 OllyDbg 寄存器信息的下方顯示的就是标志寄存器。
我們看到,這裡的标志分為 C,P,A,Z,S,T,D 和 O。 我們還看到,它們隻能是兩個數字值,0 和 1。某一具體指令的執行可以改變它們的含義。
我們一起來看看這些标志:
1) O 标志(溢出标志)
溢出标志在當操作改變了符号位,返回錯誤值時被設置(譯注 4)。 看一下以下在 OllyDbg 中的例子,同樣使用 CrueHead'a 的 CrackMe。
我們按照前面講述的方法将 EAX 的值改為 7FFFFFFF,即最大的正數。
現在使其加 1,其和将超過最大正數,我們還知道,80000000 對應的是一個負數。 這需要打開一個能夠寫入指令的對話框(譯注:本例中請在反彙編窗口的 00449DD0 指令上 按空格鍵,或在反彙編代碼那一列的指令上雙擊)。
在裡面寫入:ADD EAX,1。
寫完後點擊 Assemble(彙編),就可以看到原來在00449DD0 處的指令變為了我們輸入的指令。
ADD EAX,1,執行這條指令會發生什麼?它将 EAX 加 1,并将值返回到 EAX。 F7 将完成這條指令,O 标志現在等于 0
在 F7 後,看看發生了什麼,EAX 變為 80000000,其數字符号更改。
O 标志被設置為 1,該标志的目的:當指令的結果超出了它可能存取的最大值,将被設置.
2) A 标志(輔助進位标志)
完成操作後,用其它的某種形式對其進行記錄。目前我們不需要關心此标志。
3) P 标志(奇偶标志)
如果指令的結果用二進制表示,該二進制數中的的 1 的總個數為偶數時,P 标志被設置。例 如:1010,1100,1111000.
為做個試驗,我們已經在 OllyDbg 中設置了指令:ADD EAX,1(注 5),再一次執行該操 作。選擇 401000 行,右鍵點擊選擇 New origin here(此處為新EIP),如果按下 F7,将執行該指令。
現在,EAX 中包含的值為 00000000,P 标志等于 1,(這裡是先前指令的結果),讓我們看一 下,當向 EAX 中加入 1 時發生了什麼。
按下 F7
我們看到,P 标志變為了 0,EAX 中值用二進制表示為 1,其二進制格式含有 1 的個數是一 個,是奇數。
再次返回,選擇 ADD EAX,1 這行,右鍵點擊該行,選擇 New origin here,按 F7,再次加 1。
我們看到,EAX 先前為 1,現在為 2,其二進制為 10,1 的個數為奇數,P 标志未被設置。
重複上述操作,再加 1,
4) Z 标志(零标志)
這是在 Cracking 過程中最著名最有用的一個标志。當運算産生的結果為 0 時被設置。
讓我們返回到 401000 處的指令:ADD EAX,1。右鍵點擊 New origin here(此處為新EIP),先設置 EAX 的 值為 FFFFFFFF,即十進制-1,當按下 F7 運行指令 ADD EAX,1 使,結果為-1 1,等于 0,零
标志被設置。
我們看到按下 F7 後,EAX 的值為 0,所以,如果操作的結果為 0,Z 标志被設置為 1。
我想現在應該清楚了,當指令的結果為 0 時,該标志被設置。
5) S 标志(符号标志)
這個标志在運算結果為負時設置為 1。來看一下它是如何運作的,改變 EAX 的數值為 FFFFFFF8, 它等于十進制-8
再次按上述操作選擇 New origin here,然後 F7 再次執行 ADD EAX,1。結果為 FFFFFFF9,等于十進制-7,是個負數,所以符号标志位被設置。
按 F7 執行指令,S 标志位被設置,标志位為 1,很清楚:負結果導緻 S 标志被設置。
6) C 标志進位标志
(無符号運算的結果)在超過最大數值時設置,可能是寄存器的值,例如,将 EAX 設為
FFFFFFFF,然後加 1,我們會看到,進位标志位設為 1.
7) T,D 标志和其它
我現在還不打算解釋它們的用途,這是一個相對複雜的話題。我們對它們也不太感興趣。所 以目前可以先着手相對更簡單問題,此話題将留到以後探讨。
這樣,我們已經對寄存器和标志位有了一定的理解。接下來,你可以逐個回顧一下其它指令,
盡管到現在為止,我們僅看到了一個指令:ADD
如果看完本文後,你還存有疑惑,請用指令 ADD EAX,1 跟随本文的操作(以改變标志位的 值)來進行實踐。
對基礎知識的深刻理解是非常重要的,所以請不要倦于實踐操作,對待本文同樣如此。
注 1
寄存器是 CPU 内部的高速存儲單元,訪問速度比常規内存快很多。
注 2
此 登錄 仍然來自第二章,因本章講述的是寄存器基礎知識,所以您可以用其它程序代替。此文件随本文附帶。
注 3
僅用于 EAX,EBX,ECX,EDX,其它寄存器可含有低 16 位寄存器,但不能進一步再分。
注 4
标志被設置,意思是說使其等于 1,被清除,則使其等于 0。
注 5
1. 更改寄存器 EAX 為 00000000。
2. 将 4010000 處改為 ADD EAX,1。
注 6
下一章使用新的程序。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!