实验一 PE头及导入表的应用

  1. 实验目的和要求

熟悉PE文件格式,通过对PE文件头分析,理解PE文件格式,掌握主要数据结构的定位及其功能,如入口点、节表、节、导入表等。研究如何利用工具对各部分的内容进行读取分析显示,理解RVA、VA、FOA之间的关系;初步掌握汇编程序的调试方法。

2. 实验步骤

1、PE可执行文件分析

开发一个源程序 HelloWorld .asm,显示hello world。

    .386

    .model flat,stdcall

    option casemap:none

include    windows.inc

include    user32.inc

includelib user32.lib

include    kernel32.inc

includelib kernel32.lib

;数据段

    .data

szText     db  'HelloWorld',0

;代码段

    .code

start:

    invoke MessageBox,NULL,offset szText,NULL,MB_OK

    invoke ExitProcess,NULL

    end start

2、调试软件OllyDBG

2.1、利用OD软件调试PE文件。

从OD反汇编的结果分析,invoke MessageBox,NULL,offset szText,NULL,MB_OK分解成哪几个指令?

答:

以下指令:

 

 

问题2.2:怎么理解E8 08000000?

答:使用E8调用Call指令,E8后面跟着的是偏移地址,0800 0000是小端序读取;Call指令把它的下一跳指令压栈,所以有0040 1010h+0000 0008h=0040 1018h,随即跳转到地址0040 1018执行,所以08是下一条指令的地址相对于CALL调用的地址的偏移量。

问题2.3:F7单步步入和F8单步步过 有什么不同?

F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。

F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。

2.4:修改EXE文件字节码

   将messagebox显示的 HelloWorld 修改成 GoodNight,截图显示结果。

快捷键:“Ctrl+E”,进入编辑模式。进行修改

 

再把64改成00

 

 

 

问题2.5:修改是从文件偏移的什么地方开始的(FOA和VA、RVA分别的多少)?

答:

FOA的800H偏移;

基址:

FOA:800H; 

VA:00403000H

RVA:3000H

VA=ImageBase+RVA=00403000H

3、调试软件W32DASM

利用W32DASM查看HelloWorld.EXE的输出。

问题3.1:该函数用到哪几个DLL,分别用到哪几个函数?

user32.dll:MessageBoxA函数

kernel32.dll:ExitProcess函数

4、FlexHex 或 Winhex

熟悉十六进制编辑软件的使用。

问题4.1:如何初步判断一个文件是PE文件?

使用winhex工具查看文件头是否为0X4D5A;

若符合则用e_lfanew指针定位pe头,e_lfanew一般位于0X3C;

若符合1、2则判断pe头是否为0X4550;

以上三点都符合则是有效PE头。

如:

①使用winhex查看文件头MZ头是否为0x5A4D

 

②一旦证明文件的文件头有效后,就可用e_lfanew指针定位pe头(开始偏移3C处),定位到B0;B0为pe头所在位置;

③来定位 PE头,查看PE头处是否为0x4550

④若以上三点皆符合,则判断该文件是PE文件

  1. 利用PEditor查看Hellworld,读出其ImageBase的值,并给出节表(截图)。

问题5.1:画出节表。

 

节表:

问题5.2:某变量的FOA为410H,试分析其位于哪一节(给出分析过程。)?该变量的RVA为多少(给出计算过程)?

答:位于.text 节;原因:410H<600H(文件中偏移);

由此可计算RVA=410H-400H+1000H=1010H;

  1. 如何判断一个文件是否是EXE文件?

判断ImageBase的值是否为0x00400000,判断文件是否为EXE

 

 

Characteristics 字段为010FH

那么展开成二进制为0000 0001 0000 1111读表从二进制低位开始读

可以看到正数第二位是1,倒数第三位是0,说明是可执行的EXE文件

  1. 查阅资料,简述病毒获取Kernel32模块基地址的重要性,即描述其目的是什么?

答:

链接器动态链接的原理其实是将操作系统DLL中的API地址导入到我们的程序中,因为不同版本的Windows上DLL的基址会有所不同,所以你在WIN7上导入的"GetProcAddress"不一定能在WIN10上工作(因为地址不一样)。获取了kernel32.dll基址后就可以获取LoadLibrary()和GetProcAddress()的地址,有了它们之后我们之后就不用大费周章的去找API了。

8、导入表结构分析。

问题8.1:利用PEditor打开firstwindow.exe,分析该PE的导入表。该PE文件描述导入表的数据目录项的偏移是多少?导入表的VA和大小分别是多少?该EXE用到多少个DLL文件。验证与PEditor中查看到的是否一致?

答:

由图可知:数据目录项的偏移为2048H;

导入表的VA是00402084H,大小是50H;

VA=ImageBase+RVA=00400000h+00002084h=00402084h

该EXE用到3个DLL文件;

 

验证与PEditor中查看到的是一致的。

问题8.2:理解PE文件的双桥结构,特别是从静态到动态桥2发生的变化。下图为导入表描述符的数据结构。仅填写与Winresult.DLL相关的信息(画出静态、动态两个图)。

静态时桥一桥二指向的都是导入函数的编号及函数名,然后动态时双桥结构破裂,桥一不变,Windows加载器就遍历桥一的指针函数编号函数名然后将对应该函数的入口地址覆盖原本桥二IAT的值所以动态时桥二的值会变

 

 

  1. 实验小结

在本次实验过程中我学会了如何判断PE和exe文件;但实验耗时较大主要是使用OD、WinHex工具对文件进行解析不熟练所致;还有对许多概念都还没有完全了解,比如RVA(相对虚拟内存地址)、VA(虚拟内存地址)、FOA(文件偏移地址)之间的联系以及他们之间如何转化还不够熟悉;

RVA、VA、FOA之间的关系:

RVA是相对具体模块而言的,VA是相对于整个地址空间而言的;以及VA使进程及地址和相对虚拟内存地址的和;还有基地址表示该从哪里存储该模块,相对虚拟内存地址是相对于基地址的偏移文件偏移地址是虚拟内存中用来定位某个特定位置的地址,是针对某个模块及地址的偏移量;

RVA、VA、FOA之间的计算:

设x 为节数据的任意一位置

1.计算差值偏移x - 节.PointerToRawData(节数据在文件中开始的位置) == 差值偏移.

2.计算RVA差值偏移 + 节.VirtuallAddress(节数据在内存中展开的位置) == RVA

3.计算虚拟地址:   RvA + ImageBase == VA

需要注意的就是我们的 x在哪一个节中.  x <= 节.PointerToRawData + 节.SizeofRawData

对桥一桥二的双桥结构的理解:

静态时桥一桥二指向的都是导入函数的编号及函数名,然后动态时双桥结构破裂,桥一不变,Windows加载器就遍历桥一的指针函数编号函数名然后将对应该函数的入口地址覆盖原本桥二IAT的值所以动态时桥二的值会变成函数实际入口地址

刚开始我对如何从节表中获取信息以及获取什么信息还不太了解,本次实验结束后我对要从节表获取数据更加熟悉了;此外,这次实验也让我学习到了不少东西,加深了对理论知识的了解。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值