2012-09-04 18 views
-6

我可以在C/C++中設置/禁止讀取(或寫入) - 普通數組最後幾個元素的訪問權限嗎?由於我不能使用其他進程的內存,我懷疑這可能是可能的,但是如何?我Google搜索,但無法找到。最近5個元素的閱讀權限

如果我可以,怎麼樣?

因爲我想嘗試這樣的事:

SetPrivilage(arr,LAST_5_ELEMENTS,false); 

try 
{ 
    for(int i=0;;i++) //without bound checking. i know its evil. just trying if it is possible 
    { 
     arr[i]++;  //array is 1-billion elements 
    } 
} 
catch(int catch_end_of_array) 
{ 
    printf("array-inc complete"); 
} 

Memory: 

|start of array |00|01|02|03|04|05|06|07|..|..|1B|start of protected page|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx|xx| 

讓我們假設我學會了如何保護一個頁面,那麼怎麼可能我宣佈在靠近頁面陣列,使得陣列的終點將是下一個到頁面。 ?

+0

由訪問未分配給您的進程的內存導致的段錯誤不能用於設置讀/寫訪問。如果您需要讀/寫訪問權限,請創建您自己的數組類並在代碼中實現它。 – ronalchn

+2

你爲什麼問到?你的總體目標是什麼?可能還有其他方法可以實現這個目標... –

+0

我正在嘗試使用turn segfault進入優勢 –

回答

1

我假設你的arr是一個POD(普通舊數據)數組。你可以在C++中創建一個類,並且重載operator[]來執行運行時索引檢查。

你通常不能做你想做的事情,如果可以的話,這將是強烈的實施和操作系統的依賴。

在Linux上,對數據的訪問權限與virtual memory映射有關。這與系統調用mprotect(2)mmap(2) and munmap(2)有關。這些調用以頁面級粒度工作(頁面通常爲4K字節,並且4K字節對齊)。

你可以讓頑皮的小把戲,比如mmap -ing一個大的區域,其mprotect末頁,並做不可移植指針算法來計算arr指針。這很噁心,所以不要這樣做。和與髒mmap爲基礎的技巧like this是不是很便攜,可能不是很有效。信號處理程序不能拋出C++異常。

3

這不能以便攜方式完成,並取決於您的操作系統。我懷疑這是不是真的有可能在任何地方,因爲內存保護在一個非常粗糙的水平(例如Linux的有mprotect系統調用,但只能保護整個pages(通常爲4K塊),而不是任意的範圍內正常工作。

2

如果保護一個使用操作系統接口的頁面,然後你可以定位一個數組,使得數組結束於保護開始的地方,你必須用你設置的指針(例如,int *p)來指定數組,而不是將它聲明爲一個數組例如int p[40]),因爲大多數的C實現並沒有給你一個指定數組地址的方法

由於大多數系統的內存保護的粒度,你通常只能將陣列的一端與保護邊界對齊。所以這不是一個通常有用的保護數組邊界的機制。我已將它用於測試目的,分別通過測試兩端:

  • 對齊數組,使其末端鄰接受保護內存的開始位置。執行測試。
  • 對齊一個數組,使其起始鄰接受保護內存的末尾。執行測試。

因此,如果被測試的例程不正確地訪問陣列之前或之後的內存,那麼其中一個測試將失敗。