PE笔记

 

IAT

IAT,导入地址表(Import Address Table),保存了与windows操作系统核心进程、内存、DLL结构等相关的信息。只要了理解了IAT,就掌握了Windows操作系统的根基。IAT是一种表格,用来记录程序正在使用哪些库中的哪些函数。

AV在进行查杀时,IAT也是查杀的一个重要的依据

PE的全称是Portable Executable,用中文就是“可移植、可执行的”。从这个名字可以看出PE文件格式是一种文件格式标准,该标准并不局限于Windows某个平台,因为它是“可移植”的。比如我们在xp下编写的程序,一般可以没有问题的放在Win7的系统上跑。这个特性非常重要,它让windows平台软件提供了延续性的可能,否则软件厂商要为不同系统编写或者生成不同的程序,这无疑增加了软件提供商的负担,同时这也大大降低了软件传播的速度。“可执行性”是说这个文件是中承载着可以被CPU执行的指令,而不是像TXT这样的只是承载着数据。

一般在编译PE文件时,编译器会将主模块的地址设置为0x00400000,而编译过程中所有的地址指针和长跳转指令地址都是依据主模块的地址来计算,在编译过程结束时,编译器会在 PE 文件中创建一个重定位分区表,重定位PE文件所有的地址指针和长跳转指令地址。

在执行PE映像时,Windows会检查PE文件要映射到的进程地址空间是否可用,如果空间不可用,则Windows会会在启动之前将PE映像加载到内存上的绝对地址,再利用重定位分区表修正所有地址。 所有这种机制称为 “地址空间布局随机化(ASLR) ”。

为了在内存密码器上执行PE映像,需要对PE文件头进行解析并重定位绝对地址,如果出现模拟系统加载器这种可疑的行为就证明该运行很可能是恶意运行。

在我们对所有使用C 语言或更高级语言编写的加密程序进行分析时,总能看到“NtUnmapViewOfSection”和“ZwUnmapViewOfSection”这样的Windows API函数,这些函数会简单地从主体进程的虚拟地址空间中取消映射视图, 以上这个操作过程就是RunPE,几乎90%的加密都会使用到这一技术。


通常,一个 PE 文件中有 4 个区段:

.text:(代码段),可读、可执行 .data:(数据段),存放全局变量、全局常量等 .idata:(数据段),导入函数的代码段,存放外部函数地址。(当然还有 edata ,导出函数代码段,但不常用) .rdata:(数据段),资源数据段,程序用到什么资源数据都在这里(包括自己打包的,还有开发工具打包的)