tft每日頭條

 > 生活

 > 寄存器向右移的原理

寄存器向右移的原理

生活 更新时间:2025-01-21 15:39:45

什麼是寄存器,有什麼作用?

寄存器用來做什麼,什麼是寄存器? 處理器在執行程序時需要一個助手。當執行一條指令時,例如将兩個内存單元中存放的内容

相加,處理器需要先把其中一個的内容置入寄存器,然後再把另一個内容置入,這是使用寄存器的一個例子(注 1)。

ESP 指向堆棧最頂端的地址,現在來看一下這個“登錄程序.exe”(注 2)。

寄存器向右移的原理(從零開始學逆向)1

ESP 為 19FF74,如果你看一下 OllyDbg 的堆棧窗口,

寄存器向右移的原理(從零開始學逆向)2

我們看到寄存器顯示了在我們的堆棧最上方的值,打個比方,它就是一堆信件最上方的那一封。

EIP——另一個非常重要的寄存器,它指向當前将要執行的指令。

寄存器向右移的原理(從零開始學逆向)3

我們在下面截圖中看到 Crack Me 第一條将執行的指令的地址為 449DOD,很明顯,這正是 EIP所指向的值。

如果你按下 F7,那麼将執行第一條指令,然後切到第二條将執行的指令。

寄存器向右移的原理(從零開始學逆向)4

EIP 現在為 449DOE,在反彙編窗口第一條指令已經走過,現在位于第二條上。

寄存器向右移的原理(從零開始學逆向)5

其它寄存器包含有不同的值來為幫助處理器執行指令提供服務。

記住 OllyDbg 在哪裡顯示這些寄存器。

寄存器向右移的原理(從零開始學逆向)6

在這裡,顯示有 EAX,ECX,,EDX,,EBX, ESP, EBP,,ESI,,EDI 和 EIP 等

它們都被稱為 32 位寄存器。

在 OllyDbg 中,它們的内容以十六進制顯示。例如,EAX 的最小值為 00000000,最大值為 FFFFFFFF,用二進制表示将是 11111111111111111111111111111111

寄存器向右移的原理(從零開始學逆向)7

我們看到它為 32 位,每一位可被設為 0 或 1,所以這些寄存器被稱為是 32 位的。

你可以在彙編語言教材中查閱參考這些 32 位寄存器。

現在,在 OllyDbg 中完成一個使用寄存器的例子,來獲得一些實踐經驗。

打開 OllyDbg,加載“登錄程序.exe”(也可以加載其它的程序)。把 EAX 更改為我們需要的值,這裡 假如為 12345678

寄存器向右移的原理(從零開始學逆向)8

在打開的窗口的 十六進制(英文版OD:Hexadecimal)處填入 12345678。

寄存器向右移的原理(從零開始學逆向)9

然後點擊“确定”(英文版OD:OK)

寄存器向右移的原理(從零開始學逆向)10

現在 EAX 變為了我們的期望值,OllyDbg 将變化的值用紅色高亮顯示。

如果你要用到 EAX 寄存器的一部分,在這個例子中,AX 是 EAX 的一部分,是 16 位寄存器, 例如,在上述例子中,它的值為 5678,我們在命令欄(Command Bar) 中進行輸入也可以看到。

? AX(問号也可用于查詢寄存器的值)

寄存器向右移的原理(從零開始學逆向)11

看到了 5678,AX 包含的值為 EAX 的後 4 位數字。還可繼續分為 AL 和 AH(注:16 位寄存 器 AX 的低八位和高八位),它們的值在 OllyDbg 中同樣能夠觀察到。

? AL

寄存器向右移的原理(從零開始學逆向)12

? AH

寄存器向右移的原理(從零開始學逆向)13

或者這樣更直觀,如果 EAX = 12345678,那麼 AX 就是它的後四位數字。

寄存器向右移的原理(從零開始學逆向)14

寄存器向右移的原理(從零開始學逆向)15

同樣的,EBX 可被分為 BX,BL 和 BH。幾乎所有其它寄存器都可以如此分割(注 3)。

如何更改寄存器的值

我們已經看到了,OllyDbg 可以更改寄存器的值。我們在 EAX 上進行的一切操作同樣适用于 其它寄存器:檢查寄存器,看哪一個是你想要更改的,然後右鍵點擊它選擇 Modify。但 EIP 是唯一一個例外的,它指向下一條将要執行的指令。

要改變頭的值,需要如下操作。

EIP 指向将要執行的指令,隻需簡單地在反彙編窗口中選擇新的指令起始點

寄存器向右移的原理(從零開始學逆向)16

