Windows PE 第八章 延迟加载导入表
延迟加载导入表
延迟加载导入表是PE中引入的专门用来描述与动态链接库延迟加载相关的数据,因为这些数据所引起的作用和结构与导入表数据基本一致,所以称为延迟加载导入表。
延迟加载导入表和导入表是相互分离的。一个PE文件中可以同时存在这两种数据,也可以单独存在一种。延迟加载导入表是一种特殊类型的导入表。同导入表一样,它记录了应用程序想要导入的部分或全部动态链接库及相关函数信息。与导入表不同的是,它记录的这些动态链接库并不会被操作系统的PE加载器加载,只有等到由其等级的相关函数被应用程序调用时,PE中注册的延迟加载函数才会根据延迟加载导入表中对该函数的描述,动态加载相关链接库并修正函数VA地址,,实现对函数的调用。
8.1 延迟加载导入表的概念及其作用
写代码时静态加载了XXX.dll,如果这个DLL不在,那么当进入主函数之前就会先弹错误窗:
主函数入口的那个 main start不会被输出,注意这个特点,可以利用这个东西进行代码加密,然后在DLL的入口函数里进行内存解密就OK了,有点像之前说的那么TLS的思路。
如果延迟加载了,就会在调用的时候去找这个东西。
如果没采用延迟加载的反汇编代码是这样的:
采用了延迟加载的是这样:
还有其他很多特征,比如如果采用了延迟加载,在导入的函数的dll里是没有下面的那个的:
然后说下作用,这个姿势有很多应用的,平时我只是拿来免杀什么的,其实注意一点,要是免杀的话这个效果不如直接动态加载,因为虽然导入表里看不到了,PE头里面有一个延迟加载导入表结构的,貌似是这个:
先不管那些,说下正经的应用:
(1)提高应用程序速度
这个好理解,如果你的EXE里静态加载了100个dll,当程序刚刚加载到内存运行的时候,会把这些dll的所有入口函数都先调用一遍,如果入口里面又做了这个功能,那个功能,那就蛋疼了。
如果像上面那样的话,程序是静态加载dll的话,还没等输出main start程序就自动退出了,so,这个地方突然想到了可以通过hijack做一个程序强退的功能,但是和保护镜像劫持的注册表一样,有很多路径直接就保护着呢,扯远了。
(2)提高兼容性
大概就是下面的这个样子,采用延迟加载dll,然后可能存在dll不存在,或者dll里面没这个函数的时候就直接SEH处理了。
(3)提高应用程序可整合性
书中说的可整合性就是程序独立性,比如一个程序A.exe带着一个A.dll一起干活,作者的意思是可以直接采用延迟加载,然后把A.dll资源方式添加到A.exe里,然后释放出来,干活。这...感觉没什么亮点,既然真喜欢整合就直接干脆不释放出来,导到内存里内存加载执行就行了,顺便把PE特性改下,不留痕迹,这个前几天单独写了一个博客说这个思路。有兴趣的可以找找。
然后后面就是对延迟加载导入表进行PE结构分析和基本编程。这里就不细说了,营养不多。
相关文章
- Windows下Nginx的启动、停止等命令&Nginx 配置多域名&windows下设置Nginx开机自动启动
- 两代 Windows 性能大比拼!Win8 完胜 Win7
- 通过cmd 使用 InstallUtil.exe 命令 操作 windows服务 Windows Service
- 如何实现Windows Phone代码与Unity相互通信(插件方式)
- windows插件框架下载地址
- 在Windows 10上自动清空回收站
- MFC Windows 程序设计[136]之文件属性统计(附源码)
- MFC Windows 程序设计[二十四]之windows目录展示(附源码)
- [FE] nvm-windows: Microsoft/NPM/Google 推荐 Windows 的 Node.js 版本管理器
- 介绍一个 Windows 10 资源管理器的替代工具 - Explorer++
- windows系统下如何把excel数据转换成markdown格式的表格
- 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入
- Windows之Chocolatey:windows下的apt-get即Chocolatey简介、安装、使用方法之详细攻略
- Windows 7下VS2008升级补丁
- Windows 10下安装配置Caffe并支持GPU加速(修改版)
- 胶囊模型的代码在Windows下的测试,99.76%正确率
- C# 编写Windows Service(windows服务程序)
- 【汇总】Windows linux 敏感目录 路径汇总——主要是主机配置文件、web配置文件
- 向HIVE导入windows平台(dos类型)的日志