两周软件安全实验进行了PE文件格式分析,把自己实验报告部分copy过来当作记录。这里没有阐述过多理论部分,相关内容在网上和书本上可查阅,第一部分的打印稿图中也标注了部分字段结构。将来若有时间再作系统整理。以下仅为实验操作部分的内容摘取。(课后思考部分只给出了理论方法,实际待以后填坑)
1. PE文件格式分析
①使用UltraEdit观察PE文件例子程序hello-2.5.exe的16进制数据,在打印稿中画出该PE文件基本结构。
分析完毕最终打印稿基本结构示意图如图。



②使用UltraEdit修改程序,使得程序仅弹出第二个对话框。
先使用ollydbg找到文件在内存中实现第二个弹框的位置:00401016(VA)--1016(RVA)

使用PEView查看PE文件可选文件头,找到对应入口点地址文件偏移为0D8,使用UltraEdit修改对应位置的值为1016。


查看修改结果,实际只显示第二个对话框。

2. 熟悉并分析PE文件的引出表
①找到系统System32目录下的user32.dll文件,用UltraEdit打开并分析该文件引出表,找出函数MessageBoxA的地址,并验证该地址是否正确。
使用PEview本质和UltraEdit打开一样,因其有内容解析,这里使用PEview进行操作查找地址。
先查看可选文件头的imagebase。

再查看引出表的RVA。

再找到引入名字表的RVA。

在引入名字表中找到函数名字在表中的序号。

再在序号表中由序号查得函数在引入地址表的序号01DC。

最后在引入地址表找到01DD位置(因起始从0数),存储数据即为函数的RVA,即407EA。

再加上imagebase得到真实地址VA=77D507EA。
再在ollydbg打开使用该函数的exe文件可得结果正确。

3. 熟悉并修改PE文件的引入表结构以及代码段和数据段
①手工修改hello-2.5.exe程序,使得其可以弹出第三个对话框(提示框标题为“武汉大学信安病毒实验”,内容为:你的姓名+学号)
在Ollydbg中打开PE文件,先修改.data段。

记下title和text的RVA分别为00403059和0040306A。再修改.text段。

修改完毕保存后,打开可执行文件,发现可弹出第三个对话框,实验成功。(注意:.text和.data节表中,表示节实际大小的字段“Virtual Size”应该做出修改,但不修改文件依然能正常运行,这里未作修改仍成功弹出)

②用UltraEdit修改hello-2.5.exe程序的引入表,使该程序仅可以从kernel32.dll中引入LoadLibrary和GetProcAddress函数,而不从user32.dll导入任何函数。在代码节中写入部分代码利用这两个函数获取MessageBoxA的函数地址,使hello-2.5.exe程序原有功能正常。
修改引入函数节的IMPORT Hints/Names&DLL Names,以及INT、IAT和IDT表。可能还需修改与这些表相关的结构,包括可选文件头中IDT和IAT表的RVA和Size字段等。
分别修改后如图所示。



修改PE头部和节表中的相关结构。分别修改IMAGE_OPTIONAL_HEADER中的IMPORT Table和IMPORT Address Table中的RVA和Size,修改.rdata节表中的Virtual Size。
通过Stud_PE打开查看可选文件头,找到对应IT和IAT的RVA和Size,如图所示。


修改对应位置,这里只有IT的size发生变动,故只修改此字段。而.rdata节表中的Virtual Size也不必修改,因大小变小不需要用到之后的部分。
修改完毕后,在代码节中写入部分代码利用这两个函数获取MessageBoxA的函数地址,使hello-2.5.exe程序原有功能正常。
修改.data段,添加代码段中要用到的字符串“user32.dll”和“MessageBoxA”,记下两个字符串的RVA分别为00403059和00403064。

修改.text段。

修改完毕保存文件,打开可执行文件,正常弹出对话框,实验成功。

4. 熟悉并修改PE文件的资源表
①用UltraEdit修改PEview.exe,使得该文件的图标变成csWhu.ico。
观察PEview复件的原有图标和替换图标的大小,发现原有图标大小大于替换图标,故可直接替换。(若替换图标比原有图标大,则可考虑将资源节移至文件最后)

用cswhu.ico文件的图像数据(28开始至最后全部内容),替换PE文件的icon0001结构。(从D4C0到D7A8)

将icon文件的icondir字段(20字节)复制到pe文件相应位置,将dwImageOffset修改为nID(1),即将16改为01。

保存文件,发现图标已改变且可以正常使用。


②熟悉eXeScope工具的实用,并利用该工具汉化PEview.exe程序。
打开文件菜单栏,将“open”改为“打开”。

发现成功汉化一处,以此类推即可完成所有汉化。(这里就比较坑,并没有手动全部汉化的方法,只能一项一项改)

5. 课后思考
①如何打造最小的PE文件:修改WHU_PE-2.5.exe文件,保持该文件的功能不变,使得该文件大小尽可能小。
将文件和内存对其粒度调整至最小(0004);可选文件头中只保留引入目录表项;节表也可删除;引入函数直接通过序号引入无需储存函数名字符串。
②替换程序的图标时,如果新图标比原有图标大,应该如何解决?
将资源节移至文件最后进行修改,保证数据多出部分不会影响到其他部分的数据。
③如何给一个没有图标的程序(如hello-2.5.exe),添加一个图标?
首先添加一个资源节表,需修改相应的数据(如节的数目、所占内存大小、节的大小等)。
再添加资源节,资源节的结构要一个一个进行添加,因为每个结构都包含相邻结构的起始位置等信息,是紧密相连的。
网友评论