Windows PE导出表编程2(重组导出表函数地址)

本次要做的尝试是通过修改导出表的函数地址,实现程序功能的更改,实现这个最大的限制就是堆栈平衡问题。

先写一个DLL和EXE为了测试。

DLL代码如下:

Windows PE导出表编程2(重组导出表函数地址)

这样的话有两个导出函数(我们假设是一个密码验证之后执行的函数):

Windows PE导出表编程2(重组导出表函数地址)

EXE测试代码如下:

Windows PE导出表编程2(重组导出表函数地址)

也就是简单模拟下DLL调用,默认情况下因为密码错误,所以执行结果是这样:

Windows PE导出表编程2(重组导出表函数地址)

然后开始一步一步分析处理问题:

1.确定需要替换函数堆栈平衡

首先IDA看下两个导出函数的调用堆栈,也就是看下参数是否一样,不然直接调换位置会导致函数调用之后堆栈不平衡:

Windows PE导出表编程2(重组导出表函数地址)

Windows PE导出表编程2(重组导出表函数地址)

可以确定,这两个函数的调用堆栈相同,可以直接替换。

2.从PE头开始,一步一步找到导出函数地址数组(AddressOfFunctions)

Windows PE导出表编程2(重组导出表函数地址)

可以知道导出表的地址和大小,这个地址是RVA,根据这个RVA可以计算出来FOA。RVA-FOA之间的转换我写过总结,还写了个工具当时。需要的可以翻翻我上传的东西。这里不细说直接计算:

Windows PE导出表编程2(重组导出表函数地址)

这样0xCF30的位置应该是存的导出表相关。找到这个位置:

Windows PE导出表编程2(重组导出表函数地址)

黑色部分是对应的如下这个结构:

Windows PE导出表编程2(重组导出表函数地址)

红色框部分就是倒数第三个,导出函数地址RVA,继续计算FOA

Windows PE导出表编程2(重组导出表函数地址)

然后找到FOA 0xCF58处的一个DWORD数组,这个存的是导出函数地址,RVA。

Windows PE导出表编程2(重组导出表函数地址)

最后把这两个地址进行交换就行了。然后运行测试exe,实现错误密码登录成功,当然这只是个演示程序,如果是实现功能的话,还可以直接OD加载进来,跑一下,在IF的地方把汇编代码的比较函数改了就行了。这个在WindowsPE的第一节我就写过操作流程,这里不细说了。

Windows PE导出表编程2(重组导出表函数地址)

最后就是我写完这些分析的时候发现有点SB了,咱们来看下这个:

Windows PE导出表编程2(重组导出表函数地址)

其实可以直接根据那个提供的地址,得到下面的两个地址,没看错的话,应该是一个是VA,一个是RVA,基址是10000000。稍等我去查下:

Windows PE导出表编程2(重组导出表函数地址)

woc基址还真是这个。这样的话直接全局搜索这个地址然后替换就行了啊。额...不过没事。毕竟是为了学习吗。无所谓了。为了方便一些不太了解导出表的小伙伴,我最后在传一个导出表的结构吧。如果看不懂了可以看下这个结构理解下:

Windows PE导出表编程2(重组导出表函数地址)

上一篇:trace与代码跟踪服务


下一篇:C/C++之指针加减法