2012-02-15 28 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或类似的扩展文件,它会在大多数时间以文本格式,因此您可以轻松分析它。

相关问题