本节我们将通过三个实验来说明导出表的应用。实验一修改导出表中的函数地址。实验二直接替换导出函数的代码。实验三导出私有函数
本节必须掌握的知识点:
修改导出函数地址
替换导出函数代码
导出私有函数
5.3.1 修改导出函数地址
实验三十七:修改导出函数地址
![]()
修改winResult.dll导出结构中的函数地址。仅需要将导出函数调用的RVA地址交换位置,即可实现导出导出函数的覆盖。无需修改程序FirstWindow.exe,直接测试,发现显示窗口的动画效果发生了变化。
第一步:将winResult.dll拖入WinHex中,找到导出表,如下所示:
00001910 00 00 00 00 FF FF FF FF 00 00 00 00 60 25 00 00 ........`%..
00001920 01 00 00 00 04 00 00 00 04 00 00 00 38 25 00 00 ............8%..
00001930 48 25 00 00 58 25 00 00 F0 10 00 00 10 10 00 00 H%..X%..?......
00001940 C0 11 00 00 A0 12 00 00 6E 25 00 00 7B 25 00 00 ?..?..n%..{%..
00001950 87 25 00 00 92 25 00 00 00 00 01 00 02 00 03 00 ?..?..........
00001960 77 69 6E 52 65 73 75 6C 74 2E 64 6C 6C 00 41 6E winResult.dll.An
00001970 69 6D 61 74 65 43 6C 6F 73 65 00 41 6E 69 6D 61 imateClose.Anima
00001980 74 65 4F 70 65 6E 00 46 61 64 65 49 6E 4F 70 65 teOpen.FadeInOpe
00001990 6E 00 46 61 64 65 4F 75 74 43 6C 6F 73 65 00 00 n.FadeOutClose..
第二步:交换导出函数AnimateOpen和FadeInOpen的RVA地址,如下所示:
00001930 48 25 00 00 58 25 00 00 F0 10 00 00 C0 11 00 00 H%..X%..?......
00001940 10 10 00 00 A0 12 00 00 6E 25 00 00 7B 25 00 00 ?..?..n%..{%..
第三步:保存后,直接运行FirstWindow.exe。
![]()
总结
在使用导出函数地址覆盖技术的时候,首先要保证所涉及的两个函数参数入口要一致,否则调用完成后栈不平衡,这会导致应用程序调用失败;其次,要求用户对两个函数的内部实现要有充分的了解,使得地址转向后,能够保证应用程序在功能上可以全面兼容并运行良好。
5.3.2 替换导出函数代码
实验三十八:替换导出函数代码
![]()
我们还是以winResult.dll为例。找到导出函数FadelnOpen的代码,然后将其替换为MessageBox,弹出一个对话框窗口。无需修改程序FirstWindow.exe。
第一步:将winResult.dll拖入OD调试器,打开内存映射窗口,找到winResult.dll模块,如图所示:

图5-7 内存映射窗口
第二步:双击winResult.dll的.text节区,打开代码段,找到0x6D010000+0x000011C0地址处,即函数FadelnOpen的地址,如下所示:
6D0111C0 > 55 PUSH EBP
6D0111C1 8BEC MOV EBP,ESP
6D0111C3 83EC 38 SUB ESP,0x38
6D0111C6 A1 0430016D MOV EAX,DWORD PTR DS:[__security_cookie]
6D0111CB 33C5 XOR EAX,EBP
6D0111CD 8945 FC MOV DWORD PTR SS:[EBP-0x4],EAX
6D0111D0&nb

1164

被折叠的 条评论
为什么被折叠?



