破解入門(一)-----常用暫存器
1 CPU構成
CPU大體上可以分成以下三部分
(1) 算術邏輯部分ALU(arithmetic logic unit),用來進行算術和邏輯運算
(2) 控制邏輯。
(3) 工作暫存器,每個暫存器相當於運算器中的一個儲存單元,但它存取速度快。用來存放運算過程中的需要或得到的各種資訊,包括運算元地址、運算元及運算的中間結果。
2 計算機中資料儲存方式
在計算機中,一個二進位制數佔用一位,八位是一個位元組。
在計算機記憶體中,就是以位元組為單位來儲存資訊的。計算機給每一個位元組單元分配一個唯一的儲存器地址,稱為實體地址。當需要訪問相應的記憶體的資料時,就是通過這個地址。
一個二進位制可以表達所有的ASCII,即一個記憶體單元可以儲存一個英文字元或數字等。而中文要用Unicode表示,也就是需要兩個位元組單元才能裝一個漢字。
十六位就是兩個位元組,才能裝一個漢字。三十二位能裝兩個漢字叫做雙字。六十四位能裝四個漢字叫做四字。
3 基本暫存器
3.1通用暫存器(32位)
通用暫存器一共有八個:EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI
其中EAX、EBX、ECX、EDX稱為資料暫存器,用於存放計算過程中所用運算元、結果或其他資訊。除了直接訪問外,還可分別對其高十六位和低十六位,它們的低十六位就是把它們前邊兒的E
高16位
EAX 高8位(AH)
低16位(AX)
低8位(AL)
則操作32位數時可用:MOV EAX
則操作16位數時可用:MOV AX
則操作8位數時可用: MOV AH / MOV AL
備註:從386以後,所有暫存器都可以用來儲存記憶體地址。在破解的時候是不是看到過[EBX]這樣的形式呢?這就是說此時EBX中裝的是一個記憶體地址,而真正要訪問的,就是那那個記憶體單元中所儲存的值。
ESP、EBP、EDI、ESI四個暫存器
ESP稱為堆疊指標寄存器。堆疊是以“後進先出”方式工作的一個儲存區,它必須存在於堆疊段中,因而其段地址存放於SS暫存器中。它只有一個出入口,所以只有一個堆疊指標暫存器。ESP的內容在任何時候都指向當前的棧頂。
當向堆疊中壓入資料時,ESP會向上移動,使用PUSH指令,ESP變化為:ESP - 資料位數。
當向堆疊中壓出資料時,ESP會向下移動,使用POP指令,ESP變化為:ESP + 資料位數
EBP,它稱為基址指標暫存器,它們都可以與堆疊段暫存器SS聯用來確定堆疊中的某一儲存單元的地址,ESP用來指示段頂的偏移地址,而EBP可作為堆疊區中的一個基地址以便訪問堆疊中的資訊。
ESI(源變址暫存器)和EDI(目的變址暫存器)一般與資料段暫存器DS聯用,用來確定資料段中某一儲存單元的地址。這兩個變址暫存器有自動增量和自動減量的功能,可以很方便地用於變址。在串處理指令中,ESI和EDI作為隱含的源變址和目的變址暫存器時,ESI和DS聯用,EDI和附加段ES聯用,分別達到在資料段和附加段中定址的目的。
3.2 專用暫存器
專用暫存器,有兩個,一個是EIP,一個是FLAGS。
EIP算是所有暫存器中最重要的一個了。它的意思就是指令指標暫存器,它用來存放程式碼段中的偏移地址。在程式執行的過程中,它始終指向下一條指令的首地址。它與段暫存器CS聯用確定下一條指令的實體地址。當這一地址送到儲存器後,控制器可以取得下一條要執行的指令,而控制器一旦取得這條指令就馬上修改EIP的內容,使它始終指向下一條指令的首地址。可見,計算機就是用EIP暫存器來控制指令序列的執行流程的。 那些跳轉指令,就是通過修改EIP的值來達到相應的目的的。
FLAGS,標誌暫存器,又稱PSW(program status word),即程式狀態暫存器。這一個是存放條件標誌碼、控制標誌和系統標誌的暫存器。
下面有個例子
Cmp EAX,EBX ;用EAX與EBX相減
JNZ 00470395 ;不相等的話,就跳到這裡;
這兩條指令很簡單,就是用EAX暫存器裝的數減去EBX暫存器中裝的數。來比較這兩個數是不是相等,當Cmp指令執行過後,就會在FLAGS的ZF(zero flag)零標誌位上置相應值,如果結果為0,也就是他們兩個相等的話,ZF置1,否則置0。其它還有OF(溢位標誌)SF(符號標誌)CF(進位標誌)AF(輔助進位標誌)PF(奇偶標誌)等。
3.3 段暫存器
段暫存器一共六個,分別是CS程式碼段,DS資料段,ES附加段,SS堆疊段,FS以及GS這兩個還是附加段。