一旦選擇,例如 449DD0,在其上點擊鼠标右鍵,選擇 New origin here(漢化版翻譯為:此

處為新的 EIP),EIP 就會改變為 449DD0,這樣,程序就将會從這條指令執行。

寄存器向右移的原理(從零開始學逆向)17

在這裡你會看到,EIP 指向了 449DD0.

寄存器向右移的原理(從零開始學逆向)18

什麼是标志寄存器

就像我們在第一章看到的,在 OllyDbg 寄存器信息的下方顯示的就是标志寄存器。

寄存器向右移的原理(從零開始學逆向)19

我們看到,這裡的标志分為 C,P,A,Z,S,T,D 和 O。 我們還看到,它們隻能是兩個數字值,0 和 1。某一具體指令的執行可以改變它們的含義。

我們一起來看看這些标志:

1) O 标志(溢出标志)

溢出标志在當操作改變了符号位,返回錯誤值時被設置(譯注 4)。 看一下以下在 OllyDbg 中的例子,同樣使用 CrueHead'a 的 CrackMe。

我們按照前面講述的方法将 EAX 的值改為 7FFFFFFF,即最大的正數。

寄存器向右移的原理(從零開始學逆向)20

現在使其加 1,其和将超過最大正數,我們還知道,80000000 對應的是一個負數。 這需要打開一個能夠寫入指令的對話框(譯注:本例中請在反彙編窗口的 00449DD0 指令上 按空格鍵,或在反彙編代碼那一列的指令上雙擊)。

在裡面寫入:ADD EAX,1。

寄存器向右移的原理(從零開始學逆向)21

寫完後點擊 Assemble(彙編),就可以看到原來在00449DD0 處的指令變為了我們輸入的指令。

寄存器向右移的原理(從零開始學逆向)22

ADD EAX,1,執行這條指令會發生什麼?它将 EAX 加 1,并将值返回到 EAX。 F7 将完成這條指令,O 标志現在等于 0

寄存器向右移的原理(從零開始學逆向)23

在 F7 後,看看發生了什麼,EAX 變為 80000000,其數字符号更改。

寄存器向右移的原理(從零開始學逆向)24

O 标志被設置為 1,該标志的目的:當指令的結果超出了它可能存取的最大值,将被設置.

2) A 标志(輔助進位标志)

完成操作後,用其它的某種形式對其進行記錄。目前我們不需要關心此标志。

3) P 标志(奇偶标志)

如果指令的結果用二進制表示,該二進制數中的的 1 的總個數為偶數時,P 标志被設置。例 如:1010,1100,1111000.

為做個試驗,我們已經在 OllyDbg 中設置了指令:ADD EAX,1(注 5),再一次執行該操 作。選擇 401000 行,右鍵點擊選擇 New origin here(此處為新EIP),如果按下 F7,将執行該指令。

寄存器向右移的原理(從零開始學逆向)25

現在,EAX 中包含的值為 00000000,P 标志等于 1,(這裡是先前指令的結果),讓我們看一 下,當向 EAX 中加入 1 時發生了什麼。

按下 F7

寄存器向右移的原理(從零開始學逆向)26

我們看到,P 标志變為了 0,EAX 中值用二進制表示為 1,其二進制格式含有 1 的個數是一 個,是奇數。

再次返回,選擇 ADD EAX,1 這行,右鍵點擊該行,選擇 New origin here,按 F7,再次加 1。

寄存器向右移的原理(從零開始學逆向)27

我們看到,EAX 先前為 1,現在為 2,其二進制為 10,1 的個數為奇數,P 标志未被設置。

重複上述操作,再加 1,

寄存器向右移的原理(從零開始學逆向)28

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。

寄存器向右移的原理(從零開始學逆向)29

寄存器向右移的原理(從零開始學逆向)30

我想現在應該清楚了,當指令的結果為 0 時,該标志被設置。

5) S 标志(符号标志)

這個标志在運算結果為負時設置為 1。來看一下它是如何運作的,改變 EAX 的數值為 FFFFFFF8, 它等于十進制-8

寄存器向右移的原理(從零開始學逆向)31

再次按上述操作選擇 New origin here,然後 F7 再次執行 ADD EAX,1。結果為 FFFFFFF9,等于十進制-7,是個負數,所以符号标志位被設置。

寄存器向右移的原理(從零開始學逆向)32

按 F7 執行指令,S 标志位被設置,标志位為 1,很清楚:負結果導緻 S 标志被設置。

6) C 标志進位标志

(無符号運算的結果)在超過最大數值時設置,可能是寄存器的值,例如,将 EAX 設為

FFFFFFFF,然後加 1,我們會看到,進位标志位設為 1.

寄存器向右移的原理(從零開始學逆向)33

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved