加载配置信息

加载配置信息最初最用在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 第十章 加载配置信息的更多相关文章

  1. Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。

    Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息.   本文链接:https://blog.csdn.net/qq_38161040/art ...

  2. libfastcommon总结(二)从文件中加载配置信息

    头文件为ini_file_reader.h 主要接口 IniContext iniContext;//定义配置文件信息 iniLoadFromFile();//加载文件为结构化配置信息    iniG ...

  3. Java 使用properties配置文件加载配置

    一般我们不把数据库的配置信息写死在代码中. 写好代码后,编译.调试,成功后只把输出目录中的东西(jar包..class文件.资源文件等)拷贝到服务器上,由运维来管理.服务器上是没有源文件的(.java ...

  4. nginx windows下重新加载配置

    运行过程中,有个节点部分服务出现故障,像将其下线修复, 使用nginx -t; nginx -s reload 重新加载配置 得到错误"nginx: [error] OpenEvent(&q ...

  5. 安装Windows 2008 操作系统时加载ServeRAID-MR10系列阵列卡驱动

    安装Windows 2008 操作系统时加载ServeRAID-MR10系列阵列卡驱动 适用机型: 所有System x3200 M2; 所有System x3250 M2; 所有System x33 ...

  6. ecshop 工作流程加载配置介绍

    ecshop 工作流程加载配置介绍 分类: ecshop2014-09-14 09:36 729人阅读 评论(2) 收藏 举报 模板引擎工作流 这里简单介绍下echsop工作流程: 首先,你会发现一般 ...

  7. 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?

    Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...

  8. mybatis源码分析--如何加载配置及初始化

    简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...

  9. Viper解析&加载配置

    Viper解析&加载配置 1    Viper是什么 Viper是一个方便Go语言应用程序处理配置信息的库.它可以处理多种格式的配置.它支持的特性: 设置默认值 从JSON.TOML.YAML ...

随机推荐

  1. LNMP配置——Nginx配置 ——域名重定向

    一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ...

  2. BuaacodingT141 microhhh的回城 题解(模拟)

    题目链接 microhhh的回城 解题思路 这题挺有意思的.本来寻思放在\(DS\)第一次练习赛应该不会很难吧,结果愣是卡在数据范围上写不出来. 然后暴力过掉了,但是用了\(1019ms\).感觉可以 ...

  3. ACM常用的C++ && STL

    内容 c++输入输出 c++ string vector:不定长数组 map:映射 queue:队列 sort:排序 priority_queue:优先队列 c++输入输出 1 #include &l ...

  4. Python中树的遍历-堆排序

    1.二叉树的遍历 遍历:迭代所有元素一遍. 树的遍历:对树中所有的元素不重复的访问一遍,也成扫描 广度优先遍历:层序遍历 深度优先遍历:前序.中序.后续遍历. 遍历序列:将树中所有元素遍历一遍后,得到 ...

  5. 谜题(JAVA语言)

    package 第三章习题; /*  * 有一个5*5的网络,其中恰好有一个格子是空的,其他格子各有一个字母.  * 一个有4种指令:A, B, L, R, 分别表示把空格上.下.左.右的相邻字母移到 ...

  6. 攻防世界 reverse tt3441810

    tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...

  7. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream

    该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...

  8. Redis实战篇(三)基于HyperLogLog实现UV统计功能

    如果现在要开发一个功能: 统计APP或网页的一个页面,每天有多少用户点击进入的次数.同一个用户的反复点击进入记为 1 次,也就是统计 UV 数据. 让你来开发这个统计模块,你会如何实现? 如果统计 P ...

  9. Scrapy 5+1 ——五大坑附送一个小技巧

    笔者最近对scrapy的学习可谓如火如荼,虽然但是,即使是一整天地学习下来也会有中间两三个小时的"无效学习",不是笔者开小差,而是掉进了深坑出不来. 在此,给各位分享一下作为一名S ...

  10. python3使用myqr生成链接二维码

    技术背景 二维码技术在各个领域中都已经有非常成熟的应用,比如随处可见的二维码支付,比如疫情期间的绿码,再比如工业领域中,可以使用二维码作为定位的标签,大大提升了室内定位技术的精确度.二维码的格式内容大 ...