本次是尝试调用DLL里面的私有函数。
一:
之前先探索一下,首先可以考虑用偏移量来调用,就是如果知道了某个私有函数和某个导出的公共函数的相对便宜的话,直接加载dll获取公共函数地址,然后自己手动去偏移调用就行了。先测试一发,就是根据MessageBoxA的地址来偏移到MessageBoxB的地址,然后去调用。
答案和预期的一样,是可以调用的,但是问题是上面的两个MessageBoxA和B都是导出函数,那如果偏移的是私有函数是否可以调用成功?接下来是实验这个。
二:
我自己写了一个dll代码如下:
编译之后看到的导出函数是FA,如下图。
然后简单调试一次,获得当时的三个函数的地址,计算出剩下的两个私有函数和导出函数的相对位置,结果如下。
dwFA = 1599737888
dwFB = 1599737936 48 0x30
dwFC = 1599737952 64 0x40
然后尝试调用一发,结果是和预期的一样的。下面是调用代码。
三:
最后来换个思路,我们直接尝试重构导出表来把私有函数编程导出函数,先是根据PE头计算RVA。。。等找到导出表位置及其内容,如下:
我翻译一下这些字段,如下:
本来是想整体把导出表换个位置,不过我看后面还有一大推空的位置,干脆就直接接在后面的了,也就是导出表的起始位置不变,大小和内容改变了,从新计算偏移以及添加导出函数名称,地址,序号等等,结果如下(这个地方倒腾了快1小时,虽然不难,但是要一点点算):
然后就是手动的把我们自己重组的导出表填在下面:
之后别忘记一件事,就是去PE头把导出表大小改了,一共是增加了0X1A大小。
大功告成,来看下结果:
噢耶,结果是自己想要的,开心。