学习心得--------关于seh(2)

SEH学习心得【2】- 关于FS段寄存器 —————— 关于PEB结构在http://blog.youkuaiyun.com/betabin/article/details/7481949中列出。 —————— 看SEH少不了FS段寄存器,关于其大概认识如下。 在不同的地址空间,FS段寄存器指向不同的内存段。线程运行在RING0(既系统级别)下,FS段值是0x3B(XP下的值,在2000下是0x38)。运行在RING3(用户级别)下,FS段值 阅读详情

                          关于seh(2)
     by sssa2000

马家爵被捕了,心中极度的痛苦呀。
Aaah说我中了毒,mydoom,我下了专杀工具,没发现,现在我变得异常警惕,连rundll32这个进程一看就关。
正题。

1、首先,怎么使用seh
    昨天我们说的是c++中封装好的东西,现在我们接触的是赤裸裸的seh哦。

    seh工作原理就是预先设置好处理异常的函数,然后如果有异常
    首先,要使用seh必须先设置处理异常的回调函数。

    怎么设置呢?很简单,3句就可以搞定:

      把回调函数的地址入栈  push offset _handler
      把fs:[0]入栈          push fs:[0]
      把esp存入fs:[0]       mov fs:[0],esp

     为什么要这样呢?这就要说说tib了。
     win32为每个线程定义一个线程信息块tib,这个结构中有一个
     Exceptionlist的指针,它是seh的链入口。

     这个指针指向一个EXCEPTION_REGISTRATION结构,定义如下:
     EXCEPTION_REGISTRATION STRUCT
     prev dd ?       ;前一个EXCEPTION_REGISTRATION的地址
     handler dd ?    ;回调函数的地址
     EXCEPTION_REGISTRATION ENDS

     有了这个结构才能把很多seh联结成链状,注意,这里讲的是基本节构,很多其他资料上还有其他的什么附加数据,那都是自己加上去的,最基本的就这两个。

     现在在来讲解前面的那三句
     由于tib永远载fs:[0] 所以,fs[0]指向的就是Exceptionlist指向的东西,也就是EXCEPTION_REGISTRATION。

     push fs:[0]  把fs:[0]入栈,这时候esp会指向压入的东西,为什么?先去复习一下汇编。 [esp]就是这个EXCEPTION_REGISTRATION的地址。
     这个时候,[esp+0]就是prev字段 [esp+4]是回调函数的地址

     mov fs:[0],esp
     esp放入fs:[0]。我们知道 现在的fs:[0]就是prev,他还没有被附值。现在的esp里面放的就是prev需要的地址,我们要做的就是把prev=esp


     好了,是不是觉得有点不好理解?
     如果第一次接触,那就不妨死记下来
              push offset _handler
              push fs:[0]
              mov fs:[0],esp
       这3句话,只需要把回调函数的名字变一下就可以了,随着以后的学习,你就会熟悉的,别急别急。

看看罗云彬这段代码:


  .386
  .model flat,stdcall
  option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include  windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  .const
szMsg  db '异常发生位置:%08X,异常代码:%08X,标志:%08X',0
szSafe  db '回到了安全的地方!',0
szCaption db 'SEH例子',0

  .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 错误 Handler
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Handler proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
  local @szBuffer[256]:byte

  pushad
  mov esi,_lpExceptionRecord
  mov edi,_lpContext
  assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
  invoke wsprintf,addr @szBuffer,addr szMsg,/
   [edi].regEip,[esi].ExceptionCode,[esi].ExceptionFlags
  invoke MessageBox,NULL,addr @szBuffer,NULL,MB_OK
;********************************************************************
; 将 EIP 指向安全的位置并恢复堆栈
;********************************************************************
  mov eax,_lpSEH
  push [eax + 8]
  pop [edi].regEip
  push [eax + 0ch]
  pop [edi].regEbp
  push eax
  pop [edi].regEsp
  assume esi:nothing,edi:nothing
  popad
  mov eax,ExceptionContinueExecution
  ret

