C 中hack private許可權

2021-07-31 22:53:28 字數 1226 閱讀 7728

眾所周知,物件導向的語言都會有類似於private,protected,public之類的許可權控制。其實如前一篇blog所講( :在c++中,許可權只是為了在**的執行期阻止獲得變數或者某個函式的位址而達到不能呼叫的作用。言外之意就是只要能搞到記憶體位址,什麼都好說。下面提供幾種hack私有成員變數位址的方法。

1. 計算成員變數記憶體偏移

我相信對c++記憶體分配懂一點的小夥伴都知道這種方法。

class b

std::string getstr()

char* getch()

};int main()

2. 類的等效替換

上面通過計算成員變數的偏移確實可以hack記憶體位址,但是弊端也很明顯成員變數越多,後面就越需要計算偏移,而且二重指標也很容易搞出事情。那麼怎麼辦呢?我們只需要自定義乙個擁有一樣記憶體分布的資料結構即可。

class b

std::string getstr()

char* getch()

};// 在此模擬乙個與class b擁有相同記憶體分布的struct,但許可權都是開放的

typedef

struct

proof;

int main()

3. 元程式設計(meta programming)

之前一直以為元程式設計只有python,js這種動態語言中有,但是沒想到c++的元程式設計也很強大。概念是一樣的,元程式設計(c++操作template,python操作type)的存在都是為了動態生成類。但是我發現乙個問題:c++的模板類中傳遞引數時並不會校驗許可權問題。(比如上面中類b,當我們在執行時使用&b::b獲得偏移時會直接報許可權錯誤,但是在模板中傳參並不會這樣!)

// 這是乙個簡單的類模板傳值的例子

template

typename t f(t)

int main()

那麼如何把類成員位址傳出去呢?原理是相同的。
struct a ;

// tag used to access a::a

struct a_f ;

template

struct rob

};template

struct rob;

int main()

C 中的訪問許可權

private 只能由該類的成員函式,友元函式訪問,不能被該類的物件訪問。protected 除了private外還能被子類的函式訪問,同樣不能被該類的物件訪問。public 除了protected外,還能被該類的物件訪問。private protected public 類的函式和友元函式 子類的...

C 中類訪問許可權控制

c 中類訪問許可權控制 第一 private,public,protected 訪問標號的訪問範圍,在沒有繼承的情況下 private 只能由1.該類中的函式 2.其友元函式訪問。不能被任何其他訪問,該類的物件也不能訪問。protected 可以被1.該類中的函式 2.子類的函式 以及3.其友元函式...

C 類中的訪問許可權問題

2012 05 31 19 48 21 分類 c 基礎的東東 標籤 字型大小 大中小訂閱 c 中public,protected,private訪問小結 第一 private,public,protected方法的訪問範圍.public繼承下 private 只能由該類中的函式 其友元函式訪問,不能...