您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-01 原文发表:2007-08-31 人气:37 来源:未知

本文章共4336字,分3页,当前第1页,快速翻页:
 

   本部分内容:/文件解说/PE剖析图/W32dasm反汇编参考/PE剖析中所用结构参考

大家都很清楚,了解可执行文件的结构有多么的重要,DOS下如此,Windows下也同样如此。如果你想加密程序,编写病毒等,了解PE文件结构必是不可缺少的。大家也可能见到很多这方面的资料,但都是从理论上解说一下,很少见到拿一个具体文件开刀的。这里,我就用前面“系列4”中的文件4.EXE为例来剖析一下PE文件格式,因时间关系,不可能一下子就写的很完善,如可行,以后再慢慢补来。
逆风者

===============================================================
对于本文件,红色外框将文件分成4个部分,各部分的内容是:
Ⅰ - 文件头;
Ⅱ - 代码段;.textsection
Ⅲ - 引入表;.rdata section
Ⅳ - 数据段;.datasection

可以看出,每部分都有大量的垃圾数据,用绿色的叉号进行标注。

我们先从整体看一下文件的结构:(要结合PE剖析图来看)
----------------------------------------------------------
1、IMAGE_DOS_HEADER
虽然你这是Windows下的程序,但保不准别人会拿它到DOS下执行,当然肯定不是想象的结果啦。该文件头和DOS下可执行文件的文件头基本上是一样的,所以你也可以认为它是一个标准的DOS下的EXE文件,只不过程序执行的结果是显示一个错误信息:This program cannot be run in DOS mode.,意思是这是Windows下的程序,到Windows下用吧!
该结构的最后一个元素e_lfanew指示PE文件头的位置,是个重要的数据。
对本例,该元素位于文件偏移量是3C的位置,其值是000000B0。
2、dos下执行时的程序部分
3、dos执行时显示的错误信息
4、垃圾数据
-----------------------------------------------------------
就是PE文件头啦,它是一个IMAGE_NT_HEADERS STRUCT结构
5、PE文件标记,db 'PE',0,0
6、是一个IMAGE_FILE_HEADER结构
7、是一个IMAGE_OPTIONAL_HEADER结构
8、是一个IMAGE_DATA_DIRECTORY结构数组,共16项
9、是一个IMAGE_SECTION_HEADER结构数据,项数由结构6中 NumberOfSections 确定。
本例中位于偏移量B6处,其值是0003
-------------------------------------------------------------
10、程序的代码部分,也就是.text section的内容
-------------------------------------------------------------
下面是.rdata section的内容,注意这里的指针值都是“虚拟地址”,即在内存执行时的地址。

11、IDA (Import Address table)用来存放函数的地址值。加载器执行文件时会重写该部分内容,程序中调用dll中的函数就是通过这里转到函数的真正位置的。
12、是一个IMAGE_IMPORT_DESCRIPTOR结构数组,项数怎么定呢?
这么说吧,假如你的程序中要调用N个动态链接库中的函数,那么项数就是N 1,总后一项结构中的数据全0,表示结束。
本例中的程序仅调用Kernell32.dll中的函数,所以此处有两个这样的结构。
13、是一个IMAGE_THUNK_DATA结构数组,该结构实际就是一个DWORD值,每个DWORD值指示一个IMAGE_IMPORT_BY_NAME结构,反应程序要调用的函数名。最后一个DWORD值为0,表示结束。
14、数据,由12、13中的内容指定。

==============================================================
下面是用UltraEdit打开4.exe后的抓图(处理)

若下面没图,点这里,可能还要刷新。

==============================================================
下面是用W32dasm反汇编4.exe后的详细内容,供参考:
Disassembly of File: 4.exe
Code Offset = 00000400, Code Size = 00000200 ;在文件中的偏移量是400H,大小200H(调整后的)
Data Offset = 00000800, Data Size = 00000200 ;在文件中的偏移量是800H,大小200H(调整后的)

Number of Objects = 0003 (dec), Imagebase = 00400000h ;section的个数是3,基地址是400000H

Section 相对虚拟地址在文件中的偏移量调整后的大小 段
 

本文章更多内容1 - 2 - 3 - 下一页>>
相关文章

汇编语言的符号、标号和变量符号
汇编指令与机器码的相互转换
Windows下程序的反汇编
程式语言效率分析(2)
SHELL 排序测试
进程
用汇编语言实现RESET启动和热启动
WINDOWS钩子函数
控制寄存器和系统地址寄存器
矛与盾的较量——CRC实践篇
键盘输入码表
子窗口控件
WIN98SE硬盘主引导记录代码数据注释
分页管理机制
多线程编程
动态库的执行时间
图形显示方式屏幕的保存和恢复
虚拟8086模式的内存管理
WIN98SE硬盘主引导记录代码反汇编分析
控制转移(1)

相关评论


本文章所属分类:首页 汇编技术

  热门关键字:
进制数据输出的通用程序 2007-09-12
汇编源码--showmem 2007-08-31
汇编源码--CLEAN 2007-08-31
汇编源码--hdr 2007-08-31
汇编源码--basload 2007-08-31
汇编源码--CHAR 2007-08-31
汇编源码--fxn 2007-08-31
汇编源码--alarm 2007-08-31
汇编源码--getsect 2007-08-31
汇编源码--DEV 2007-08-31
汇编源码--getspace 2007-08-31
汇编源码--frespace 2007-08-31
CIH文件型病毒检测消除程序 2007-08-31
Mixer Volume Ctrler V1.0 2007-08-31
汇编源码--COMINT 2007-08-31
自己用汇编语言写的一个病毒(源码... 2007-08-31
汇编源码--col 2007-08-31
汇编源码--BURNOUT 2007-08-31