_Handler endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Test  proc

;********************************************************************
; 在堆栈中构造一个 EXCEPTION_REGISTRATION 结构
;********************************************************************
  assume fs:nothing
  push ebp
  push offset _SafePlace
  push offset _Handler
  push fs:[0]
  mov fs:[0],esp
;********************************************************************
; 会引发异常的指令
;********************************************************************
  pushad
  xor ebp,ebp
  xor eax,eax
  mov dword ptr [eax],0
  popad  ;这一句将无法被执行
_SafePlace:
  invoke MessageBox,NULL,addr szSafe,addr szCaption,MB_OK
;********************************************************************
; 恢复原来的 SEH 链
;********************************************************************
  pop fs:[0]
  add esp,0ch
  ret

_Test  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
  invoke _Test
  invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  end start

 

这段代码我不解释,有一些我还要再下一讲说的,不懂得先记下,好好想一下,下一讲主要就讲一下关于seh的回调函数的问题


好了,现在离我们的目标进入ring0又进了一步,呵呵,虽说技术有点过时,对我们这些小菜还是很有用的,我也是在边学边写哦,cih进入ring0的代码我这几天随身携带,一有空就看,呵呵。  其实我一次写这么一点,是怕到时候我写不出来,延缓以下,呵呵呵。

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲到使用WidgetComponent和3DUI进行交互。然而,这种方法存在一个问题:为了让射线可视化,我们需要勾选“调试/显示调试”,这样才能在手柄上看到代表其指向的一条红色射线。但最关键的问题是,这个显示调试信息的功能只属于Debug调试模式,也就是说,一旦将项目正式打包发布,这条射线辅助线就没有了。如下图所示:我就觉得Unreal官方真的是有点过分了,这不应该是最基本的功能么?难道我们VR要在Debug模式下发布? 阅读详情

相关推荐

PMF5.0计算

EPA PMF5.0 计算步骤

nuistsy的博客 4541

栈溢出笔记1.10 基于SEH的栈溢出

上节中简单地讲述了SEH的原理及逻辑结构。本节,要继续讲述SEH的物理结构及如何利用它进行栈溢出。先来看SEH的物理结构。先回想上节中的图51,我们在程序停在gets函数输入的时候查看SEH链,看到了一大堆异常处理器,而当我们把断点设置在gets函数下一条语句的时候,其中很多没有了,这给我们一个直观的感觉:SEH链保存在栈上。下面,我们就来看看栈上的SEH链。我们使用的是example_10,即添加

hustd10的博客 9250

unet学习笔记(milesial/Pytorch-UNet)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 unet学习笔记(milesial/Pytorch-UNet)原理讲解unet_parts.py内容predict.py内容 所用到的代码Pytorch-UNet/predict.py at master · milesial/Pytorch-UNet ·GitHub 原理讲解 蓝/白色框表示 feature map; 蓝色箭头表示 3x3 卷积,用于特征提取; 灰色箭头表示skip-connection,用于特征融合; 红色箭头.

weixin_67138138的博客 2553

SEH示例2_5

;************************************************************************;*项目名称:Thread SEH示例      *;************************************************************************;*代码名称:Thread SEH_2_4.asm   

ljjue的专栏 727

金蝶云星空应用开发初级考试题目汇总

摘要:本文为金蝶云星空应用开发初级考试题目汇总

2401_86113757的博客 3799

如何在Hyper-V、Virtual PC等虚拟机中使用USB设备

今天网盾科技给大家分享一篇在Hyper-V、Virtual PC等虚拟机中使用USB Over network软件用USB设备的方法。 当前Hyper-V Server与Microsoft Virtual PC的虚拟机,不支持USB的设备,如果你有USB设备需要在虚拟机中使用,例如USB的加密狗、智能卡、网上银行的U盾等,可以通过USB Over Network软件,通过网络,使用USB设备。 USB Over Network是一款“客户/服务器”软件,是这么一款功能强大 USB 设备共享软件。它使用方

