首页
社区
课程
招聘
[旧帖] [原创]一分钟,教你认识PE 0.00雪花
发表于: 2009-10-20 20:04 1553

[旧帖] [原创]一分钟,教你认识PE 0.00雪花

2009-10-20 20:04
1553
论坛中看到了很多人在总结PE的格式,偶在这里也做一下总结,供大家一起来学习。

PE从某种意义上说可以分为四个部分。

Dos Header        PE Header        Sections Table        Section…
(Dos头)           (PE 头)            (描述各个节在        节的详细信息
                                            PE文件和内存
                                            中的位置)  

哈哈,简单吧,别打我啊,后面我会对PE的结构展开细致的讲述(编译、连接、装载的每个细节都会尽量讲述出来)

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
走一走看一看
2009-10-20 20:12
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵,勇气可嘉!
2009-10-20 20:13
0
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这样写太简单了..
2009-10-20 20:42
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
确实写得太简单了,PE里面的学问大着呢
2009-10-20 21:04
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
路过看看
2009-10-20 22:24
0
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哈哈,PE的确是相当地复杂
下面从两个函数开始说起吧
HMODULE LoadLibrary(
  LPCTSTR lpFileName   // file name of module
);
返回值是啥?msdn文档上面这么说
“If the function succeeds, the return value is a handle to the module.”
如果你仅仅知道返回值是一个模块句柄,那么你被蒙蔽了,只知其一,不知其二。
让我们再来研究一下,HMODULE这个值代表什么
Debug一下程序,你会惊奇地发现,他就是DLL在进程中的加载地址。呼呼,再来
回想一下DLL里面的导出函数(一般在Def文件中定义),我们用VC-Depends可以很容易
看到DLL中的导出函数,以及导出函数在相对地址(相对于DLL加载地址的偏移量)。

最后,我们再来看看DLL显示加载时,一般需要配合使用的函数
FARPROC GetProcAddress(
  HMODULE hModule,    // handle to DLL module
  LPCSTR lpProcName   // function name
);

返回值是啥,相信,看了上面的说明,不说,你也已经明白了,是函数的入口地址,是的。

上面既然已经提到了DLL的显示加载,那么肯定还有DLL的隐士加载。下面就列举一下他们的区别吧
1)如果一个程序采取隐士加载DLL,万一有一个DLL找不到的话,那就不好意思了,你的程序无法被加载;相反地,采用显示加载DLL,就不会存在这个问题,因为他是在运行中加载的,这样还会带来一个好处,就是程序的加载速度会快一点。
2)隐士加载DLL,需要DLL的Lib文件以及导出函数的原型说明。

说了半天,貌似这些和PE的内容没有关系,别急,你想下VC-Depends是如何获知DLL中的导出函数和RVA(相对偏移地址)的呢? 那就下次揭开面纱吧。

附件中提供了VC-Depends工具供下载。
上传的附件:
2009-10-21 13:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
简单明了!!!
2009-10-22 16:38
0
游客
登录 | 注册 方可回帖
返回
//