1. 程式人生 > 實用技巧 >第十四課_讀寫記憶體

第十四課_讀寫記憶體

前言

今天講講彙編如何讀寫記憶體。

還有一件事,本id覺得,單單講這些太無趣了,以後文章末尾加點東西,暫時叫《本id的夢話》,也想不出什麼好名字了,內容不限,不過大多是生活吧,就算是記錄一下自己的生活吧。

之前講過第一條彙編指令,如:mov eax,0xFFFFFFFF,有自己在OD上練習的,這應該很熟悉。這個命令就是把十六進位制的0xFFFFFFFF放到暫存器eax中。在彙編中我們把這種確切的數值(如這裡的0xFFFFFFFF)稱為立即數。

既然數能移到暫存器中,那如何移到記憶體中呢?也就是寫到記憶體中。

要想寫到記憶體,首先要找到記憶體。要找到記憶體,就要先了解記憶體的結構。可能大家也沒有學過計算機組成原理,所以大家可以把記憶體理解為一輛很長很長的火車,每一節車廂可以理解為一個記憶體單元,我們坐火車的時候,會發現每節車廂都有一個編號(這樣很方便就能找到自己的位置),記憶體也一樣,每個記憶體單元也都有一個編號,例如:4G的記憶體,編號從

0x000000000xFFFFFFFF。每個記憶體單元有8位(即只能存801),可以理解為每節車廂只有8個座位。(這樣的比喻,不知道是否合適,但本id只能想到這個比較容易讓人理解的比喻了,如果有讀者有更好的比喻,歡迎分享)。

可以發現,內容編號也是一個數,在彙編中,為了和立即數區分開來,記憶體編號會用一箇中括號“[]”括起來。[記憶體編號]一般被稱為地址。也就是常常聽人說的記憶體地址。

寫入、讀取記憶體的指令格式

1、寫入記憶體例子:mov dwordptr ds:[0x12345678],0x12345678

解說:把立即數0x12345678寫入到記憶體編號為0x12345678的記憶體中。

2、讀取記憶體例子:mov eax,dword

ptr ds:[0x12345678]

解說:把記憶體編號為0x12345678的記憶體中儲存的值讀取到暫存器eax中。

說明:

長度:因為記憶體是連續的(連在一起的火車廂),所以讀、寫記憶體時,要指定讀、寫的長度。這裡面的長度可以用byte(位元組)word(字)、dword(雙字),忘了的可以看第十課。因為一個記憶體單元為8位,所以讀寫記憶體時,最小長度是byte

ptr:(pointer的縮寫),也就是指標,實在不好理解,可以認為是固定格式。

ds:(data segment的縮寫),也就是資料段暫存器。不理解的,可以認為是固定格式

[0x12345678]:上面講的,用中括號括起數字,表示記憶體編號。

綜上:可以得到確定一段記憶體的格式:長度ptr ds:[記憶體編號]

在OD中演示讀、寫記憶體

要想在OD上練習讀寫記憶體,就要給大家講講暫存器ESP和堆疊的關係。先看下圖,大家有沒有發現什麼。

可以發現ESP中存放的值就是右下角框中的黑色選中的記憶體地址。

在OD介面的右下角的框,就是程式執行時的堆疊。不理解什麼是堆疊的,本id告訴你這就是記憶體,更具體的解釋堆疊,以後再講。先來看看右下角這個框,左邊的是記憶體編號,中間那列是記憶體編號所指的記憶體存放的數值。

所以要想在OD中觀察讀取記憶體的情況,記憶體的編號儘量用右下角框中能看到的地址編號。當然本id還是建議大家試一試隨便找一個地址來讀寫,看看會發生什麼。注:每個程式都自己獨立的4G記憶體空間。當然,很大機率程式會蹦到一個莫名的地方,放心,那可能是讀寫不讓讀寫的記憶體,退出OD重來就好。

演示一:讀取記憶體中的值到EAX中

輸入指令。

看看記憶體中的值和EAX中的值,看看執行指令後值的改變。

可以看到記憶體編號所對應存放的值,被讀取到EAX暫存器中了。

演示二:寫入記憶體

輸入指令。

看看記憶體編號所對應的值,看看執行後的結果是否改變。

可以看看數值被寫入到記憶體編號所對應的記憶體中。

大家可以改變讀取和寫入記憶體的長度,(byte、worddoword),讀取到8位,16位,32位暫存器中。關鍵是多練。

就先寫到這吧。

下面是夢話時間

本id的夢話

為什麼本id突然想寫這個?有可能是太寂寞了吧。好像這個理由比較有說服力。別人都是在朋友圈分享生活的,本id卻在自己的文章中記錄自己的生活,確實是有點特別呀。本id覺得嘛,朋友圈發東西,來來去去就那麼幾個人熟悉的人給你點贊,久了,也就不怎麼了發了。

好了,今天夢話說點什麼呢?說說手機吧,週五(4月24日)某果的新手機上市了,本id原來是想買一個的,因為這臺的記憶體確實是太小了,現在記憶體基本上算是用完了。現在都不敢裝app了,而最近公號後臺要讓使用app才能看,以前都是用小程式看並且回覆的。現在就只能晚上慢慢回覆了。而最後沒買,是考慮到自己一天敲鍵盤的時間比較多,沒什麼特殊情況,也沒什麼人找本id,也就對手機需求不大。而最主要的原因是,因為週五自己某個股票給我虧了6個多點,雖然某重工給了本id漲停,但是賬面上虧損了。

就夢話這麼多吧。也該休息了。

寫於2020.4.27 0:18