解析進程在內存中映射的信息

 

 

上面這個程序是用來測試用的,大體思路是這樣的,通過此程序的進程名獲得此進程的PID,進而獲取進程信息,將進程信息寫到自己定義的緩衝區中(考慮到通用性,緩衝區的類型是BYTE),此時緩衝區裏面就存放了這個進程的一些信息,由於是BYTE類型的,不是我們要的類型,所以就要解析(筆者解析的是int型數據)主要看看解析方法:
首先,從緩衝區裏面按照一定的大小來讀去數據量平臺的不一樣會導致編譯結果的不一樣,進而內存信息的地址就會有差別,VC6.0下連續的int類型之間沒有空餘地址,是緊挨着的,但是VS2008就不一樣了,她在編譯的時候每個int 類型之間留有8個字節的空字節沒有用,此時我們在讀的時候就應該以12作爲步長來讀(int 的四字節加上 預留的8個空字節字節);
下來,就是解析了,筆者利用位操作,將每一個字節的八位數據求出來,存放到一個數組中,數組裏存放的就是信息的二進制編碼,思路很簡單,但是操作起來並不是那樣的,舉一個例子,拿num1來說,她有四個字節,編譯程序的時候一個一個字節都PUSH到棧裏面,但是在通過handle讀進程信息的時候,會把最後一個字節先讀,這樣,會導致四個字節數據的逆置,切忌,是四個字節的逆置, 不是左右位的逆置 如下圖:
11110000  |  10101000  | 10101010 | 01010101
       1                   2                   3                4
 01010101 | 10101010   | 10101000 | 11110000
4     3  2    1

是字節的逆置,不是位的逆置,此程序當中,四個變量在壓棧的時候也滿足上面所說,所以解析出的結果,num1,num2,num3,num4也是逆置的。還有一個問題應該注意,那就是在移位操作的時候是從低位開始的取值的,賦值的時候需要從字符串的後面開始賦值,才能取得正確的二進制編碼,其實,咱們不需要那樣做,大家想一下,咱們是爲了解析int,要的是int值,不是二進制編碼,利用二進制的零幺編碼加上各個位上的權值來算int值的,那麼我們就不需要按照邏輯上的從高位到低位來存編碼,比如說,咱們算出來的最低位(即第一個算出來的編碼)是幺,那麼它所確定的值就是1 * 2^0,正好,我們就把第一個權值定義成2^0,也符合認得邏輯思維,權值從小到大排起來。這樣以來,按照一個編碼對應一個權值就可以把值算出來。此法打破常規,筆者覺得很不錯。
接着,我們開始對解析的二進制編碼進行int化(筆者把二進制轉成int值叫int化),遍歷二進制編碼數組,遇到幺了就將此時對應的權值加到sum裏,最後的結果就是sum,這樣就得到那個int值。

注意:在定義全局變量的時候,若要在.cpp文件,和main函數文件中利用那個全局變量,需要在.h文件中聲明全局變量爲extern的,然後只需要在剩餘的那兩個.cpp文件中隨意的一個文件中定義一下,那麼另外一個.cpp文件就知道那個變量是其他文件的了,否則會出現全局變量的多次定義。
下面這個就是我的解析程序,希望大家多提寶貴意見,代碼風格,代碼解釋,語法等,均可提意見,筆者很樂意與大家交流。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章