1. 实验目的和要求
分析PE文件的导出表结构,分析导出函数VA的获取过程,得出导出表结构;研究导出表的利用技术,尝试对DLL文件进行修改,即应用导出函数覆盖技术达到需求。
1. 实验步骤
问题1、利用Winhex查看Winresult.DLL 并分析其提供函数的名字及对应入口地址。画出导出表结构图(类似图2)。
从PE头的位置经过78H到这里,我们可以看到导入表的地址,以及导入表的大小

2140H为RVA,8FH是大小

根据节表,我们可以算出对应的FOV940H
以下框住的是导入表的每一个参数所对应的值

将2190H对应到文件是990H,我们可以看到990H这里写的是winresult.dll,也就是文件名

将2168H、2178G、2188H对应到文件FOV中


所以可以画出如下图

问题2、奇怪的EXE文件
2.1PEditor查看noimporttable.EXE的导入表,发现什么问题?

发现没有导入表
2.2PEdtior打开本机的kernel32.DLL,其导出表RVA?导出表大小?
搜索一下,我的电脑在以下的路径上
C:\Windows\WinSxS\wow64_microsoft-windows-kernel32_31bf3856ad364e35_10.0.22621.4391_none_7e0c0d510632f900\kernel32.dll

用winHex打开看看,发现也是如此

导出表的RVA为093E40H,大小为5EB8

这里看到我的系统这里有两个不同版本kernel32.dll上面看的是其中一个
2.3找到无导入表情况下需要的两个函数的名称及其入口地址(结合实验1问题7)。
这个程序最开始先去调用了,kernerl32.dll中运行我们这个程序的函数地址,所以第一步拿了栈顶的值,然后计算得到kernerl32.dll的基址,通过基址要得到GetProddress,通过这个函数去获得LoadLibrary函数的地址,再用LoadLibrary去加载user32.dll从而获得最终的messageBox,下图给出了kernel32.的基地址


这里我们下一个断点,根据eax会返回函数的地址,可以看到doword_401041这里存储的就是GetProcAddress的入口地址


事实就是如此,75EE8250是GetProcAddress的函数地址
而LoadLibrary的函数地址如下


下图是user32.dll的基地址

再从LoadLibrary加载user32.dll去拿到了messageBox的地址


问题3、实现两种方式的导出函数覆盖-1
修改winResult.dll导出结构中的函数入口地址,达到firstwindow.EXE以动画方式打开的效果。描述你所做的工作。
根据上面的分析,我们可以修改dll文件

最后保存就可以看到运行不再是用到之前的那两个函数,而是动画打开


问题4、实现两种方式的导出函数覆盖-2
覆盖fadeinopen函数的指令代码:使得运行firstwindow.EXE程序时会弹出messagebox。
用PEEditor计算找到fadeinopen函数在文件中的地址


可以算出是682H,在运行firstinopen在内存中可以发现,和我们在看dll在静态中的一摸一样

所以,如果我们把这个字节码改掉,就可以跳转到我们所想要函数,从而达到覆盖,这里我们复制的是其实是调用messagebox的操作,把对于调用messagebox的机器码覆盖到了fadeinopen


注意我这台电脑messageBox所在的地址在7596ADC0H,所以最后是C0AD9675

3. 实验小结
本次实验通过分析PE文件的导出表结构及应用导出函数覆盖技术,使我深入理解了PE文件格式的内部结构和动态链接机制。通过使用工具如WinHex和PEditor,我学会了如何提取DLL文件中的函数入口地址,并通过修改导出表或覆盖函数的机器码来改变程序行为。在分析没有导入表的EXE文件时,我了解了如何通过GetProcAddress和LoadLibrary等函数动态加载DLL并调用其中的函数。实验的后半部分,我通过修改DLL中的导出函数实现了程序行为的定制,如改变动画效果和弹出消息框。通过本次实验,我不仅加深了对逆向工程技术的理解,还提高了分析和修改二进制文件的能力。未来,我计划进一步学习更高级的逆向工程技术,提升在信息安全领域的实践能力。
No responses yet