Windows PE 第十章 加载配置信息
加载配置信息
加载配置信息最初最用在Windows NT操作系统中,作为文件头部的延伸部分,后来被用作异常处理。加载配置信息表中存放了基于结构化异常处理(SEH)技术的各项异常句柄。当程序运行发生异常后,操作系统会根据异常处理类别对异常进行分发处理,并依据这些句柄实施程序流程的转向,保证系统能从异常中全身而退。
10.1 何为加载配置信息
加载配置信息结构是PE中定义的一种基本数据类型,最初仅用于Windows NT操作系统,定义一些供Windows NT操作系统加载PE时用到的一些附加信息。后来该部分含义发生了变化。不再定义加载用的配置信息,而是被专门用来定义基于SEH技术的相关数据。
如果PE中的该部分表中没有对应的异常类别处理函数句柄,操作系统将会调用其内核模式的异常分发函数终止应用程序的运行。这种安全设置主要是为了阻止因异常句柄导致的溢出被恶意程序利用,从而造成对系统的破坏。
通常情况下,连接器会提供一个默认的加载配置信息结构,该结构包含了预留的SEH数据。如果用户代码中提供了该结构,则必须由用户来完成设置新的预留SEH字段,否则连接器不会讲SEH数据加入到加载配置信息中。
10.2 Windows 结构化异常处理
就是说SEH的原理和调用,之前写核心编程笔记的时候整理过:
http://blog.csdn.net/u013761036/article/details/54234212 这里只说当时没有整理的部分。
Windows 异常分类
由于SEH使用了与硬件平台如果的数据指针,所以在不同的硬件平台上,SEH的实现方法是不同的。在X86平台上的SEH处理框架中,把异常分为两大类:
硬异常(系统异常)和软异常(程序自己抛出的异常)
1.硬异常,即系统异常,可以细分为三类:
(1)故障异常:因执行指令失败引起,比如除以0引发的异常,一起eip指向了不可执行的页面等。这一类异常是系统异常中最常见的。此类异常有一个共同点,那就是发生异常时自动压入栈的是失败指令的地址,而不是它的吓一跳指令地址,这样做的原因是:当从异常遍历过程返回时,可以重新执行一遍这条指令。
(2)陷阱异常:发生这类异常通常是因为执行了自陷指令,如使用指令”INT 3”而引发的异常。这一类异常的返回地址是自陷指令的下一条指令所在的地址。
(3)终止异常:硬件或者其他不可恢复的因素导致的异常等。通常只能重启。
2.软异常,所谓软异常,就是以函数调用的手段累模拟一次异常,即通过Windows提供的API函数RaiseException,执行函数引发软异常,实际上,在高级语言的异常处理模型中的大部分抛出异常的操作,最终都是对RaiseException函数的调用。
然后就是各种对SEH的使用啥的,之前总结过就不说了。但是在书上看到了一个概念区分,就是区分 中断和异常,异常可以理解成是程序内部的自发行为,中断则是外部导致的被动行为,所以我个人对 缺页中断的这个词的理解是,缺页异常导致的中断。
10.3 PE中的加载配置信息
这本书讲的是PE结构,自然这个才是他要说的重点,分析一个EXE的结构:
通过PE数据目录表定位到加载配置信息;然后,分析该部分数据对应的数据结构;最后,通过一个实例分析,描述了数据结构中每个字段与提取的字节码之间一一对应的关系。
10.3.1 加载配置信息定位
加载配置数据为数据目录注册的数据类型之一,其描述信息处于数据目录第11个目录项中。
为了避免SEH框架缓冲区溢出执行用户代码导致安全隐患,自XP系统以后的大部分系统中PE文件,如常见的记事本程序、kernel32.dll、user32.dll等都附加了加载配置信息。通常情况下,操作系统的加载器会根据数据目录表中定义的大小,来判断加载配置信息的类别。为了保持对Windows XP操作系统和以前的操作系统的兼容,通常此处的大小为64字节,即0x40。
10.3.2 加载配置信息目录IMAGE_LOAD_CONFIG_DIRECTORY
看下头文件里的定义:
10.3.3 加载配置信息实例分析
书上是直接分析的例子的一个文件,我这里没有,我就自己随便找一个文件分析吧,得到的数据不一样,但是思路和结构一样。
随便找一个平时的测试项目,注释了些代码:
OK先从PE头开始
得到两个东西,配置表地址RVA是0xF2C8,大小0x40。
然后计算FOA:
FOA=0xDCC8
然后直接看二进制信息:
得到这一步的时候我有点困惑,什么情况,大小是40的话定位到上面的黑色区域应该是啊,不过这数据也不科学啊,然后我以为是因为我自己没写SEH导致的,然后我就改了下代码:
同样的方式进行操作发现得到这个:
还是不对,然后就又看了下这个定义:
18*4=72=0x48 额...这也不是0x40啊!,但是
额...先不管这些,继续往下走。从这个继续走吧:
从最后safehandle地址是0x40F6E0(注意这个是VA) 个数是7。
按照这个:
那RVA应该是F6E0了,然后计算FOA.
到E0E0处找到这7个数据:
这七个数据是RVA,对应转换成VA然后在内存里直接看这些数据:
得到的是类似这样的东西,把这些机器码翻译成汇编然后再翻译成c的话对应的是7个异常处理回调函数的代码,注意和我上面写的那个__try..没关系。
然后我又尝试注册了一个SetUnhandledExceptionFilter(ExceptionFilter); 还是不行,难道是那个在__except里劫持异常类型的那个毁掉函数?这个之后在测试吧。今天没时间了。
下一章是讲动态加载,下一章不单独总结了,没什么新东西。
唯一设计到一个新东西就是 硬编码加载,其实就是直接通过偏移量加载 其他函数,也可以加载内部未导出的函数,这个在这里又更充分的总结:http://blog.csdn.net/u013761036/article/details/53933350里面我写了一个 把DLL私有函数导出的思路。里面有这方面相关。So下一章就直接跳过了,下次整理就直接整理PE变形那一章。
Windows PE 第十章 加载配置信息相关推荐
- PE学习(十)第十章: 加载配置信息表
第十章:加载配置信息 加载配置信息表最初是用来存放附加信息,后来用来存放SEH各种导演句柄变成"异常处理表" 异常与中断类似,中断有点外部(键盘)发出,异常由软件,异常发生时跑到异 ...
- springboot 加载配置信息(静态)
springboot 加载配置信息(静态) 举例:动态设置验证码过期时间 application-uat.properties配置(文件路径:/src/main/resources/applicati ...
- Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
正常的话我们启用的 chrome 浏览器是不带插件的,如果你能登陆 chrome 的话,你会发现登陆信息也没有,还有不管你怎样设置每次新打开的 chrome 都是默认设置的. 我们正常启动的浏览器每次 ...
- 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用
https://blog.csdn.net/qq_41157588/article/details/106737191
- 【Nginx】Nginx配置文件参数/启动参数详解;启动/停止/重新加载配置命令
nginx配置文件 nginx及其模块的工作方式是由配置文件指定,默认情况下配置文件被命名为nginx.conf并且存放在/usr/local/nginx/conf或者 /etc/nginx或者 /u ...
- springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置
本文地址: 使用 @ConfigurationProperties 在 Spring Boot 中加载配置 使用 Spring Boot 加载配置文件的配置非常便利,我们只需要使用一些注解配置一下就能 ...
- linux 文件重新运行,Linux锐速启动,停止,以及重新加载配置等操作参数说明
使用serverSpeeder 服务进行锐速的启动,停止,以及重新加载配置等操作:各参数说明如下: service serverSpeeder start :启动锐速,加载加速模块:使用/server ...
- Springboot 通过Apollo-client加载配置的过程
springboot 通过Apollo-client加载配置的过程 1.Apollo-client利用springboot的META-INF/spring.factories将ApolloApplic ...
- Asp .NetCore 从数据库加载配置(一)
一般来说,Asp .NetCore 应用从官方默认的appsetting.json文件中读取就好,而且利用option模式中的 IOptionsSnapSot<T>.IOptionsMon ...
最新文章
- javascript中replace使用方法总结
- 微型计算机基础 教案,第一章微型计算机基础知识新080902电子教案(153页)-原创力文档...
- Atheros AR9485 ubuntu 10.04 驱动安装及networking disable问题解决
- html文本长度不一样的对齐,关于html:文本在中间不对齐
- [AngularJS] Reusable directive, require from parent controller
- ArcGIS实验教程——实验四十:ArcGIS洪水淹没分析案例教程
- Java基础:int和Integer的区别
- 你知道,什么时候用Vue计算属性吗?
- oracle 传递table,将对象类型表从java传递到oracle 8i(Pass table of object type from java to oracle 8i)...
- 2019文都计算机网络百度云,2019计算机考研|计算机网络知识:计算机网络体系结构...
- 很多人不理解这个参数的 nl,nh:ESC * m nL nH d1... dk
- 福州“小年”年味浓 祭灶已成传统节俗
- WebRTC学习实现视频
- 腾达a9服务器无响应,腾达(Tenda)A9设置网站打不开怎么办?
- 串口通信协议--UART、RS-232、RS-485、RS-422
- Python分支,循环,break和continue
- 百度EasyDate线上协同数据标注平台使用
- 虚拟机能ping通,但是telnet某个端口却不行
- 关于mysql大于号小于号是否会使用到索引
- php如何识别flac文件,去伪存真 这几招教你辨析真假无损音乐