第十章:加载配置信息
加载配置信息表最初是用来存放附加信息,后来用来存放SEH各种导演句柄变成“异常处理表”
异常与中断类似,中断有点外部(键盘)发出,异常由软件,异常发生时跑到异常处理函数,这个函数存放在中断描述符表(IDT)的数据结构中。
异常:硬异常(系统异常)和软异常(程序自己抛出的异常)

;------------------------
; 测试异常处理
; 戚利
; 2011.1.19
;------------------------.386.model flat,stdcalloption casemap:noneinclude    windows.inc
include    user32.inc
includelib user32.lib
include    kernel32.inc
includelib kernel32.lib;数据段.data
szText     db  'HelloWorldPE',0
szErr      db  'SEH Error',0
;代码段.code_handler proc _lpException,_lpSEH,\_lpContext,_lpDispatcherContextnoppushadmov esi,_lpExceptionmov edi,_lpContextassume edi:ptr CONTEXTinvoke MessageBox,NULL,addr szErr,NULL,MB_OK    ;111mov [edi].regEip,offset _safePlaceassume edi:nothingpopad  ;测试一;发生的异常已被该函数接管mov eax,ExceptionContinueExecution;测试二;发生的异常未被该函数接管;mov eax,ExceptionContinueSearchret
_handler endpstart:assume fs:nothingpush offset _handlerpush fs:[0]mov fs:[0],espxor eax,eaxmov dword ptr [eax],eax_safePlace:pop fs:[0]pop eaxinvoke MessageBox,NULL,addr szText,NULL,MB_OK    ;222invoke ExitProcess,NULLend start
//111,222两处弹框
 
