首页
社区
课程
招聘
[旧帖] [求助]PE入口点获取问题 0.00雪花
发表于: 2011-2-27 18:15 1109

[旧帖] [求助]PE入口点获取问题 0.00雪花

2011-2-27 18:15
1109
PE文件头不是有个ImageBase字段是建议加载地址么,一般exe文件的建议加载地址不是0x00400000或者0x10000000么,但是calc.exe在加载后,这个加载的基址是变化的,也就是重定向了,如何获取calc.exe重定向后的加载基址?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
GetModuleHandle()函数应该可以得到程序的虚拟地址
2011-2-27 23:42
0
雪    币: 61
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
GetModuleHandle不是只能获取同一个进程空间内的句柄么,我想获取利用CreateProcess创建的进程的基址,咋办~
2011-2-28 00:28
0
雪    币: 29
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不知道您仔细看了CreateProcess这个函数没。
可以查看到下边这些信息:
BOOL CreateProcess(
  LPCTSTR lpApplicationName,                 // name of executable module
  LPTSTR lpCommandLine,                      // command line string
  LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // SD
  BOOL bInheritHandles,                      // handle inheritance option
  DWORD dwCreationFlags,                     // creation flags
  LPVOID lpEnvironment,                      // new environment block
  LPCTSTR lpCurrentDirectory,                // current directory name
  LPSTARTUPINFO lpStartupInfo,               // startup information
  LPPROCESS_INFORMATION lpProcessInformation // *_*在这里哦);

lpProcessInformation 这里就是进程信息,这个参数是一个输出参数,你可以使用一个结构来获取到自己创建的子进程的进程句柄,这样你就可以对你创建的进程做一些操作了,希望我的回复能帮到你。

可怜我现在还么正式会员。。悲剧啊。。
2011-2-28 00:45
0
雪    币: 61
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
可以再详细点吗?我想获取程序加载到内存后的基址,听人说GetModuleHandle返回的句柄就是基址,但是我实测发现并不如此,那么如何获取程序重定位后的基址呢?
2011-2-28 13:55
0
雪    币: 29
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;
    HANDLE hThread;
    DWORD dwProcessId;
    DWORD dwThreadId;
} PROCESS_INFORMATION;
这个是结构体的介绍。你仔细看看,里面有个hProcess就是一个句柄,你启动的进程的句柄。然后你就可以直接操作产生的进程了。
其实hProcess就相当于你使用OpenProcess打开进程获取的句柄了,你可以尝试下,看获取到的值是否一样。

下面的是自己查的。你看不看就无所谓了。

HANDLE 和HMODULE的区别和联系:

HANDLE 的定义:
typedef void *HANDLE;

//这个宏是用来定义结构体
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name

如果我们将HINSTANCE传进去,得到如下:
struct HINSTANCE__
{
      int unused;
}

DECLARE_HANDLE(HINSTANCE);

typedef HINSTANCE HMODULE;     
/* HMODULEs can be used in place of HINSTANCEs */

typedef HINSTANCE HMODULE;  
太长了 写多了罗嗦。。
给你个地址。看看这个句柄的区别。
http://supremeholy.blog.163.com/blog/static/93713582010101132215990/
对你理解有好处。
2011-2-28 18:51
0
雪    币: 61
活跃值: (70)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
嗯 十分感谢 , 你给的网址我看了,受益良多
但是还有一点疑问,你提到说PRCOESSINFORMATION结构体中的hProcess相当于OpenProcess获取的进程句柄,那么它和GetModuleHandle获取的句柄有何不同呢?
因为我利用CreateProcess创建进程时从PRCOESSINFORMATION结构体中获取的pi.hProcess得到的数值并不是我所创建进程的基址。
2011-3-1 12:49
0
雪    币: 29
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你还是没有理解进程 模块之间的关系,下边是我的理解
模块是静态的概念。模块就是程序段,是为了完成某个功能的一组程序。

进程(以及线程)是动态的概念。
是运行中的程序。
GetModuleHandle函数获取的是程序所在模块句柄。
OpenProcess获取到的是操作系统提供的操作进程的句柄。
我也说的不是很清楚,或者说不到位。
大牛看了就使劲拍吧。
2011-3-1 13:02
0
游客
登录 | 注册 方可回帖
返回
//