如何通过PE文件了解内存中进程代码的范围



我可以通过PE文件或其他方式获得内存中进程代码的范围吗?

如果我有一个像这样的过程

example.exe

#include <stdio.h>
#include <string.h>
void func()
{
  char str[10];
  strcpy( str, "iambuffern" );
  printf( "%s", str );
} // func()
int main()
{
  func();
  return 0;
} // main()

我可以使用Ollydgb来知道example.exe在内存中的范围,我的问题是,如果不使用Ollydgb,我如何知道这些信息?

非常感谢

我想您要找的是一个.map文件。它是链接器生成的,包含所有符号地址和程序布局。如果您正在使用Visual Studio,下面是一个特定的示例。

在您的构建环境中检查.map或类似的扩展文件,大多数时候它都是文本格式的,因此您可以轻松地对其进行分析。

只要你有一个指向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参考。如果您想要堆栈边界,可以从TIB获取这些边界。(有趣的是,我也做了这个函数,因为我想要olly的那个功能)。

最新更新