<pre class="plain" name="code">;------------------------
; 测试异常处理
; 戚利
; 2011.1.19
;------------------------.386.model flat,stdcalloption casemap:noneinclude    windows.inc
include    user32.inc
includelib user32.lib
include    kernel32.inc
includelib kernel32.lib;数据段.data
szText     db  'HelloWorldPE',0
szErr      db  'SEH Error',0
;代码段.code_handler proc _lpException,_lpSEH,\_lpContext,_lpDispatcherContextnoppushadmov esi,_lpExceptionmov edi,_lpContextassume edi:ptr CONTEXTinvoke MessageBox,NULL,addr szErr,NULL,MB_OK    ;111mov [edi].regEip,offset _safePlaceassume edi:nothingpopad  ;测试一;发生的异常已被该函数接管;mov eax,ExceptionContinueExecution;测试二;发生的异常未被该函数接管mov eax,ExceptionContinueSearchret
_handler endpstart:assume fs:nothingpush offset _handlerpush fs:[0]mov fs:[0],espxor eax,eaxmov dword ptr [eax],eax_safePlace:pop fs:[0]pop eaxinvoke MessageBox,NULL,addr szText,NULL,MB_OK    ;222invoke ExitProcess,NULLend start
//111弹两次,222弹一次
<pre class="plain" name="code">;------------------------
; 测试异常处理
; 指定了一个safe SEH Handler
; 并测试该异常处理函数,运行后会显示两个提示信息
; 一个是异常处理函数的提示信息,
; 另外一个是异常被处理后主程序的提示信息
; 戚利
; 2011.2.15
;------------------------.386.model flat,stdcalloption casemap:noneinclude    windows.inc
include    user32.inc
includelib user32.lib
include    kernel32.inc
includelib kernel32.lib;数据段.data
szText1     db  'safeHandler!',0
szText2     db  'nosafeHandler!',0
szText      db  'HelloWorldPE',0;代码段.code;IMAGE_LOAD_CONFIG_STRUCT STRUCTCharacteristics dd                  00000048hTimeDateStamp dd                    0MajorVersion dw                     0MinorVersion dw                     0GlobalFlagsClear dd                 0GlobalFlagsSet dd                   0CriticalSectionDefaultTimeout dd    0DeCommitFreeBlockThreshold dd       0DeCommitTotalFreeThreshold dd       0LockPrefixTable dd                  0MaximumAllocationSize dd            0VirtualMemoryThreshold dd           0ProcessHeapFlags dd                 0ProcessAffinityMask dd              0CSDVersion dw                       0Reserved1 dw                        0EditList dd                         0SecurityCookie dd                  00000000hSEHandlerTable dd                  offset safeHandler ;(VA地址)SEHandlerCount  dd                 00000001h
;IMAGE_LOAD_CONFIG_STRUCT ENDS;构造RVA
safeHandler      dd    offset _handler1-00400000hdd    0;-------------------------------------------
; 已注册的异常回调函数
;-------------------------------------------
_handler1 proc _lpException,_lpSEH,\_lpContext,_lpDispatcherContextnoppushadmov esi,_lpExceptionmov edi,_lpContextassume edi:ptr CONTEXTinvoke MessageBox,NULL,addr szText1,NULL,MB_OK      ;111mov [edi].regEip,offset _safePlaceassume edi:nothingpopad  mov eax,ExceptionContinueExecutionret
_handler1 endp;-------------------------------------------
; 未注册的异常回调函数
;-------------------------------------------
_handler2 proc _lpException,_lpSEH,\_lpContext,_lpDispatcherContextnoppushadmov esi,_lpExceptionmov edi,_lpContextassume edi:ptr CONTEXTinvoke MessageBox,NULL,addr szText2,NULL,MB_OKmov [edi].regEip,offset _safePlaceassume edi:nothingpopad  mov eax,ExceptionContinueExecutionret
_handler2 endpstart:assume fs:nothingpush offset _handler1push fs:[0]mov fs:[0],espxor eax,eax  ;引发越界异常mov dword ptr [eax],eax_safePlace:pop fs:[0]pop eaxinvoke MessageBox,NULL,addr szText,NULL,MB_OK ;222invoke ExitProcess,NULLend start
//111,222各弹一次
<p>;------------------------
; 测试异常处理
; 与exception4.asm不同之处,注册的异常处理程序为_handler2
; safe Handler列表中两个函数都进行了注册
; 戚利
; 2011.1.19
;------------------------
.386
.model flat,stdcall
option casemap:none</p><p>include    windows.inc
include    user32.inc
includelib user32.lib
include    kernel32.inc
includelib kernel32.lib</p><p>;数据段
.data
szText1     db  'safeHandler!',0
szText2     db  'Second safeHandler!',0
szText      db  'HelloWorldPE',0</p><p>;代码段
.code</p><p>;IMAGE_LOAD_CONFIG_STRUCT STRUCT
Characteristics dd                  00000048h
TimeDateStamp dd                    0
MajorVersion dw                     0
MinorVersion dw                     0
GlobalFlagsClear dd                 0
GlobalFlagsSet dd                   0
CriticalSectionDefaultTimeout dd    0
DeCommitFreeBlockThreshold dd       0
DeCommitTotalFreeThreshold dd       0
LockPrefixTable dd                  0
MaximumAllocationSize dd            0
VirtualMemoryThreshold dd           0
ProcessHeapFlags dd                 0
ProcessAffinityMask dd              0
CSDVersion dw                       0
Reserved1 dw                        0
EditList dd                         0
SecurityCookie dd                  00000000h
SEHandlerTable dd                  offset safeHandler ;(VA地址)
SEHandlerCount  dd                 00000002h
;IMAGE_LOAD_CONFIG_STRUCT ENDS</p><p>;构造RVA
safeHandler      dd    offset _handler1-00400000h
dd    offset _handler2-00400000h
dd    0</p><p>
;-------------------------------------------
; 已注册的异常回调函数1
;-------------------------------------------
_handler1 proc _lpException,_lpSEH,\
_lpContext,_lpDispatcherContext
nop
pushad
mov esi,_lpException
mov edi,_lpContext
assume edi:ptr CONTEXT</p><p>  invoke MessageBox,NULL,addr szText1,NULL,MB_OK</p><p>  mov [edi].regEip,offset _safePlace
assume edi:nothing</p><p>  popad  </p><p>  mov eax,ExceptionContinueExecution
ret
_handler1 endp</p><p>;-------------------------------------------
; 以注册的异常回调函数2
;-------------------------------------------
_handler2 proc _lpException,_lpSEH,\
_lpContext,_lpDispatcherContext
nop
pushad
mov esi,_lpException
mov edi,_lpContext
assume edi:ptr CONTEXT</p><p>  invoke MessageBox,NULL,addr szText2,NULL,MB_OK ;111</p><p>  mov [edi].regEip,offset _safePlace
assume edi:nothing</p><p>  popad
mov eax,ExceptionContinueExecution
ret
_handler2 endp</p><p>start:
assume fs:nothing
push offset _handler2
push fs:[0]
mov fs:[0],esp</p><p>    xor eax,eax  ;引发越界异常
mov dword ptr [eax],eax</p><p>_safePlace:</p><p>    pop fs:[0]
pop eax</p><p>    invoke MessageBox,NULL,addr szText,NULL,MB_OK ;222
invoke ExitProcess,NULL
end start</p>
///111,222各弹一次
 