wangdunkeji_idc的博客 4998

学习心得----seh(4)

解读cih进入ring0的秘密   看了大家对前面几篇的评论,觉得有点怪异,看来大家对技术的追求还不是那么强烈,声明以下,我写的这些东西或许永远也不会对你的实际应用有帮助,这只是黑客们对技术的研究,如果你的愿望只是一般的编程,这篇文章不适合你。   这几天开始编一个游戏,以前没有接触过游戏编程,觉得很有意思,还有directX的编程,真得很爽,我估计也就几天的热情吧,呵呵。   还有,我知道我的老

sssa2000的专栏 1302

【AGC】【serverless】【云函数】云函数常见问题

1、云函数添加了AUTH触发器后,在用户执行注册、销户、登录、登出动作时,云函数的event对象会自动触发返回相应信息。比如我在“层”的压缩包里放了config/config.txt,那么我在云函数里怎么调用这个文件?层的目录是:/dcache/layer,函数的目录是/dcache/layer/func。在云函数里往云数据库里插入数据返回的是180000,这是正常吗?已经按照文档在后台对应的云函数里配置了,所需的AUTH触发器。层的用法和放在函数里的用法是相同的。云函数里的层如何调用?

华为开发者联盟 839

SEH学习心得【1】

(近日遇到大量SEH问题,所以觉得有必要好好研究研究。) 一、SEH的汇编实现 从实践入手,汇编实现SEH其实不难。简单点如下指令: push offset_exception_function_address push fs:[0] mov fs:[0], esp 二、SEH的简单理解 SEH(Structured Exception Handling),是Windows下

BetaBin 1907

《详细指南:本地部署Ollama大型模型的完整步骤》

通过本指南,您应该能够成功地在本地部署Ollama大型模型,并开始使用它进行各种AI任务。Ollama的易用性和高性能使其成为研究和开发的理想选择。Ollama是一个高性能的AI模型部署平台,支持在本地轻松部署大型语言模型。本指南将详细介绍如何在本地环境中部署Ollama,并运行一个大型模型。

eclipsercp的博客 3696

【学习系列】SAP RAP 17:RAP应用部署集成至Fiori Launchpad 【S4HC Public Edition】

本文详细介绍了在SAP S/4HANA Cloud环境中部署RAP应用集成到Fiori Launchpad的两种方法:使用BAS(SAP Business Application Studio)和VSCode。主要步骤包括:1)在BTP中配置Destination连接ES环境;2)设置信任关系;3)创建BAS开发空间;4)通过Fiori应用生成器部署RAP应用;5)创建IAM App、Business Catalog和Business Role;6)配置Launchpad Space和Pages。文章还提供

DeveloperMrMeng的博客 963

学习心得-------seh(3)

seh(3)   明天去郊外去春游,心里很兴奋哦。    上次贴了一段代码,里面的回调函数有一长串参数,现在解释一下:    _Handler  proc   _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext      _lpExceptionRecord指向EXCEPTION_RECORD结构。      _lpContext指向

sssa2000的专栏 1257

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

学习心得---关于seh(1)

                    关于seh(1)  好久就想写点东西了,无赖自己太懒了。好不容易写了篇进程插入得投了,还被退回来了,郁闷。    天天打游戏,玩奇迹,其实每天我都知道要好好学习,就是克制不住。正题。   大家看清楚了,这里写的不是SHE偶像组合,是结构化错误处理,不知道我有没有翻译错误。   其实以前我对这玩意儿重来不在乎,不就是try,catch么,有什么难的,这些天也看

sssa2000的专栏 1302

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

flex 一点学习心得 暂存

classic.wxml <view class='container'> <view class='chunk color1'>1</view> <view class='chunk color2'>2</view> &...

