快速學習匯編之 內存讀寫


0x01.寄存器與內存

寄存器與內存的區別:

1、寄存器位於CPU內部,執行速度快,但比較貴。
2、內存速度相對較慢,但成本較低,所以可以做的很大。
3、寄存器和內存沒有本質區別,都是用於存儲數據的容器,都是定寬的。
4、寄存器常用的有8個:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。
5、計算機中的幾個常用計量單位: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 **

內存的單位是字節,那內存中能存儲的信息最多為:FFFFFFFF+1 字節 即4G,這也是為什么我們在一個XP的系統上面如果物理內存超過4G是沒有意義的原因。

0x02.內存編號

1、內存

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

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

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

注意:地址編號不要隨便寫,因為內存是有保護的,並不是所有的內存都可以直接讀寫(需要特別處理)
建議地址編號寫成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

獲取內存編號:

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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM