一.PE文件格式概述:
1.PE(Portable Executable),Win32环境自身的执行文件格式体。
它的一些特性来自于UNIX的COFF(Common Object File Format)文件格式。
任何Win32平台上的PE装载器都能识别和使用该格式的文件。
2.RVA(Relative Virual Address)相对虚拟地址
装载程序需要把PE格式文件装载到一个虚拟地址空间中。而PE格式文件中很多项是由RVA方式指定的,RVA是其中一项相对于文件映像地址的偏移地址。通过RVA地址和基址可以计算PE格式文件的某一项的内存地址。
3.PE文件总体层次
(a)DOS MZ Header
它是一个IMage_DOS_Header结构,有了这个结构,使得程序在DOS下执行前,可以被DOS识别出这是有效的执行体,然后运行紧随DOS Stub。
(b)DOS Stub
这是一个极小的DOS程序,用来输出一些错误信息,比如在不支持Win32程序的环境下运行一个Win32程序。当Win32加载器把一个PE映像到内存中的时候,内存映像文件中的第一个字节就对应PE文件中的DOS Stub部分的第一个字节。
(c)PE Header
PE Header是IMAGE_NT_HEADERS结构体的简称。它包含了很多PE文件被载入内存时所需要用到的重要域。
(d)Section Table
在PE Header接下来就是数组结构Section Table(节表)。
PE文件中有N个节,每个节是一块拥有共同属性的数据。
4.PE文件运行
⑴PE文件被执行
PE装载器检查DOS MZ Header并找到PE Header的偏移量,跳转到PE Header。
⑵PE装载器检查PE Header的有效性
检查PE Header的有效性,如果有效就跳到PE Header的尾部。
⑶PE装载器读取每个节表,将节表映射到内存。
节表紧跟着PE Header的尾部,PE装载器读取每个节表的信息,并把节表映射到内存中,同时给予节表的属性。
⑷PE装载器处理PE文件中的import table(引入表)
PE装载器读取PE文件中的import table的逻辑部分,程序装载的时候要读取函数和DLL信息,要找到目标函数的地址,并把该函数的内容补充到内存映射中。这些信息都是存储在import table中。
一般来说,import表都是存放在程序的idata块中,但也有很多程序的import表不在该块中,需要了解import表的结构来进行定位。
4.块描述
1.text
text是在编译或者汇编结束的是偶产生的一种块,它的内容全部是指令代码,
2.data
初始化的数据块,这些数据包括编译时被初始化的globle和static变量,也包括字符串。local变量不占data块,该部分以明文的形式存放在文件中。
3.idata
输入数据,包括输入目录和输入地址名字表、idata包含其他外来的DLL的函数及数据信息。
4.rsrc
包含模块的全部资源,如图表,菜单和位图等。
5.reloc
保存基地址重定位表,
6.edata
PE文件输出函数和数据的列表,以供其他模块引用。
7.tls
thread local storage线程本地存储器。它与Win32的TlsAlloc系列功能有关。
8.rdata
调试和说明信息。
二.软件加密技术:
分类:加密壳,压缩壳,兼而有之。
Themida加密壳、Armadillo加密壳、EncryptPE加密壳等。
UPX压缩保护壳、ASPack压缩保护壳、Petiti 2.3-GUI等。
利用壳的加密处理的原理,多在程序中添加反逆向分析的关键代码和反调试器的代码、将程序的关键代码进行处理。
三.调试:
静态分析:分析程序的类型、语言、是否加壳、加什么样的壳。
分析工具:PEID、FileInfo、pe-scan等等。
静态逆向分析:在脱壳后的软件反汇编后得到的程序清单。
分析工具:W32Dasm、IDA、Hiew等。
动态分析:
分析工具:SoftICE、Trw2000、
调试器:OllyDbg。
作者:LinuxVV
来源:CSDN
原文:https://blog.csdn.net/vincent_852884172/article/details/49585451
版权声明:本文为博主原创文章,转载请附上博文链接!