260

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

《ODAY安全:软件漏洞分析技术》学习心得

I will Make Impossible To I'm possible -----------LittleHann   看了2个多星期。终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现的感觉很不错,在学习的过程中,也增加了自己的信心。 这里希望做一个小小的总结,不是想说明自己有多牛逼,只是觉得学习应该是一个常思考,常总结的过程,分享一些学习overflow shell

萌萌的It人 www.itmmd.com 5164

《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

I will Make Impossible To I'm possible                     -----------LittleHann  benwen 看了2个多星期。终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现的感觉很不错,在学习的过程中,也增加了自己的信心。 这里希望做一个小小的总结,不是想说明自己有多牛逼,只是觉得学习应该是

mystudyblog0507的专栏 689

0day安全:软件漏洞分析技术 学习分析记录

这本书其实我2015.10就尝试开始看了,看到简单的栈溢出,就看不下去了 主要是当时功力不足,难以坚持下去,兴致也不是很高 当我兴致来了,我觉得我为我的目标必须得看下去 2017.03.02 基本看完,实践完 mark一下 我写在了我的另一个博客上,这里直接给出超链接吧 这个记录是从我第二次看这本书开始,所以前面的就没记录了 第一个缓冲区溢出的全过程实践

giantbranch的专栏 4763

又是一年过去了

  又是一年过去了。转眼已经大四。活了这么多年,终于要开始走向社会了。也不得不面对人生n个第一次。 第一次一个人做火车。第一次一个人出远门。第一次和别人合租。第一次正经工作……   看了一眼,发现自己的第一篇博客是2010-01-10 11:54。完成的。不知不觉在园子里面也混了将近一年了。看这这些文章,不禁又想总结这一年来的得与失。   我一直以来有一个很坏的习惯。不喜欢去那笔记录一下自己。...

weixin_30858241的博客 118

DiagramDesigner的学习心得一

DiagramDesigner是CodeProject上关于WPF的控件模板,移动拖放,改变控件大小,旋转的很好的文章。 在博客园博主周金根的博客上也有相应的介绍。它总共分四部分,每部分都循序渐进。 首先我们来讲第一部分,关于控件的移动,和改变大小,MoveAndResize. MoveResize项目运行起来的效果如下: 在MoveResize项目的window1.xaml中: ...

weixin_30509393的博客 416

python turtle基本语法_Python turtle学习笔记

Python turtle学习心得在Python实训周中,不但加深了以往对于Python基础语法的认识和运用,更重要的是,在原来的基础上,学到了新的东西。例如学会了Python基本图形绘制及turtle库的使用,这是Python学习上一个新的开始。首先,使用import turtle as 语句导入turtle 库,在调用turtle库中的函数,采用turtle.函数名() 的代码风格,利用 tu...

weixin_39616503的博客 845

树莓派3B+无显示器情况下——只用一根网线实现电脑远程控制的学习心得

目录Step1:共享网络Step2:安装树莓派系统Step3:确定树莓派IPStep4:连接树莓派Step5:修改软件源Step6:配置VNCStep7:安装VNC Viewer 这是我所有的东西,包括: 树莓派板子 一根网线 一个读卡器 Step1:共享网络 首先,让电脑连接上某个能上网的WIFI(即使没有路由器也没有关系),我这里连接到的是我们学校的寝室网,如下图1: 接下来,打开“控制...

qq_44701243的博客 3290

2017/7/24 学习心得 css3第二天

1、边框 1)边框圆角 单个圆角:水平半径,垂直半径 border-top-left-radius:60px 120px;//左上 border-bottom-left-radius:60px 120px;//左下 复合写法:水平半径/垂直半径 border-radius:60px 90px 90px 90px/px px px px; border-radius:30p

chiuwingyan的博客 327
上一篇: 学习心得---关于seh(1)
下一篇: 学习心得-------seh(3)
sssa2000
博客等级 码龄25年 8粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值