反匯編窗口:
作用:ollydbg在這里顯示反匯編代碼
在此可以進(jìn)行調(diào)試
這里可以進(jìn)行關(guān)閉分析
寄存器窗口:
堆棧窗口:
數(shù)據(jù)窗口:
其他窗口:
第二章:
數(shù)制系統(tǒng)
最常用的數(shù)制系統(tǒng)是二進(jìn)制,十進(jìn)制和十六進(jìn)制距芬。了解它們霜瘪,最主要的你要知道是:
· 二進(jìn)制:只有符號0和1梆砸,因此稱為二進(jìn)制。
· 十進(jìn)制:出現(xiàn)10個字符(從0到9),因此稱為十進(jìn)制零截。
· 十六進(jìn)制:從0到F(0-9,A秃臣,B涧衙,C,D奥此,E和F弧哎,總共16個字符)。
通常稚虎,除非另有說明撤嫩,當(dāng)我們提及某一具體數(shù)字時都將其認(rèn)作十六進(jìn)制。我們不使用將數(shù)值從一種數(shù)制轉(zhuǎn)換為其它數(shù)制的令人不太愉快的數(shù)學(xué)公式蠢终。當(dāng)前序攘,Cracker們一般使用Windows自帶的計算器茴她,它將更加快捷和容易使用,以避免繁冗的工作程奠。
堆棧是什么丈牢?它是內(nèi)存的一塊區(qū)域,用于短暫存儲數(shù)據(jù)瞄沙,這些數(shù)據(jù)稍后不久就要恢復(fù)取出赡麦。就像在桌上放一疊信件或紙牌,最新的信件或紙牌都是放在最頂部帕识,如果一張張地取走信件或紙牌泛粹,總會從最上面的開始取。
第三章:
什么是寄存器肮疗,有什么作用
寄存器用來做什么晶姊,什么是寄存器?處理器在執(zhí)行程序時需要一個助手伪货。當(dāng)執(zhí)行一條指令時们衙,例如將兩個內(nèi)存單元中存放的內(nèi)容相加,處理器需要先把其中一個的內(nèi)容置入寄存器碱呼,然后再把另一個內(nèi)容置入蒙挑,這是使用寄存器的一個例子(寄存器是CPU內(nèi)部的高速存儲單元,訪問速度比常規(guī)內(nèi)存快很多愚臀。)
1.ESP指向堆棧最頂端的地址忆蚀,現(xiàn)在來看一下這個CrueHead'a CrackMe
2.
EIP – 另一個非常重要的寄存器,它指向當(dāng)前將要執(zhí)行的指令姑裂。
(F7是切換指令)馋袜;
在這里,顯示有EAX舶斧,ECX欣鳖,EDX,EBX茴厉,ESP泽台,EBP,ESI矾缓,EDI和EIP等
它們都被稱為32位寄存器怀酷。
什么是標(biāo)志寄存器
就像我們在第一章看到的,在OllyDbg寄存器信息的下方顯示的就是標(biāo)志寄存器而账。
1)O標(biāo)志(溢出標(biāo)志)溢出標(biāo)志在當(dāng)操作改變了符號位胰坟,返回錯誤值時被設(shè)置(譯注4)。看一下以下在OllyDbg中的例子笔横,同樣使用CrueHead'a的CrackMe竞滓。
我們按照前面講述的方法將EAX的值改為7FFFFFFF,即最大的正數(shù)吹缔。
2)A標(biāo)志(輔助進(jìn)位標(biāo)志)完成操作后商佑,用其它的某種形式對其進(jìn)行記錄。目前我們不需要關(guān)心此標(biāo)志厢塘。
3)P標(biāo)志(奇偶標(biāo)志)
如果指令的結(jié)果用二進(jìn)制表示茶没,該二進(jìn)制數(shù)中的1的總個數(shù)為偶數(shù)時,P標(biāo)志被設(shè)置晚碾。例如:1010抓半,1100,1111000.
4)Z標(biāo)志(零標(biāo)志)
這是在Cracking過程中最著名最有用的一個標(biāo)志格嘁。當(dāng)運算產(chǎn)生的結(jié)果為0時被設(shè)置笛求。
5)S標(biāo)志(符號標(biāo)志)
這個標(biāo)志在運算結(jié)果為負(fù)時設(shè)置為1。來看一下它是如何運作的糕簿,改變EAX的數(shù)值為FFFFFFF8探入,它等于十進(jìn)制-8
6)C標(biāo)志進(jìn)位標(biāo)志
(無符號運算的結(jié)果)在超過最大數(shù)值時設(shè)置,可能是寄存器的值懂诗,例如蜂嗽,將EAX設(shè)為FFFFFFFF,然后加1殃恒,我們會看到植旧,進(jìn)位標(biāo)志位設(shè)為1。
第四章:
NOP(無操作)
運行這條指令不會對寄存器,內(nèi)存以及堆棧造成任何影響,英文單詞的意思是”無操作”芋类,也就是說,它沒有特殊的用途隆嗅。例如界阁,你用一個短指令來替換一個長指令的話侯繁,如果處理器沒有錯誤,多余的空間將會被NOP填充。
PUSH
PUSH指令-將操作數(shù)壓入堆棧中泡躯。我們可以看到,CrueHead'а(CrackMe的作者)的CrackMe的第一條指令就是PUSH指令贮竟。
POP
POP指令是出棧:它會取出堆棧頂部的第一個字母或者第一個值,然后存放到指定的目標(biāo)地址內(nèi)存單元中。例如,POP EAX從棧頂中取出第一個值存放到EAX中,隨后的一個值隨即變成棧頂较剃。
PUSHAD
PUSHAD指令把所有通用寄存器的內(nèi)容按一定順序壓入到堆棧中,PUSHAD也就相當(dāng)于’PUSH EAX,PUSH ECX,PUSH EDX,PUSH EBX,PUSH ESP,PUSH EBP,PUSH ESI, PUSH EDI’咕别。
POPAD
該指令與PUSHAD正好相反,它從堆棧中取值,并將它們放到相應(yīng)的寄存器中。POPAD等價于“POP EDI,POP ESI,POP EBP,POP ESP,POP EBX,POP EDX,POP ECX,POP EAX”写穴。
MOV
該指令將第二個操作數(shù)賦值給第一個操作數(shù)
第五章:
INC和DEC
這兩個指令分別是執(zhí)行增加和減少的操作,如果是INC指令的話,就加1,如果是DEC指令的話,就減1惰拱。
我們跟之前一樣用OD打開cruehead的CrackMe。
ADD
ADD指令有兩個操作數(shù),相加后的結(jié)果存放到第一個操作數(shù)中啊送。ADD EAX,1等價于INC EAX偿短。ADD也將兩個寄存器相加,我們可以到OD里面看一看欣孤。
MUL(無符號數(shù)的乘法)
有兩種乘法,第一個種是MUL,這種是無符號數(shù)乘法,只有一個操作數(shù),另一個操作數(shù)是EAX,結(jié)果存放到EDX:EAX中。
例如:
邏輯指令
邏輯指令有兩個操作數(shù),兩操作數(shù)按位運算,并將結(jié)果存放到第一個操作數(shù)中昔逗。
AND
只有兩個二進(jìn)制位都為1的時候結(jié)果才為1,其他情況,結(jié)果都為0.
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
OR
該指令A(yù)ND的不同之處在于,兩位中只要有一位為1,結(jié)果就取1降传。
1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0
XOR
該指令時異或運算,當(dāng)兩位不同時取1,相同時取0。
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0
NOT
該指令是簡單的按位取反勾怒。
not 1 = 0
not 0 = 1
第六章:
CMP
該指令是比較兩個操作數(shù),實際上,它相當(dāng)于SUB指令,但是相減的結(jié)構(gòu)并不保存到第一個操作數(shù)中婆排。只是根據(jù)相減的結(jié)果來改變零標(biāo)志位的,當(dāng)兩個操作數(shù)相等的時候,零標(biāo)志位置1。
JUMPS
所有的跳轉(zhuǎn)指令都會指向程序?qū)D(zhuǎn)到的地址笔链。我們在下面的列表中可以看到各種不同類型的跳轉(zhuǎn)指令段只。
JMP – 跳轉(zhuǎn)
JE, JZ – 結(jié)果為零則跳轉(zhuǎn)
JNE, JNZ – 結(jié)果不為零則跳轉(zhuǎn)
JS – 結(jié)果為負(fù)則跳轉(zhuǎn)
JNS – 結(jié)果不為負(fù)則跳轉(zhuǎn)
JP, JPE – 結(jié)果中1的個數(shù)為偶數(shù)則跳轉(zhuǎn)
JNP, JNPE – 結(jié)果為1的個數(shù)為奇數(shù)則跳轉(zhuǎn)
JO – 結(jié)果溢出了則跳轉(zhuǎn)
JNO – 結(jié)果沒有溢出則跳轉(zhuǎn)
JB, JNAE – 小于則跳轉(zhuǎn) (無符號數(shù))
JNB, JAE – 大于等于則跳轉(zhuǎn) (無符號數(shù))
JBE, JNA – 小于等于則跳轉(zhuǎn) (無符號數(shù))
JNBE, JA – 大于則跳轉(zhuǎn)(無符號數(shù))
JL, JNGE – ?小于則跳轉(zhuǎn) (有符號數(shù))
JNL, JGE – 大于等于則跳轉(zhuǎn) (有符號數(shù))
JLE, JNG – 小于等于則跳轉(zhuǎn) (有符號數(shù))
JNLE, JG – 大于則跳轉(zhuǎn)(有符號數(shù))
第七章:
call和ret
Call指令是將轉(zhuǎn)移到指定的子程序處,它的操作數(shù)就是給定的地址。
第八章:
MOV ECX,15h
將計數(shù)器初始化為循環(huán)次數(shù)15h鉴扫。接下來就是循環(huán)體了:
Label:
DEC ECX
該計數(shù)器每次遞減1翼悴。
其實就是循環(huán)體了,循環(huán)體里面可以是任意指令。
最后,你需要添加一個判斷計數(shù)器是否為0的指令以及條件跳轉(zhuǎn)指令幔妨。
CMP ECX,0
JNE Label
第一次判斷,計數(shù)器的值為14h,因為14h不為0,所以將繼續(xù)執(zhí)行循環(huán),以此類推,直到計數(shù)器為0為止鹦赎。
我們完整的來寫一遍上面的循環(huán):
XOR ECX,ECX
ADD ECX,15h
Label:
DEC ECX
;循環(huán)體
TEST ECX,ECX
JNE Label
第九章-第二十章:
普通斷點
這是一個很普通的斷點,我們前面章節(jié)已經(jīng)使用了。在SoftIce中我們可以使用BPX命令來設(shè)置斷點误堡。OD中可以使用BP命令或者F2快捷鍵來設(shè)置斷點古话。也可以再按一次F2快捷鍵來取消斷點。
Remove:從列表中刪除斷點锁施。
Disable:禁用斷點但并不將斷點從列表中刪除陪踩。禁用時,斷點并不會觸發(fā)。
Edit condition:給斷點設(shè)置觸發(fā)條件,我們后面再來討論悉抵。
Follow in disassembler:在反匯編窗口中顯示斷點肩狂。
Disable all or enable all:禁用/啟用列表中的全部斷點。這里沒有啟用的選項,因為列表中唯一的斷點沒有被禁用姥饰。
Copy to Clipboard:把選中斷點的信息復(fù)制到剪貼板傻谁。
內(nèi)存斷點
內(nèi)存訪問斷點有時候也稱之為BPM,但是不要與SoftIce中的BPM弄混淆了,這二者是完全不同的。
這種類型的斷點修改內(nèi)存頁的訪問屬性列粪。當(dāng)前我們設(shè)置了內(nèi)存斷點审磁。任何代碼訪問(讀,寫或者執(zhí)行代碼)了該處代碼的話,都會觸發(fā)異常。
硬件斷點
硬件斷點(簡稱:HBP)是處理器的特性之一,它的工作原理我不是很了解,但是我們會用就行了,我們可以設(shè)置硬件斷點使程序中斷下來岂座。
條件斷點
條件斷點實際上就是普通的CC斷點,只不過該斷點的觸發(fā)需要滿足設(shè)置的條件,如果滿足設(shè)置的條件,那么程序就會中斷下來,如果不滿足條件的話,就和沒有設(shè)置CC斷點差不多态蒂。
條件記錄斷點
條件記錄斷點跟剛剛介紹的條件斷點差不多,區(qū)別在于,我們可以通過設(shè)置該斷點來記錄下設(shè)置的條件的精確值。我們舉個例子,我們給一個API函數(shù)設(shè)置條件記錄斷點,程序中有很多地方調(diào)用了這個API函數(shù),通過該條件記錄斷點我們可以精確的記錄程序中每處調(diào)用該API函數(shù)傳遞給它的內(nèi)容费什。
Windows窗口程序至少有一個消息循環(huán),消息循環(huán)有特定的API函數(shù)構(gòu)成,最常見的是GetMessage和DispatchMessage函數(shù),有的消息循環(huán)也會用到其他的API函數(shù)钾恢。想要深入了解Windows的消息的話,可以參考下面的鏈接中的教程”理解消息循環(huán)”