PE文件的结构
PE文件总的来说是由DOS文件头,DOS加载模块,PE文件头,区段表与区段5部分构成
而这些就是区段表(也称为节表作用相当于一本书中的目录,你想看那一页就按着目标标注页数去找,不过这里加了一些很有用的属性,例如读写权限与区块大小等,他的任务就是让PEloader能准确快速的加载相应的区段)
PE文件头标准大小为224字节(不严谨)
前面只是让我们对PE有了一个大概的了解
一个典型的PE的区段包含如下
.text 存放可执行的二进制代码 .data 初始化的数据块,比如全局变量等 .idata 可执行文件所使用的动态链接库等外接函数与文件信息 .rsrc 存放程序的资源,如图标,菜单等
这里用区段名区分各区段的用途与功能可以这么做,但是并不可靠,因为在编译程序的时候区段名等信息可以被任意更改或指定,虽然大多数情况下没有人那么做。除了PE文件格式还需要注意的输入表(又称导入表),对于硬盘上的静态PE文件来说,在自己被映射到内存之前按是无法得知这些导入函数会出现在那个地方的,只有当文件被装入到内存后windows才会将相应的DLL文装入,并将导入函数与DLL的实际函数地址联系起来,这便是"动态链接"的概念,也就是DLL文件会被称为“动态连接库文件"d的原因
那么PE文件在被装入内存中究竟会产生怎么样的编号,又要经历一个怎么样的流程呐。这时候我们又的了解一下虚拟内存了。
计算机中的内存分为物理内存和虚拟内存 一般来说需要进入内核层(Ring0)层才能与物理内存打交道。通常我们所看到的全是虚拟内存如
这里的虚拟内存要注意的就是不要把硬盘虚拟内存和虚拟内存的概念混淆了
PE文件的内存映射
Bypass AV时我们最经常接触到的就是寻找文件偏移地址与寻找内存地址这两项工作
如果想理解PE文件与虚拟内存之间的联系,我们还得知道以下的概念