通過上兩節的介紹後,
這節就是可以說說如何用自已的代碼去實現讀取與寫入指定的一個進程中某處記憶體位址處的資料了.
要對某個進程堛滌O憶體進行操作,必需要先得到那個進程的進程ID,
接著打開這個進程ID,得到進程控制碼,然後還得指定一個要操作的記憶體位址,
最後還要提供要操作的那個記憶體的長度
至於要操作的記憶體長度在前面也有列出了那些常見的資料類型所佔用的記憶體長度。
記憶體位址有兩種概 動態記憶體位址 靜態記憶體位址
靜態記憶體位址 比如說我們運行了一個遊戲,其中的血值在記憶體用中CE找到了,記錄下這個記憶體位址,
然後關閉遊戲,再次開啟遊戲繼續用CE搜這個血值在記憶體中的位址,把這次搜到的位址與前次搜到的地址對對看,
如果兩次搜到的位址是相同的話,我們稱這種位址為 靜態位址
動態記憶體位址 動態記憶體位址相對於靜態位址來說正好相反,
如果那個遊戲的血會因為遊戲的關閉重啟後而與上次的位址不同,就是動態位址。
除了上面的兩種方式來判別一個記憶體位址是否為動態外,
還得再使用不同的作業系統再進行判斷,如一次是在Windows XP系統上取那個血在記憶體的位址,
然後再用 Windows 2003系統上也取一次血在記憶體中的位址,把兩次對比是不是相同,
若不同的話也就是動態記憶體
在本節例子埵陪 讀寫記憶體A.exe 程式,運行後的介面如下
讀寫記憶體A.exe
這個A程式會定時的從變數中讀取資料顯示出來,我們要做的軟體就是,根據上面提供的每個變數在記憶體中的位址,
然後可以把自已的資料寫到這個A程式的那些記憶體處,也可以從A程式的這些記憶體處讀出資料
下面我們就來設計一個軟體,可以從一個指定的進程中的某處記憶體處讀取或寫入一些資料
讀記憶體代碼.
模組奡ㄗ悀F多個常用的記憶體功能,函數名都是以 記憶體_ 開頭的,大家可以自已查看.
注意,要想進行記憶體讀寫操作,需要提供目標進程的進程控制碼,
並且該控制碼用過後不再使用了的話,需要及時關閉掉.
寫記憶體的代碼.
獲取與設置記憶體保護屬性的代碼
注意,記憶體是有保護屬性的,這個屬性值決定能不能該段記憶體能不能讀寫運行等操作用的.
當出現有些記憶體位址保護屬性為2時,是不能對該處記憶體寫資料的.
不過可以試試能不能把該屬性設置為4可寫.
當然有些特殊情況的記憶體是無法設置改變這個保護屬性值的.
下面再來講講CE的簡單用法,在怎麼查找記憶體位址
首次查找.可以在記憶體掃描選項 媬鴾W
全部這樣可以搜目標進程堛漫狾陸O憶體資料
使用例子堛 讀寫記憶體b.exe 寫入一個值到 讀寫記憶體a.exe 程式.
然後就可以用CE去查找這個值了,為了避免會漏查,
可以選上 全部 和 同樣掃描唯讀記憶體 這兩項來查找所有記憶體資料
再次掃描,過濾縮小記憶體位址數量
用 讀寫記憶體b 再次修改 讀寫記憶體a 堛漕滬茩,然後在CE媬擗J新的數值,
進行再次掃描,就能縮小記憶體位址的數量了,如果找出的記憶體位址還有很多的時候,
可以繼續修改後再次掃描,反復幾 次,就會只留下一個記憶體位址了,該記憶體位址就是可以使用的位址,
如果該位址在這個程式關掉再運行後還有效, 就可以肯定他是個靜態的記憶體位址了.
注意:因為易語言IDE代碼編寫不支援16進制,所以用CE找到的記憶體位址,
可以用計算器,切為科學型,進行轉換,把16進制的記憶體位址值轉成10進制的數值,再編寫到代碼.
如果進行記憶體鎖定呢?
只要找到了記憶體位址後,就可以用一個時鐘控制項,把時鐘週期設得小些,
該時鐘週期事件代碼婼s寫一條寫某個資料到該記憶體位址就行了.
因為短週期的時鐘快速的運行著,不停的寫入這個固定的值,
就能達到那處記憶體值變了時又被改寫回去的目的,也就是鎖定的效果了. |