逆向工程实验一

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分解成哪几个指令?

 

PUSH 0
PUSH 0 ; MB_OK 的值
PUSH OFFSET 00403000 ; szText字符串地址
PUSH 0 ; NULL的值
CALL <JMP.&user32.MessageBoxA> ; 调用user32模块中的MessageBox函数

问题2.2:怎么理解E8 08000000?

 

使用E8调用Call指令,E8后面跟着的是偏移地址,0800 0000应该高位先读,所以是0000 0008;Call指令把它吓一跳指令压栈,0040 1010+0000 0008=0040 1018,跳转到地址0040 1018执行。


问题2.3:F7单步步入和F8单步步过 有什么不同?
F8单步步过每按一次这个键执行一条反汇窗口中的一条指令,遇到CALL等子程序不进入其代码,越过函数实现;
F7单步步入功能与F8类似,区别在于F7遇到CALL等子程序是会进入其中,即进入函数实现。
简单来说就是按F7要一条条执行,按F8就是等同看作一条执行执行下面自己编写的所有连贯命令。

2.4:修改EXE文件字节码
   将messagebox显示的 HelloWorld 修改成 GoodNight,截图显示结果。
找到HelloWorld.,选中然后Ctrl+E跳转即可修改,然后再运行就可以了。

 

 

 

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

 

用winhex打开可以查看到是在0000 0800,可以知道FOA是0000 0800

 

.data在Virtual Offset区段在内存中的相对虚拟地址RVA是0000 3000(起始地址)

 

VA=Image Base+RVA=0040 0000+0000 3000=0040 3000
3、调试软件W32DASM
利用W32DASM查看HelloWorld.EXE的输出。
问题3.1:该函数用到哪几个DLL,分别用到哪几个函数?
使用到user32.ddl、kerne123.ddl和MessageBoxA、exitProcess函数

 

4、FlexHex 或 Winhex
熟悉十六进制编辑软件的使用。
问题4.1:如何初步判断一个文件是PE文件?

1.使用winhex工具查看文件头是否为0X4D5A;
2.若符合则用e_lfanew指针定位pe头,e_lfanew一般位于0X3C;
3.若符合1、2则判断pe头是否为0X4550;
4.以上三点都符合则是有效PE头。

5、利用PEditor查看Hellworld,读出其ImageBase的值,并给出节表(截图)。
问题5.1:画出节表。

 

Image Base = 0040 0000
节表:

 


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

6、如何判断一个文件是否是EXE文件?
用Winhex打开文件,从文件头4D 5A(MZ)开始跳转3C,读取到数据0000 00B0,再次跳转到0000 00B0,若该地址为50 45 即为EXE文件

7、查阅资料,简述病毒获取Kernel32模块基地址的重要性,即描述其目的是什么?
一般初始化PE文件的时候,ntdll.dll, kernel32.dll是随进程以及线程初始化时候加载的。所以即使程序中我们不引入任何输入表结构,这两个DLL在我们程序进程以及线程初始化时也必须加载。获得kernel32.dll的基地址后,就可以获得LoadLibray函数来继续加载其他的动态链接库,然后再通过我们的GetProcAdress函数来获得相应需要的api函数地址,这样也就做到了可移植性的要求。


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

 

 

 


数据目录项的偏移:2048H
VA:00401000H 大小:50H
用到3个dll文件
一致

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

 

 

### 关于PE文件导出表的逆向工程技术 #### 导出表的作用与结构 在Windows操作系统中,动态链接库(DLL)通过导出函数提供服务给其他模块调用。这些被DLL公开出来的函数列表存储在个叫做“导出表”的数据结构里[^1]。 #### 工具介绍 对于想要深入了解并操作PE文件中的导出表而言,有几个常用的工具可以帮助完成这项工作: - **CFF Explorer**:这是个功能强大的GUI程序,可以查看和编辑各种类型的可移植执行体(PE),包括但不限于EXE、DLL等。它能够直观展示PE文件内部各个部分的信息,比如导入/导出示例化表格等内容。 - **LordPE**:另个图形界面的应用,专为处理PE格式而设计。除了基本浏览外,还支持修改某些属性以及修复损坏的PE文件等功能。 - **dumpbin /exports**命令行工具:这是Visual Studio自带的个实用程序,可以通过简单的指令获取指定目标文件内的所有已知出口符号及其地址偏移量等信息。 #### 实验步骤概述 为了更好地理解如何解析和利用导出表,在这里给出个简化版的操作流程说明(注意实际应用时需遵循法律法规): 假设有个名为`example.dll`的目标文件,要对其进行简单分析,则可以用上述提到过的任意种方式打开该文件,并定位到其导出目录位置;接着观察其中记录的各项参数,如名称字符串指针数组、序号数组等等;最后尝试提取感兴趣的API入口点对应的RVA (相对虚拟地址),进而研究它们的具体行为模式。 ```powershell # 使用 dumpbin 查看 DLL 的导出表 dumpbin /EXPORTS example.dll ``` #### 安全提示 值得注意的是,在从事任何涉及反汇编或破解性质的工作之前,请务必确认自己拥有合法权限,并充分认识到此类活动所蕴含的风险及后果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值