nop指令:空指令,什麼都不操作,唯一變化的就是eip當前指向的位址
需要講的就是位元組的問題:
首先我們看到
00401002 |. e8 ff040000 call ; \getmodulehandlea
這個位址中的資料e8 ff040000有5個位元組,那麼我們現在進行修改為將call的位址的彙編指令修改為je 0040101d
,相當於跳轉到0040101d這個位址上
我們發現了jz跳轉佔兩個位元組 所以還多出了三個位元組,那麼就會利用nop指令進行填充,
push指令:入棧,大致上有三種操作
第一種:push 0x0
,也就意味著直接把0x0直接壓入堆疊中,單步步過,發現堆疊視窗中儲存了乙個00000000的數值的位址,那麼也就是壓入成功了
第二種:push eax
,也就意味著還可以把資料暫存器中的數值壓入堆疊中
第三種:push 041000
,這裡的位址也就是00401000也就是當前程式的入口點的位址,也就意味著我們還可以把位址相應的儲存位址壓入到堆疊中
同樣的我們也可以講當前的位址中的數值壓入堆疊中,push [401000]
利用方括號進行包裹,修改完就自動變成push dword ptr ds:[0x401000]
,自己理解的是push 乙個dword型別的四個位元組的0x401000位址中的值,結果為如下
但是我們發現好像跟401000中的位址的值不像啊,那麼可以通過轉到資料視窗跟隨的操作來看下資料為多少
值為6a 00 6a 01,然後堆疊中儲存的是反著來的016a006a,這也是暫存器儲存的特性,記住就好了
pop指令:出棧
繼續上面來,自己已經把幾個資料壓入到堆疊中了,我們可以通過pop將堆疊中的資料取出,並且還可以賦予給資料暫存器
小知識點:push相關的指令還有個是pushad 和pusha,pushad是把當前資料暫存器中的值全部都壓入到堆疊中,而pusha只壓出16位,比如eax中的值12345678,只壓入其中的ax(再普及下 ax又分為ah al)
而popad和popa相關的指令也類似只是作用是出棧
自己的理解:pushad和popa相當於起到乙個備份的作用
mov指令:賦值操作,有三種形式
第一種:
載入od,修改當前彙編指令為mov ecx,eax
,然後進行單步步過,發現暫存器中的ecx為eax的值
我們還可以mov [402000],eax
,將eax暫存器中的值賦值給402000位址的值,進行單步步過
這裡自己先做個筆記:符號為0為正數 1為負數
第二種:
movsx指令:帶符號擴充套件,16位的賦值給32位的操作,並且填充以當前16位的符號位進行判斷,如果為正數則前兩個位元組用0開填充,如果是負數的話,則用f來填充
把ebx暫存器中的值修改為0000a123,再把當前彙編指令修改為movsx eax,bx
,然後進行單步步過,發現eax的值為ffffa123,前兩個位元組都用f來填充了,為什麼呢?因為上面說過了符號位進行判斷,a123的符號位為1所以為負數,那麼就用f來填充
我們可以再拿乙個正數來試試,將ebx暫存器中的值修改為00001234,然後同樣上面的操作,發現是0來填充的,因為1234的二進位制的符號位是0,那麼為正數,就用0來填充
第三種:
movzx指令:不帶符號擴充套件,16位的賦值給32位的操作,空的都用0來填充
跟上面的一樣,唯一不同的就是movzx填充的時候不會根據符號位來判斷,都是用0來填充,比如修改ebx暫存器來0000a123,然後進行賦值操作movzx eax,bx
,結果發現還是0000a123
把當前的位址彙編指令修改為:lea eax,[eax+0x16]
,再把當前eax中的儲存的位址值修改為401000,然後進行單步步過,發現eax中變為了00401016
這裡唯一不同的就是這個符號不是取位址中的值,相當於沒有一樣,但是還是需要寫,但是表示的還是傳位址,不是傳位址中的值,然後
+0x16
則表示偏移量,在eax偏移0x16的位址再賦給eax暫存器
將eax的位址值修改為0401000,然後當前的ecx的值為0012ffb0,將當前位址的彙編指令修改為xchg eax,ecx
,然後進行單步步過,發現值進行了互換
彙編學習(4)彙編指令舉例
位元組 記為byte,乙個位元組由8個bit組成,可以存在8位暫存器中。字 word,乙個字由兩個位元組組成。注 乙個字可以存在乙個16位暫存器中,這個字的高位位元組和低位位元組自然就存在這個暫存器的高8位暫存器和低8位暫存器中。十六進製制中的一位相當於二進位制數中的四位。幾條彙編指令 彙編指令 操...
mo彙編指令 彙編指令大全
一 資料傳輸指令 它們在存貯器和暫存器 暫存器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依次壓...
ARM彙編指令MCR MRC學習
mcr指令將arm處理器的暫存器中的資料傳送到協處理器的暫存器中。如果協處理器不能成功地執行該操作,將產生未定義的指令異常中斷。指令的語法格式 mcr p15,0,mcr2 p15,0,其中,為指令執行的條件碼。當忽略時指令為無條件執行。mcr2中,為ob1111,指令為無條件執行指令。為協處理器將...