一、call有以下幾種方式:
call 404000h ;
直接跳到函式或過程的位址
call eax ;
函式或過程位址存放在eax
執行乙個系統api
windows
應用程式執行在ring3級別(包括我們的倚天劍:ollydbg)
等級安排
但有時候需要ring0級別才能進行操作,那咋整?
我們可以通過系統為我們搭建的橋梁:api函式,我們也稱之為系統提供給我們的介面。
因為系統只信任自己提供的函式,所以我們要通過api才能實現對核心的操作。
你可以這麼想,假如小甲魚送給你一輛法拉利跑車,恩,你沒聽錯,是假如,不是真的!那你要怎麼來駕駛她?
沒錯,要通過踩油門來加速,要通過打方向盤來轉彎……而油門,方向盤
就是所謂的介面,對於法拉利來說,它們就是api函式。
mov指令格式:mov dest, src
這是乙個很容易理解的指令,mov指令將src的內容拷貝到dest,mov指令總共有以下幾種擴充套件:
movs/movsb/movsw/movsdedi
,esi:這些變體按串/位元組/字/雙字為單位將esi暫存器指向的資料複製到edi暫存器指向的空間。
movsx
符號位擴充套件,byte->word,word->dword (擴充套件後高位全用符號位填充),然後實現mov。
movzx
零擴充套件,byte->word,word->dword(擴充套件後高位全用0填充),然後實現mov。
cmp指令格式:cmp dest, src
cmp指令比較dest和src兩個運算元,並通過比較結果設定c/?o/z標誌位。
cmpeax, ebx ;
如果相等,z標誌位置1,否則0.
cmpeax, [404000] ;
將eax和404000位址處的dword型資料相比較並同上置位。
cmp[404000], eax ;
同上。對於這個概念,建議魚油以關注蒼井空老師的熱情去關注它,因為它在破解中起到的作用是至關重要的。
事實上所有的標誌位歸併與乙個32位的標誌位暫存器,也就是說有32個不同的標誌位。
每個標誌位有兩個屬性:置1或置0,就相當於我們平時說的ok或不ok,ok就買魚c優盤支援小甲魚,不ok就看著小甲魚餓死街頭醬紫啦~
哈哈,大家可能更加關注的是32個標誌位都要記住?那不折騰死人才怪!
在逆向中,你真正需要關心的標誌位只有三個,也就是cmp指令能修改的那三個:z/o/c。
z標誌位(0標誌),這個標誌位是最常用的,運算結果為0時候,z標誌位置1,否則置0。 o
標誌位(溢位標誌),在執行過程中,如運算元超出了機器能表示的範圍則稱為溢位,此時of位置1,否則置0。 c
標誌位(進製標誌),記錄運算時從最高有效位產生的進製值。例如執行加法指令時,最高有效位有進製時置1,否則置0。
邏輯運算
指令格式:test dest, src
這個指令和and指令一樣,對兩個運算元進行按位的『與』運算,唯一不同之處是不將『與』的結果儲存到dest。
即本指令對兩個運算元的內容均不進行修改,僅是在邏輯與操作後,對標誌位重新置位。
小甲魚很負責任地告訴大家該指令的實戰形態百分之九十九是醬紫:test eax, eax(如果eax的值為0,則z標誌位置1)
條件跳轉指令,就是根據各種不同標誌位的條件判斷是否成立,條件成立則跳轉。
也就是我們平時所說的補丁。
所謂給程式打補丁就是我們對程式破解所進行的修改,就是說像我們衣服破了,如果沒有打補丁,就會**的意思。
ollydbg
的「/」可以檢視所有打過的補丁。
od基礎彙編
標誌暫存器代表某種狀態。在32位cpu中有32個不同的標誌暫存器,不過不用擔心,我們只關心其中的3個 zf of cf。在逆向工程中,你了解了標誌暫存器就能知道程式在這一步是否會跳轉,標誌暫存器就是乙個標誌,只能是0或者1,它們決定了是否要執行某個指令。z flag 零標誌 zf是破解中用得最多的暫...
OD 彙編指令 記錄(1)
一.mov eax 0x12 1.mov 目標運算元 源運算元 作用把 源運算元拷貝到目標運算元 mov 語法 1.mov r m8 r8 r 代表通用暫存器 2.mov r m16 r16 m 代表記憶體 3.mov r m32 r32 imm 代表立即數 4.mov r8,r m8 r8代表8位...
OD入門基礎
je,jz 結果為零則跳轉 jne,jnz 結果不為零則跳轉 js 結果為負則跳轉 jns 結果不為負則跳轉 jp,jpe 結果中1的個數為偶數則跳轉 jnp,jnpe 結果為1的個數為奇數則跳轉 jo 結果溢位了則跳轉 jno 結果沒有溢位則跳轉 jb,jnae 小於則跳轉 無符號數 jnb,ja...