现在有一个进程A在运行,在我的程序中如何知道进程A被加载入内存的基地址(是0X400000还是0X10000)?用什么API?

解决方案 »

  1.   

    有两种方法。一种是自己读取要察看载入映射地址的pe文件。取出imagebase值。
    还有一种方法就是MODULEINFO modinfo={NULL};
    HWND hwnd=0;
    DWORD procId=0;
    HANDLE hProc=0;
    DWORD ImageBase=0;
    hwnd = ::FindWindow("SciCalc","计算器");
    ::GetWindowThreadProcessId(hwnd,&procId);
    hProc=::OpenProcess(PROCESS_ALL_ACCESS,false,procId);
    ::GetModuleInformation(hProc,NULL,&modinfo,sizeof(modinfo));
    //应用程序一般是0x00400000,计算器在我的电脑为0x01000000 入口地址为0x010xxxxx 和0xFFF00000做与运算 保留前3个值结果为0x01000000 此方法还是很管用的。
    //有些程序imagebase小于0xFFF00000的那会计算错误。不过这种情况很少见。我还没有碰见过。
    ImageBase = (DWORD)modinfo.EntryPoint & 0xFFF00000;
      

  2.   

    忘记了。引入头文件
    #include<psapi.h>
    #pragma comment(lib,"psapi.lib")
      

  3.   

    但是不保证入口地址是一个很大的值。
    比如0x01000000是imagebase入口地址是偏移0x00512345 那么映射入口地址为0x01512345 用这个计算结果会错误。变成0x01500000
      

  4.   

    先打开其它进程句柄
    调用GetModuleInformation 
    通过第三参数获取模块信息
      

  5.   

    如果系统加载器对进程进行重载地址重定位,是否会修改imagebase值?imagebase值应该只是程序希望系统加载器把它加载到的基地址,而实际加载的基地址可能不是这个!
      

  6.   

    一般的EXE文件是没有重定位表的,那么直接读取PE文件中的ImageBase的值即可。
    如果要读取其他进程的dll的基址,可获取进程的句柄,通过GetModuleInformation获得。
      

  7.   

    psapi,好像不是系统库,是第三方库吗?
      

  8.   

    修改映像文件让入口代码为一个push eip和一个jmp指令跳转至自己添加的代码处,在这里先用显示函数显示出ss:esp中的内容,再add esp,4之后将入口处覆盖的代码添加上后跳回至第一条未覆盖的代码处