內存空間中的句柄,指針,對象,類
句柄(Handle)
網上有不少對於句柄的解釋,若是是剛剛接觸句柄,看完各類各樣的解釋很容易蒙圈了。這裏咱們換個角度想,爲何要獲取句柄?咱們在對文件,註冊表,窗口等進行操做時,都須要調用系統提供的api函數,而這些api函數大多都須要傳入句柄做爲參數。就是由於句柄,系統才知道你猥瑣的是哪一個文件,哪一個註冊表項或者哪一個窗口。
這裏經過調試看看句柄長什麼樣子的,如圖代碼獲取了3個不一樣的句柄,分別是文件句柄,dll句柄和註冊表句柄
直接在vs下調試並查看對應句柄的狀況,能夠看到文件句柄hFile和註冊表句柄hKey都是用了一個數值來表明,這個值能夠當作是句柄的索引,至於這個值是如何與文件和註冊表項聯繫起來,這裏就不詳細展開,感興趣的同窗能夠搜句柄表來查看具體的轉換過程。而對於獲取dll模塊的句柄hMod,咱們能夠看到獲取到了內存中具體的值,若是用過OD調試程序,對於這個地址應該不陌生,這是程序中dll模塊的基址。可能看到這裏就有疑惑了,爲啥這個句柄不是用一個51,52的數值來標識,而是獲取到了一個具體的值?這裏有個區別就是,前面的hFile,hKey是這個程序外部的東西,並無在自身空間中加載起來,因此就只能經過一個索引來表示,而dll模塊是加載到了程序自己的內存空間中,因此用基址來做爲句柄。
指針
對於初學C/C++的人來講,指針是個很神奇的東西,下面用一段代碼來看看指針是個啥。
可能看到前面的代碼就有人開始暈了,咱們一個個看,「GeekFZ_QKSword」是定義的一個字符串,在內存空間中就是一串數據了。根據局部變量顯示的地址查看一下字符串所在的內存空間。
p是咱們定義的指向字符串的指針,我這裏直接打印出對於p,*p,&p,來看看對指針不一樣操做的區別。首先咱們知道p定義爲了指針,那麼p保存的值是什麼呢?經過打印的結果能夠看到,這裏就是前面字符串開始的地址,p的值保存的就是字符串的內存地址;*p就是取p指向地址的值,咱們查看打印結果能夠看到字符「G」;&p是取p的地址,這裏保存的就是p這個指針的內存空間地址,查看p的地址能夠看到它保存的值就是字符串的地址
這裏用一張圖來梳理一下前面的內容
對象和類
在學習C++的時候,類和對象每每會讓人以爲抽象,那麼如今看看它們在內存空間中的樣子。代碼如圖
對於類和對象,不少教程都會說類是抽象的,對象是類的實例化。那麼首先對比一下類在實例化和沒有實例化的狀況。這裏用IDA分別對比兩種狀況的不一樣。能夠從圖中看出,在沒有實例化的狀況下,類是不會被編譯到程序中,誇張的形容就是你程序寫了一千個類,若是沒有實例化它們,那麼這一千個類都不會編譯到你寫的程序中。在類通過實例化後,咱們能夠從IDA的Structure窗口中查看到咱們定義的變量
從上面圖中還能夠看出兩個問題,一就是IDA這裏把類中的定義變量識別出結構體,這是由於類和結構體雖然概念不同,可是從反彙編看是沒有區別的。二是咱們定義的成員函數去哪裏了?畢竟結構體中不存在成員函數的說法,類中定義的一些變量成員會被IDA識別爲結構體,可是對於成員函數來講,其實就和普通的函數同樣在程序中直接調用,而區分類的成員函數和普通函數的方法,最簡單就是經過函數調用方式是否爲thiscall來判斷。
歡迎關注本站公眾號,獲取更多信息