快速學習彙編之 內存讀寫

0x01.寄存器與內存

寄存器與內存的區別:3d

一、寄存器位於CPU內部,執行速度快,但比較貴。
二、內存速度相對較慢,但成本較低,因此能夠作的很大。
三、寄存器和內存沒有本質區別,都是用於存儲數據的容器,都是定寬的。
四、寄存器經常使用的有8個:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。
五、計算機中的幾個經常使用計量單位:BYTE WORD DWORD
BYTE 字節 =  8(BIT)
WORD  字    =   16(BIT)
DWORD 雙字  =   32(BIT)

1KB = 1024 BYTE
1MB = 1024 KB 
1GB = 1024 MB

內存的數量特別龐大,沒法每一個內存單元都起一個名字,因此用編號來代替,咱們稱計算機CPU是32位或者64位,主要指的就是內存編號的寬度,而不是寄存器的寬度。
有不少書上說之因此叫32位計算機是由於寄存器的寬度是32位,是不許確的,由於還有不少寄存器是大於32位的。指針

32位計算機的編號最大是32位,也就是32個1 換成16進製爲FFFFFFFF,也就是說,32位計算機內存尋址的最大範圍是**FFFFFFFF+1 **
code

內存的單位是字節,那內存中能存儲的信息最多爲:FFFFFFFF+1 字節 即4G,這也是爲何咱們在一個XP的系統上面若是物理內存超過4G是沒有意義的緣由。blog

0x02.內存編號

一、內存

二、從指定內存中寫入/讀取數據內存

mov dword ptr ds:[0x0012FF34],0x12345678
mov eax,dword ptr ds:[0x0012FF34]

dword :要讀/寫多少 此時是4字節 byte == 1字節 word == 2字節
ptr: Point 表明後面是一個指針 (指針的意思就是裏面存的不是普通的值,而是個地址),也能夠理解成強轉,就是說把
ds:段寄存器 先不用管 記住就行
0x0012FF34:內存編號,必須是32位的 前面0能夠省略it

注意:地址編號不要隨便寫,由於內存是有保護的,並非全部的內存均可以直接讀寫(須要特別處理)
建議地址編號寫成esp的值容器

例子:隨便使用c語言編寫一個hello word程序,而後拉入od
咱們以讀取爲例子,把棧的值讀取到edx寄存器中

而後單步執行過去,會發現751D6359這一串數據賦值給了edx中,把edx的值覆蓋掉了
二進制

0x03.內存讀寫的五個公式

尋址公式一:[當即數]
讀取內存的值:程序

mov eax,dword ptr ds:[0x13FFC4]  //把地址0x13FFC4上的值給eax寄存器
    mov eax,dword ptr ds:[0x13FFC8]  //把地址0x13FFC8上的值給eax寄存器,在原來的地址上加4個字節,就是下一段數據的地址
內存中通常都是以dword爲單位,也就是4個字節。4 * 8bit = 32,經過上面知道二進制的32位1其實就是8個F,其實寬度就是8位。
MOV DWORD PTR DS:[0x13FFC4],eax
MOV DWORD PTR DS:[0x13FFC8],ebx

獲取內存編號:im

LEA EAX,DWORD PTR DS:[0X13FFC4]
LEA EAX,DWORD PTR DS:[ESP+8]

lea exp1,exp2
彙編中lea就是把 exp2 的地址給 exp1

尋址公式二:[reg] reg表明寄存器 能夠是8個通用寄存器中的任意一個
讀取內存的值:

MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]

向內存中寫入數據:

MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX],0x87654321

獲取內存編號:

LEA  EAX,DWORD PTR DS:[EDX]
MOV EAX,DWORD PTR DS:[EDX]

尋址公式三:[reg+當即數]
讀取內存的值:

MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX+4]

向內存中寫入數據:

MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX+0xC],0x87654321

獲取內存編號:

LEA  EAX,DWORD PTR DS:[EDX+4]
MOV EAX,DWORD PTR DS:[EDX+4]

尋址公式四:[reg+reg*{1,2,4,8}]4

讀取內存的值:

MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]

向內存中寫入數據:

MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4],87654321

獲取內存編號:

LEA EAX,DWORD PTR DS:[EAX+ECX*4]

尋址公式五:[reg+reg*{1,2,4,8}+當即數]
讀取內存的值:

MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]

向內存中寫入數據:

MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4+4],87654321

獲取內存編號:

LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
相關文章
相關標籤/搜索