當某個靜態內存地址達到特定值時,如何可靠地更改單個靜態內存地址?'掛鉤'與C + +的內存地址?
我習慣的做法是使用基本C++應用程序中的讀/寫內存,儘管我發現有時這對於每秒更改1000次以上的地址不可靠。通常情況下,我的應用程序無法及時在地址處捕獲地址處的值,足以將其更改爲另一個值。這個掛鉤的概念究竟如何工作,它是否錯過價值改變?我正在使用Win 7 Ult。 86
當某個靜態內存地址達到特定值時,如何可靠地更改單個靜態內存地址?'掛鉤'與C + +的內存地址?
我習慣的做法是使用基本C++應用程序中的讀/寫內存,儘管我發現有時這對於每秒更改1000次以上的地址不可靠。通常情況下,我的應用程序無法及時在地址處捕獲地址處的值,足以將其更改爲另一個值。這個掛鉤的概念究竟如何工作,它是否錯過價值改變?我正在使用Win 7 Ult。 86
(重用的答案,我給了我認爲是相關的,但實際上不是一個問題。)
有環境所特有的方式,當一個變量改變來檢測。您可以使用MMU訪問控制標誌(通過mprotect或VirtualProtect)在第一次寫入時生成異常,並在處理程序中設置髒標誌。 (幾乎每一個現代操作系統都使用內存映射文件來做這件事,以確定它是否需要寫回到磁盤)。或者您可以使用硬件斷點來匹配寫入該地址(調試器使用它來實現變量的斷點)。
這兩個聽起來像他們會放慢程序。我頭腦裏有一個想法,但我不確定是否正確。基本上,我能夠將單條指令重定向到我注入的DLL的函數,進行比較檢查,然後將其重定向回該指令?成千上萬的隨機值通過這條指令,我只想改變特定的值。我不完全確定DLL注入是如何工作的,所以我不確定這是否合理。 – 2013-03-20 04:37:19
@Scott:在整個過程中是否只有一條指令觸及該內存位置?如果是這樣,那麼掛鉤可以工作。否則,利用確實進行比較的硬件是您唯一的效率希望,並且我列出的兩種方法都使用硬件來過濾地址。 – 2013-03-20 05:08:44
嘿@BenVoigt我不認爲你有任何引用方便你提到的方法嗎?聽起來像一個有趣的閱讀。 – 2013-03-20 05:21:31
掛鉤可以通過多種方式完成。 大多數需要你的目標進程中的代碼使得ReadProcessMemory過時(只使用指針並對其進行解引用)。 如果你想掛鉤,雖然你可以這樣做: 找出哪些指令寫入該地址(調試器內存斷點),它很可能是一個函數,所以我通常做的只是補丁附近的一些字節開始將執行流程重定向到我的代碼中,每次調用該函數時都會執行該代碼,我有時也會改變堆棧上的返回地址,以便我可以檢查和控制返回值以及執行代碼I希望在函數完成後執行(例如,從堆棧獲取一些信息,因爲我懶得挖出用於存儲它的結構,或者如果它是臨時的,它將被丟棄並且從不保存)。
AFAIK,'ReadProcessMemory()'不會引發異常,不會像直接指針解引用那樣影響保護頁。 – 2013-03-23 07:16:05
什麼是內存掛鉤? – 2013-03-20 04:30:56
@ n.m。你拿一個海盜鉤......或者你在地址總線和中斷輸入之間放置一個地址解碼器......或者這樣。 – 2013-03-20 04:33:26
出於好奇,用例/目的是什麼? – hyde 2013-03-20 08:07:25