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 PE 第八章 延迟加载导入表的更多相关文章
- Windows PE 第四章 导入表
第四章 导入表 导入表是PE数据组织中的一个很重要的组成部分,它是为实现代码重用而设置的.通过分析导入表数据,可以获得诸如OE文件的指令中调用了多少外来函数,以及这些外来函数都存在于哪些动态链接库里等 ...
- Oracle11g在Windows和Linux下imp导入表,exp导出表,sqluldr2导出表,sqlldr导入表
Windows(Win10) 打开cmd 首先输入sqlplus,依次输入用户名.口令 C:\Users\hasee>sqlplus SQL*Plus: Release Production o ...
- PE文件学习(2)导入表导出表
转自:evil.eagle https://blog.csdn.net/evileagle/article/details/12176797 导出表是用来描述模块中的导出函数的结构,如果一个模块导出了 ...
- 《初识PE》导入表
最近听别人讲的我晕晕乎乎的,于是上网上百度下,感觉这篇还不错. 链接:http://www.blogfshare.com/pe-export.html 一.导入表简介 在编程中常常用到"导 ...
- 小甲鱼PE详解之输入表(导入表)详解(PE详解07)
捷径并不是把弯路改直了,而是帮你把岔道堵上! 走得弯路跟成长的速度是成正比的!不要害怕走上弯路,弯路会让你懂得更多,最终还是会在终点交汇! 岔路会将你引入万劫不复的深渊,并越走越深…… 在开始讲解输入 ...
- 利用PE数据目录的导入表获取函数名及其地址
PE文件是以64字节的DOS文件头开始的(IMAGE_DOS_HEADER),接着是一段小DOS程序,然后是248字节的 NT文件头(IMAGE_NT_HEADERS),NT的文件头位置由IMAGE_ ...
- PE文件结构详解(五)延迟导入表
PE文件结构详解(四)PE导入表讲 了一般的PE导入表,这次我们来看一下另外一种导入表:延迟导入(Delay Import).看名字就知道,这种导入机制导入其他DLL的时机比较“迟”,为什么要迟呢?因 ...
- PE文件 01 导入表
0x01 导入表结构 数据目录表中的第二个成员标记了导入表的RVA和Size大小,由此可以定位到导入表: typedef struct _IMAGE_DATA_DIRECTORY { DWORD ...
- PE文件结构详解(四)PE导入表
PE文件结构详解(二)可执行文件头的最后展示了一个数组,PE文件结构详解(三)PE导出表中解释了其中第一项的格式,本篇文章来揭示这个数组中的第二项:IMAGE_DIRECTORY_ENTRY_IMPO ...
随机推荐
- threejs 基础概要
threejs 基础概要 点击查看官方文档 下面是翻译的内容(稍作修改) 先了解一下Three.js应用程序的结构.Three.js应用程序需要创建一堆对象并将它们连接在一起.下图表示一个小three ...
- 扩展欧几里得算法(EXGCD)学习笔记
0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...
- css导航条的设计
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- PTA 统计二叉树度为1的结点个数
6-3 统计二叉树度为1的结点个数 (10 分) 本题要求实现一个函数,可统计二叉树中度为1的结点个数. 函数接口定义: int NodeCount ( BiTree T); T是二叉树树根指针, ...
- 攻防世界 reverse android-app-100
android-app-100 suctf-2016 jeb启动,找到点击事件: 验证流程: 输入作为参数 --> processObjectArrayFromNative 得到一返回值(r ...
- exe取消动态基址
动态基址开启后,在动态调试是想要和ida静态分析中的地址对应还要进行一步计算,取消动态基址便可以剩下很多时间. 只要修改pe文件头中的Characteristics低位置1 1 typedef str ...
- sqli-labs系列——第一关
先看了一遍关于sql的一些知识点,通关sqli-labs加深下印象.之前也因为作业的原因通关过前10关,但那时候不懂得原理,跟着网上的教程做的,所以这次尝试自己思考通关. less1 尝试and1=2 ...
- 你才不是只会理论的女同学-seata实践篇
本文主要内容为seata的实践篇,理论知识不懂的请参考前文: 我还不懂什么是分布式事务 主要介绍两种最常用的TCC和AT模式. 环境信息: mysql:5.7.32 seata-server:1.4. ...
- 启用reuse_port参数让Nginx性能提升3倍
为什么启用 reuse_port 记得 2008 年做性能测试的时候,新进7台 lenovo 4核4G 服务器用于性能测试. 当时资源紧张,这7台服务器都装了双系统(Win2003/CentOS5)空 ...
- 翻译:《实用的Python编程》08_03_Debugging
目录 | 上一节 (8.2 日志) | 下一节 (9 包) 8.3 调试 调试建议 假设程序崩溃了: bash % python3 blah.py Traceback (most recent cal ...