dll 调用exe_exe改成dll实现动态链接

前言

生成exe后如果我们想要把它改成dll然后调用里面的函数的话,我们需要改掉PE头里的Characteristics属性,表明这是一个dll,然后改掉可选头里的入口点属性,让它在被LoadLibrary函数加载到内存的时候不去找DllMain函数,然后添加一个节区,把数据目录表中重定位表的RVA填上,然后手动构造重定位信息,然后再把各个size的统计信息给填上,就ojbk了,至于导出表,没有啥必要去构建,直接通过加载基址加偏移,调用就完事了。

正文

首先看下面的例子,编译成exe 测试的时候在项目属性->链接器->高级中关闭随机基址

#include#includevoid fuck(){  MessageBoxA(0,0,0,0);}int main(){  fuck();  return 0;}

这里fuck函数中需要重定位的只有调用MessageBoxA这里

PE头Characteristics属性

8021514e184de2f7e669331ef337f7f5.png

首先如图所示,把PE文件头里的Characteristics改为0x2102,表示这是一个dll文件

扩展PE头的AddressOfEntryPoint属性

2cebe8430e068a5fcc08f5c0d44b18f7.png

如图所示把这个属性改为0x00表示没有入口点,这样在dll加载的时候就只是加载dll,不会去执行dll里的代码

构建重定位信息

首先如图用addpebbytes这个工具增加一个区段  

806262fde0d4c18401a212373d6bf957.png

然后添加若干字节

然后可以看到最后一个区段的RVA是0x5000

e65d279cdbb253c7d9b18e931e5732dc.png

 如图所示我们在数据目录表里的重定位这一项里把RVA改成0x5000 这样就可以在最后一个节起始的位置构造重定位信息了,至于size属性,我们构造好了重定位信息再回来填上

c386935126058c23e766dfcbaab583ed.png

这里我们第一个四字节填入基地址,我们fuck函数的起始RVA就是0x1000,然后后面一个四字节是这一个重定位表的大小,四字节加四字节加后面的一个word类型的typeoffset就是10字节,最后一个word类型的成员包括4位的类型,这里是0x3,和一个12位的偏移,这里如下图数一下是8+2=10  

6f9d899c61e931e1f3a2f362f2b021fe.png

填好以后回去把数据目录表里的重定位项的size属性给填上,是0xA 如此填好,就可以实现链接了 新建一个工程,把改好的dll放进工程目录

#include#includeint main(){  HANDLE h=LoadLibrary(L"test.dll");  ((void(*)())((char*)h+0x1000))();  return 0;}

2ce95f9a5c09fa5e3b19501e0317f94f.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值