2012-02-15 47 views
-1

我可以通過PE文件或某些方式獲取內存中的進程代碼範圍嗎?如何通過PE文件知道內存中的進程代碼範圍?

如果我有這樣的

example.exe

#include <stdio.h> 
#include <string.h> 

void func() 
{ 
    char str[10]; 

    strcpy(str, "iambuffer\n"); 

    printf("%s", str); 
} // func() 

int main() 
{ 
    func(); 

    return 0; 
} // main() 

我可以用Ollydgb知道example.exe在內存的範圍,我的問題是我怎麼能知道一個進程這些信息沒有使用Ollydgb?

非常感謝

+1

「內存中的進程代碼範圍」是什麼意思? – sstn 2012-02-15 05:55:28

+3

除此之外,strcpy()會在您的示例中寫入超出str的結尾。 – sstn 2012-02-15 05:56:00

+0

就像我可以使用Ollydgb來獲取進程範圍,如0x00401270〜0x00401382 – user1021319 2012-02-15 06:07:45

回答

0

只要你有一個指針PE(從HMODULE鑄造),就可以得到虛擬化進程的代碼大小,像這樣(不,它永遠是頁面大小的倍數):

inline ULONG_PTR GetModuleSize(HMODULE hModule) 
{ 
    IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*)hModule; 
    IMAGE_NT_HEADERS* pNTHeaders =(IMAGE_NT_HEADERS*)((BYTE*)pDOSHeader + pDOSHeader->e_lfanew); 
    return pNTHeaders->OptionalHeader.SizeOfImage; 
} 

所以當然範圍將變得(ULONG_PTR)hModule(ULONG_PTR)hModule + GetModuleSize(hModule)

人們可以列舉的各個部分,如果你想更細粒度的內存映射。請參閱Win32 PE reference。如果你想要堆棧界限,你可以從TIB中獲得這些界限。 (有趣的是,我也做了這個功能,因爲我想要olly的這個功能)。

1

我猜你正在尋找的是一個.map文件。它是鏈接器生成的幷包含所有符號地址和程序佈局。如果您使用的是Visual Studio,則爲Here是一個具體示例。

檢查您的編譯環境中的.map或類似的擴展文件,它會在大多數時間以文本格式,因此您可以輕鬆分析它。

相關問題