<p>;------------------------
; 测试异常处理
; 与exception4.asm相比,该程序中调用了未注册的异常处理函数_handler2
; 戚利
; 2011.1.19
;------------------------
.386
.model flat,stdcall
option casemap:none</p><p>include    windows.inc
include    user32.inc
includelib user32.lib
include    kernel32.inc
includelib kernel32.lib</p><p>;数据段
.data
szText1     db  'safeHandler!',0
szText2     db  'nosafeHandler!',0
szText      db  'HelloWorldPE',0</p><p>;代码段
.code</p><p>;IMAGE_LOAD_CONFIG_STRUCT STRUCT
Characteristics dd                  00000048h
TimeDateStamp dd                    0
MajorVersion dw                     0
MinorVersion dw                     0
GlobalFlagsClear dd                 0
GlobalFlagsSet dd                   0
CriticalSectionDefaultTimeout dd    0
DeCommitFreeBlockThreshold dd       0
DeCommitTotalFreeThreshold dd       0
LockPrefixTable dd                  0
MaximumAllocationSize dd            0
VirtualMemoryThreshold dd           0
ProcessHeapFlags dd                 0
ProcessAffinityMask dd              0
CSDVersion dw                       0
Reserved1 dw                        0
EditList dd                         0
SecurityCookie dd                  00000000h
SEHandlerTable dd                  offset safeHandler ;(VA地址)
SEHandlerCount  dd                 00000001h
;IMAGE_LOAD_CONFIG_STRUCT ENDS</p><p>;构造RVA
safeHandler      dd    offset _handler1-00400000h
dd    0</p><p>
;-------------------------------------------
; 已注册的异常回调函数
;-------------------------------------------
_handler1 proc _lpException,_lpSEH,\
_lpContext,_lpDispatcherContext
nop
pushad
mov esi,_lpException
mov edi,_lpContext
assume edi:ptr CONTEXT</p><p>  invoke MessageBox,NULL,addr szText1,NULL,MB_OK</p><p>  mov [edi].regEip,offset _safePlace
assume edi:nothing</p><p>  popad  </p><p>  mov eax,ExceptionContinueExecution
ret
_handler1 endp</p><p>;-------------------------------------------
; 未注册的异常回调函数
;-------------------------------------------
_handler2 proc _lpException,_lpSEH,\
_lpContext,_lpDispatcherContext
nop
pushad
mov esi,_lpException
mov edi,_lpContext
assume edi:ptr CONTEXT</p><p>  invoke MessageBox,NULL,addr szText2,NULL,MB_OK</p><p>  mov [edi].regEip,offset _safePlace
assume edi:nothing</p><p>  popad
mov eax,ExceptionContinueExecution
ret
_handler2 endp</p><p>start:
assume fs:nothing
push offset _handler2
push fs:[0]
mov fs:[0],esp</p><p>    xor eax,eax  ;引发越界异常
mov dword ptr [eax],eax</p><p>_safePlace:</p><p>    pop fs:[0]
pop eax</p><p>    invoke MessageBox,NULL,addr szText,NULL,MB_OK
invoke ExitProcess,NULL
end start</p>//一个都不弹 因为没有加入SEH框架中的异常处理函数未在PE映像的加载配置信息表中定义。
;------------------------
; 测试异常处理
; 戚利
; 2011.1.19
;------------------------.386.model flat,stdcalloption casemap:noneinclude    windows.inc
include    user32.inc
includelib user32.lib
include    kernel32.inc
includelib kernel32.lib;数据段.data
szText     db  'HelloWorldPE',0
szErr      db  'SEH Error',0
;代码段.code_handler proc _lpException,_lpSEH,\_lpContext,_lpDispatcherContextnoppushadmov esi,_lpExceptionmov edi,_lpContextassume edi:ptr CONTEXTinvoke MessageBox,NULL,addr szErr,NULL,MB_OK    ;111mov [edi].regEip,offset _safePlaceassume edi:nothingpopad  ;测试一;发生的异常已被该函数接管;mov eax,ExceptionContinueExecution;测试二;发生的异常未被该函数接管mov eax,ExceptionContinueSearchret
_handler endpstart:assume fs:nothingpush offset _handlerpush fs:[0]mov fs:[0],espxor eax,eaxmov dword ptr [eax],eax_safePlace:pop fs:[0]pop eaxinvoke MessageBox,NULL,addr szText,NULL,MB_OK    ;222invoke ExitProcess,NULLend start
//111弹两次,222弹一次

