2012-12-26 34 views
0

我一直在嘗試這樣做大約兩天,沒有成功。我一直在閱讀許多PE文件格式教程無濟於事。獲取.text段碼PE文件格式的偏移量? VirtualAddress,PointerToRawData?

我通過CreateFileMapping將32位可執行程序映射到內存中,該功能非常完美。然後,我的程序循環通過節標題,並根據默認特徵檢查特徵(以確保該部分是可執行文件並且是代碼)。如果它是真的,程序返回指向該節頭的(PIMAGE_SECTION_HEADER)指針(程序完美無缺)。

既然我有指針,結構中有兩個特定的條目讓我感到困惑,那就是PointerToRawData和VirtualAddress,當我查找條目時; VirtualSize = 4096,的PointerToRawData = 1536

從我PE文檔中已閱讀,是的PointerToRawData被一個所謂的偏移(RVA ???)在磁盤上的數據部分的第一個字節(我是校正?),並且是對齊值的倍數(512)。問題是我該如何設置這個值,以獲得一個指針,我可以用它來訪問該部分的數據。在內存映射文件上使用(VirtualAddress值+圖像庫值)來找到該節的第一個字節會更好?

另一個混亂點是VirtualSize和SizeOfRawData。這使我感到困惑,因爲在本文中 - http://msdn.microsoft.com/en-us/library/ms809762.aspx,它說「結構中的SizeOfRawData字段(似乎有點用詞不當)保留了四捨五入的值」,但我的VirtualSize大於我的SizeOfRawData值,導致了混淆我應該使用哪一個。

該程序的目標是找到可執行部分(.text部分)並對該部分中的所有位執行按位操作,並在下一部分之前結束該操作。

我不希望它看起來像我期待的勺子喂,我只是想澄清一下。

謝謝你的時間/幫助,很感激。

回答

5

我並沒有碰到規範或任何PE代碼可供參考(我正在從我的沙發上將它寫在我的iPad上);但要認識到的關鍵是有兩個模式要考慮:只有當PE被映射到內存中並且對齊時頁面對齊時,RVA的所有談話纔是相關的。當您從磁盤讀取文件時,偏移量是文件偏移量,每個部分都使用文件對齊方式。

我希望這會有所幫助。

+0

好的,謝謝你的幫助。爲了澄清每當我用filemapping打開一個文件,這將意味着我將不得不處理SectionAlignment和RVA的?像節表中的PointerToRawData這樣的值會比VirtualAddress有用嗎? – James

+1

不,對不起,我被無意誤導了:當我說映射到內存時,我的意思是當由O/S作爲可執行模塊加載時。使用內存映射的事實不會改變您將圖像作爲文件訪問的事實,因此您需要使用PointerToRawData值。 –