1 CPU構(gòu)成
CPU大體上可以分成以下三部分
(1) 算術(shù)邏輯部分ALU(arithmetic logic unit)炭懊,用來(lái)進(jìn)行算術(shù)和邏輯運(yùn)算
(2) 控制邏輯。
(3) 工作寄存器逐哈,每個(gè)寄存器相當(dāng)于運(yùn)算器中的一個(gè)存儲(chǔ)單元,但它存取速度快问顷。用來(lái)存放運(yùn)算過(guò)程中的需要或得到的各種信息鞠眉,包括操作數(shù)地址、操作數(shù)及運(yùn)算的中間結(jié)果择诈。
2?計(jì)算機(jī)中數(shù)據(jù)存儲(chǔ)方式
? ?? ???在計(jì)算機(jī)中械蹋,一個(gè)二進(jìn)制數(shù)占用一位,八位是一個(gè)字節(jié)羞芍。
? ?? ???在計(jì)算機(jī)內(nèi)存中哗戈,就是以字節(jié)為單位來(lái)存儲(chǔ)信息的。計(jì)算機(jī)給每一個(gè)字節(jié)單元分配一個(gè)唯一的存儲(chǔ)器地址荷科,稱(chēng)為物理地址唯咬。當(dāng)需要訪問(wèn)相應(yīng)的內(nèi)存的數(shù)據(jù)時(shí)纱注,就是通過(guò)這個(gè)地址。
一個(gè)二進(jìn)制可以表達(dá)所有的ASCII胆胰,即一個(gè)內(nèi)存單元可以存儲(chǔ)一個(gè)英文字符或數(shù)字等狞贱。而中文要用Unicode表示,也就是需要兩個(gè)字節(jié)單元才能裝一個(gè)漢字蜀涨。
? ?? ???十六位就是兩個(gè)字節(jié)瞎嬉,才能裝一個(gè)漢字。三十二位能裝兩個(gè)漢字叫做雙字厚柳。六十四位能裝四個(gè)漢字叫做四字氧枣。
3?基本寄存器
3.1通用寄存器(32位)
? ?? ???通用寄存器一共有八個(gè):EAX、EBX别垮、ECX便监、EDX、ESP碳想、EBP烧董、EDI、ESI
? ?? ???其中EAX胧奔、EBX解藻、ECX、EDX稱(chēng)為數(shù)據(jù)寄存器葡盗,用于存放計(jì)算過(guò)程中所用操作數(shù)螟左、結(jié)果或其他信息。除了直接訪問(wèn)外觅够,還可分別對(duì)其高十六位和低十六位胶背,它們的低十六位就是把它們前邊兒的E去掉,即EAX的低十六位就是AX喘先。而且它們的低十六位又可以分別進(jìn)行八位訪問(wèn)钳吟,也就是說(shuō),AX還可以再進(jìn)行分解窘拯,即AX還可分為AH(高八位)AL(低八位)红且。
高16位
EAX 高8位(AH)
低16位(AX)
低8位(AL)
則操作32位數(shù)時(shí)可用:MOV EAX
則操作16位數(shù)時(shí)可用:MOV AX
則操作8位數(shù)時(shí)可用: MOV AH / MOV AL
備注:從386以后,所有寄存器都可以用來(lái)存儲(chǔ)內(nèi)存地址涤姊。在破解的時(shí)候是不是看到過(guò)[EBX]這樣的形式呢暇番?這就是說(shuō)此時(shí)EBX中裝的是一個(gè)內(nèi)存地址,而真正要訪問(wèn)的思喊,就是那那個(gè)內(nèi)存單元中所存儲(chǔ)的值壁酬。
? ?? ???ESP、EBP、EDI舆乔、ESI四個(gè)寄存器主要用途就是在存儲(chǔ)器尋址時(shí)岳服,提供偏移地址。因此希俩,它們可以稱(chēng)為指針或變址寄存器吊宋。
? ?? ???ESP稱(chēng)為堆棧指針寄存器。堆棧是以“后進(jìn)先出”方式工作的一個(gè)存儲(chǔ)區(qū)颜武,它必須存在于堆棧段中璃搜,因而其段地址存放于SS寄存器中。它只有一個(gè)出入口盒刚,所以只有一個(gè)堆棧指針寄存器腺劣。ESP的內(nèi)容在任何時(shí)候都指向當(dāng)前的棧頂绿贞。
當(dāng)向堆棧中壓入數(shù)據(jù)時(shí)因块,ESP會(huì)向上移動(dòng),使用PUSH指令籍铁,ESP變化為:ESP - 數(shù)據(jù)位數(shù)涡上。
當(dāng)向堆棧中壓出數(shù)據(jù)時(shí),ESP會(huì)向下移動(dòng)拒名,使用POP指令吩愧,ESP變化為:ESP + 數(shù)據(jù)位數(shù)
EBP,它稱(chēng)為基址指針寄存器增显,它們都可以與堆棧段寄存器SS聯(lián)用來(lái)確定堆棧中的某一存儲(chǔ)單元的地址雁佳,ESP用來(lái)指示段頂?shù)钠频刂罚鳨BP可作為堆棧區(qū)中的一個(gè)基地址以便訪問(wèn)堆棧中的信息同云。
ESI(源變址寄存器)和EDI(目的變址寄存器)一般與數(shù)據(jù)段寄存器DS聯(lián)用糖权,用來(lái)確定數(shù)據(jù)段中某一存儲(chǔ)單元的地址。這兩個(gè)變址寄存器有自動(dòng)增量和自動(dòng)減量的功能炸站,可以很方便地用于變址星澳。在串處理指令中,ESI和EDI作為隱含的源變址和目的變址寄存器時(shí)旱易,ESI和DS聯(lián)用禁偎,EDI和附加段ES聯(lián)用,分別達(dá)到在數(shù)據(jù)段和附加段中尋址的目的阀坏。
3.2?專(zhuān)用寄存器
? ?? ???專(zhuān)用寄存器如暖,有兩個(gè),一個(gè)是EIP忌堂,一個(gè)是FLAGS装处。
? ?? ???EIP算是所有寄存器中最重要的一個(gè)了。它的意思就是指令指針寄存器,它用來(lái)存放代碼段中的偏移地址妄迁。在程序運(yùn)行的過(guò)程中寝蹈,它始終指向下一條指令的首地址。它與段寄存器CS聯(lián)用確定下一條指令的物理地址登淘。當(dāng)這一地址送到存儲(chǔ)器后箫老,控制器可以取得下一條要執(zhí)行的指令,而控制器一旦取得這條指令就馬上修改EIP的內(nèi)容黔州,使它始終指向下一條指令的首地址耍鬓。可見(jiàn)流妻,計(jì)算機(jī)就是用EIP寄存器來(lái)控制指令序列的執(zhí)行流程的牲蜀。 那些跳轉(zhuǎn)指令,就是通過(guò)修改EIP的值來(lái)達(dá)到相應(yīng)的目的的绅这。
FLAGS涣达,標(biāo)志寄存器,又稱(chēng)PSW(program status word)证薇,即程序狀態(tài)寄存器度苔。這一個(gè)是存放條件標(biāo)志碼、控制標(biāo)志和系統(tǒng)標(biāo)志的寄存器浑度。
下面有個(gè)例子?
Cmp EAX,EBX??;用EAX與EBX相減?
JNZ 00470395? ?;不相等的話寇窑,就跳到這里;?
這兩條指令很簡(jiǎn)單,就是用EAX寄存器裝的數(shù)減去EBX寄存器中裝的數(shù)箩张。來(lái)比較這兩個(gè)數(shù)是不是相等甩骏,當(dāng)Cmp指令執(zhí)行過(guò)后,就會(huì)在FLAGS的ZF(zero flag)零標(biāo)志位上置相應(yīng)值先慷,如果結(jié)果為0饮笛,也就是他們兩個(gè)相等的話,ZF置1熟掂,否則置0缎浇。其它還有OF(溢出標(biāo)志)SF(符號(hào)標(biāo)志)CF(進(jìn)位標(biāo)志)AF(輔助進(jìn)位標(biāo)志)PF(奇偶標(biāo)志)等。
3.3 段寄存器
? ?? ???段寄存器一共六個(gè)赴肚,分別是CS代碼段素跺,DS數(shù)據(jù)段,ES附加段誉券,SS堆棧段指厌,F(xiàn)S以及GS這兩個(gè)還是附加段。
接下來(lái)我們一起來(lái)認(rèn)識(shí)下逆向神器OllyDBG