PE学习(十)第十章: 加载配置信息表相关推荐

  1. Windows PE 第十章 加载配置信息

    加载配置信息 加载配置信息最初最用在Windows NT操作系统中,作为文件头部的延伸部分,后来被用作异常处理.加载配置信息表中存放了基于结构化异常处理(SEH)技术的各项异常句柄.当程序运行发生异常 ...

  2. PyTorch框架学习十九——模型加载与保存

    PyTorch框架学习十九--模型加载与保存 一.序列化与反序列化 二.PyTorch中的序列化与反序列化 1.torch.save 2.torch.load 三.模型的保存 1.方法一:保存整个Mo ...

  3. springboot 加载配置信息(静态)

    springboot 加载配置信息(静态) 举例:动态设置验证码过期时间 application-uat.properties配置(文件路径:/src/main/resources/applicati ...

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

    正常的话我们启用的 chrome 浏览器是不带插件的,如果你能登陆 chrome 的话,你会发现登陆信息也没有,还有不管你怎样设置每次新打开的 chrome 都是默认设置的. 我们正常启动的浏览器每次 ...

  5. 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用

    https://blog.csdn.net/qq_41157588/article/details/106737191

  6. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  7. java自定义上下文对象_Java框架_Spring应用上下文对象加载配置

    我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的? Spring容器是IOC容器的一种,它通过Applicati ...

  8. 大话PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置...

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

  9. OpenCV学习2--图片的加载,修改与保存

    OpenCV学习2--图片的加载,修改与保存 转自https://blog.csdn.net/qq_16481211/article/details/79553335 之前安装配置好OpenCV的环境 ...

最新文章

  1. android获取元素路径,Appium元素定位(name、classname、相对路径、绝对路径\、list)...
  2. 图解Ubuntu 9.10 Alpha 6
  3. powerdesigner生成数据库文档
  4. implicit assignment of unexported field
  5. Python 管道与特征联合
  6. win7 安装mysql 5.7.9记录
  7. python map、filter、reduce
  8. 去BAT面试完的Mysql面试题总结(55道)
  9. 为什么雷军指责“华为不懂研发”?
  10. leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别
  11. php空数组添加,php 删除空数组
  12. 成年人才是走失比例最高的!今日头条发布走失人口数据报告
  13. CDN对互联网产业的价值和作用
  14. 计算机网络冲突窗口,计算机网络基础试题及答案
  15. 微信个人赞赏码怎么用?微信赞赏码使用教程详解
  16. 阿尔法蛋机器人tf卡_入手评价科大讯飞阿尔法蛋S阿尔法蛋智能机器人功能优缺点评测...
  17. IOS-启动图和开屏广告图,类似网易
  18. 为什么美团股价大跌:疫情影响、阿里竞争与模式弊病
  19. 微信朋友圈这样招生,才不会被屏蔽!(附实操案例)
  20. 安卓带步骤的手写签名(附源码)

热门文章

  1. HighNewTech之QAB:重新温读张首晟教授2018年8月演讲PPT《量子计算, 人工智能与区块链》
  2. Windows PowerShell:Windows PowerShell的简介、入门、使用方法之详细攻略
  3. Sql:成功解决将sql输出的datetime时间格式转为常规格式
  4. Keras之CNN:基于Keras利用cv2建立训练存储卷积神经网络模型(2+1)并调用摄像头进行实时人脸识别
  5. 【BZOJ】3456: 城市规划(多项式求ln)
  6. Spring基于Setter函数的依赖注入(DI)
  7. IntelliJ IDEA 修改包名
  8. $(document).ready() $(window).load 及js的window.onload
  9. .net之workFlow4.0学习
  10. Strut2判断是否是AJAX调用