延迟加载导入表

延迟加载导入表是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 PE 第八章 延迟加载导入表的更多相关文章

  1. Windows PE 第四章 导入表

    第四章 导入表 导入表是PE数据组织中的一个很重要的组成部分,它是为实现代码重用而设置的.通过分析导入表数据,可以获得诸如OE文件的指令中调用了多少外来函数,以及这些外来函数都存在于哪些动态链接库里等 ...

  2. Oracle11g在Windows和Linux下imp导入表,exp导出表,sqluldr2导出表,sqlldr导入表

    Windows(Win10) 打开cmd 首先输入sqlplus,依次输入用户名.口令 C:\Users\hasee>sqlplus SQL*Plus: Release Production o ...

  3. PE文件学习(2)导入表导出表

    转自:evil.eagle https://blog.csdn.net/evileagle/article/details/12176797 导出表是用来描述模块中的导出函数的结构,如果一个模块导出了 ...

  4. 《初识PE》导入表

    最近听别人讲的我晕晕乎乎的,于是上网上百度下,感觉这篇还不错.  链接:http://www.blogfshare.com/pe-export.html 一.导入表简介 在编程中常常用到"导 ...

  5. 小甲鱼PE详解之输入表(导入表)详解(PE详解07)

    捷径并不是把弯路改直了,而是帮你把岔道堵上! 走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇! 岔路会将你引入万劫不复的深渊,并越走越深…… 在开始讲解输入 ...

  6. 利用PE数据目录的导入表获取函数名及其地址

    PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...

  7. PE文件结构详解(五)延迟导入表

    PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因 ...

  8. PE文件 01 导入表

    0x01  导入表结构  数据目录表中的第二个成员标记了导入表的RVA和Size大小,由此可以定位到导入表: typedef struct _IMAGE_DATA_DIRECTORY { DWORD ...

  9. PE文件结构详解(四)PE导入表

    PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...

随机推荐

  1. Python学习笔记 CH1-4:从入门到列表

    Python CH1 环境准备 因为已经有了C/C++.Java的基础,所以上手很快. 参考书:Eric Matthes -<Python编程 从入门到实践> 环境准备:python3.P ...

  2. 进阶Java多线程

    一.多线程创建方式 1.1.继承Thread类创建线程类 1.实现步骤 定义一个继承Thread类的子类,并重写该类的run()方法: 创建Thread子类的实例,即创建了线程对象: 调用该线程对象的 ...

  3. Python接口测试-保持登录状态

    #coding:utf-8import requestsimport json#登录url ="https://passport.cnblogs.com/user/signin"h ...

  4. Distributed Cache(分布式缓存)-SqlServer

    分布式缓存是由多个应用服务器共享的缓存,通常作为外部服务存储在单个应用服务器上,常用的有SqlServer,Redis,NCache. 分布式缓存可以提高ASP.NET Core应用程序的性能和可伸缩 ...

  5. JS逆向-抠代码的第一天【手把手学会抠代码】

    首先声明,本人经过无数次摸爬滚打及翻阅各类资料,理论知识极其丰富,但是抠代码怎么都抠不会. 无奈之下,只能承认:这个活,需要熟练度. 本文仅对部分参数进行解析,有需要调用,请自行根据现实情况调整. 第 ...

  6. MySQL基础知识:MySQL Connection和Session

    在connection的生命里,会一直有一个user thread(以及user thread对应的THD)陪伴它. Connection和Session概念 来自Stackoverflow的一个回答 ...

  7. python-自定义一个序列

    python的序列可以包含多个元素,开发者只要实现符合序列要求的特殊方法,就可以实现自己的序列 序列最重要的特征就是可以包含多个元素,序列有关的特使方法: __len__(self):该方法的返回值决 ...

  8. 创建Maven父子项目以及它们的优点

    此文引用:https://blog.csdn.net/zxl8876/article/details/104180133 创建maven父子项目 第一步创建父项目: 新建一个普通的maven项目 删除 ...

  9. 利用浏览器favicon的缓存机制(F-Cache)生成客户端浏览器唯一指纹

    利用浏览器favicon的缓存机制(F-Cache)生成客户端浏览器唯一指纹 首先介绍下: 这个技术出自 UIC论文:https://www.cs.uic.edu/~polakis/papers/so ...

  10. (数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...