admin 管理员组文章数量: 1184232
一、EXE文件结构
EXE文件分为两个部分: EXE文件头和程序本体。exe文件比较复杂,属于一种多段的结构,是DOS最成功和复杂的设计之一。每个exe文件包含一个文件头和一个可重定位程序的映像。文件头包含MS-DOS用于加载程序的信息,例如程序的大小和寄存器的初始值。文件头还指向一个重定位表,该表包含指向程序映像中可重定位段地址的指针链表。MS-DOS通过把该映像直接从文件复制到内存加载exe程序,然后调整定位表中说明的可重定位段地址。定位表是一个重定位指针数组,每个指向程序映像中的可重定位段地址。
二、EXE文件分析
1.MZ是EXE文件的标示,它占用了文件最开头的俩字节。
2.再往下看,在偏移02-03h的地方存放了000C,在偏移04-04h的地方存放了0009。通过这两个数据可以计算出文件大小,在这里0009指出该文件用了9个块(1个块是512B),000C指出最后一个块(第9个块)没有用完只用了000C个字节。
3.偏移06-07h处为重定向项目的个数。什么叫重定向呢,就是:EXE文件必须要加载到内存中才能执行,但是文件中数据的偏移地址跟内存中偏移是不一样的,重定向就是达到重新修改偏移的目的。在这里我们也应该看一下偏移18-19h处的数据,它指出了第一个重定向项目在本文件中的偏移,在本文件中为003Eh。即,在本文件003Eh偏移处存放了第一个重定向项目的内容,它的结构体声明为:
struct EXE_RELOC
{
unsigned short offset;
unsigned short segment;
};4.偏移08-09h处:该处数据指出了EXE头部大小,一般EXE头部后面紧跟着的就是程序数据了。本文件中为0020h,注意它的单位是节,一个节为16个字节,也即程序数据开始于文件偏移200h处。
5.偏移0A-0Bh处:该处数据指出了运行该程序所需的最小内存,如果小于这个内存,程序将不会被加载执行。
6.偏移0C-0Dh处:该处数据指出了运行该程序所需的最大内存,一般为FFFFh。
7.偏移0E-0Fh处:堆栈段在装入模块中的偏移,本文件中为:00E5h
偏移10-11h处:SP初始值,本文件中为:0080h
即SS:SP=00E5:0080
8.偏移14-15h处:IP初始值,本文件中为:0
偏移16-17h处:CS在装入模块中的偏移,本文件中为:0
三、IAT表和导入表
当exe程序中调用dll中的函数时,反汇编可以看到,call后面并不是跟的实际函数的地址,而是给了一个地址;
这些连起来就是一张表,就是IAT表;
例如:一个exe中调用系统提供的dll中的MessageBox函数时call的地址是42d2c4;
查看42d2c4中的内容:
可以看到:42d2c4中保存的是762b0026;
762b0026是dll中MessageBox函数的地址;
exe程序调用dll中的函数时,会使用FF15call;
call的并不是实际的函数地址,而是该函数对应的IAT表的地址;
通过IAT表来找到实际的函数地址;
查看一个运行的exe执行程序有哪些DLL:
打开“360安全卫士”软件
打开“功能大全”菜单
运行“360任务管理器”。
用鼠标选中查看需要分析的exe执行程序
鼠标点击“显示进程加载的模块
显示正在运行的exe所包含的动态链接库DLL以及引用的库文件所在的位置
版权声明:本文标题:探索.exe文件解析之道:以Flash为中心的深度剖析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1772140637a3552581.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论