当前位置: 首页 > news >正文

网站域名 格式网站为什么要seo

网站域名 格式,网站为什么要seo,重庆食品商城网站设计,农产品电商营销策划方案文章目录 VEHKiUserExceptionDispatcher函数分析代码实现添加VEH异常处理函数VEH异常的处理流程 SEHExceptionListRtlDispatchException函数的执行流程代码实现添加SEH异常处理函数SEH异常的处理流程 VEH 当用户异常产生后,内核函数KiDispatchException并不是像处理…

文章目录

    • VEH
      • KiUserExceptionDispatcher函数分析
      • 代码实现添加VEH异常处理函数
      • VEH异常的处理流程
    • SEH
      • ExceptionList
      • RtlDispatchException函数的执行流程
      • 代码实现添加SEH异常处理函数
      • SEH异常的处理流程

VEH

当用户异常产生后,内核函数KiDispatchException并不是像处理内核异常那样在0环直接处理,而是修正3环EIP为KiUserExceptionDispatcher函数后就结束了

这样,当线程再次回到3环时,将会从KiUserExceptionDispatcher函数开始执行

KiUserExceptionDispatcher函数分析

在ntdll中找到KiUserExceptionDispatcher函数

在这里插入图片描述

首先会调用RtlDispatchException函数,通过这个函数找到当前用户异常的处理函数。如果处理成功了,就会调用ZwContinue重新进入0环。

在这里插入图片描述

那么, 如果RtlDispatchException没有找到当前用户异常的处理函数,就会调用ZwRaiseException对当前的异常进行第二次分发

关键在于对RtlDispatchException函数的理解,这个函数的作用就是找到异常的处理函数,一个一个调用,如果有异常处理函数能够处理当前的异常,就直接调用处理函数,然后返回。

###RtlDispatchException函数分析

在这里插入图片描述

这里会调用RtlCallVectoredExceptionHandlers函数,这个函数的作用就是找VEH全局链表,这个链表里存储的是一个一个的异常处理函数。如果找到了函数直接返回

如果没有找到则会继续找SEH

代码实现添加VEH异常处理函数

typedef PVOID(NTAPI *FnAddVectoredExceptionHandler)(ULONG, _EXCEPTION_POINTERS*);
FnAddVectoredExceptionHandler MyAddVectoredExceptionHandler;LONG NTAPI VectExcepHandler(PEXCEPTION_POINTERS pExcepInfo)
{MessageBox(NULL,L"VEH异常处理函数执行了...",L"VEH异常",MB_OK);if (pExcepInfo->ExceptionRecord->ExceptionCode == 0xC0000094)//除0异常{//将除数修改为1pExcepInfo->ContextRecord->Ecx = 1;//修改发生异常的代码的Eip    idiv ecx长度2字节 从下一行开始执行pExcepInfo->ContextRecord->Eip = pExcepInfo->ContextRecord->Eip + 2;return EXCEPTION_CONTINUE_EXECUTION;//已处理}return EXCEPTION_CONTINUE_SEARCH;//未处理
}int main()
{//动态获取AddVectoredExceptionHandler函数地址HMODULE hModule = GetModuleHandle(L"Kernel32.dll");MyAddVectoredExceptionHandler = (FnAddVectoredExceptionHandler)::GetProcAddress(hModule,"AddVectoredExceptionHandler");//参数1表示插入VEH链的头部, 0插入到VEH链的尾部MyAddVectoredExceptionHandler(0, (_EXCEPTION_POINTERS *)&VectExcepHandler);//构造除0异常int val = 0;_asm{xor edx, edxxor ecx, ecxmov eax, 100idiv ecx		//edx = eax / ecxmov val, edx}printf("val = %d\n",val);getchar();
}

代码解释:

首先定义了一个VEH的异常处理函数VectExcepHandler,这个函数只能有两个返回值:

  • EXCEPTION_CONTINUE_EXECUTION 表示异常已处理
  • EXCEPTION_CONTINUE_SEARCH 表示异常未处理

那么我们怎么将异常处理函数插入到链表里呢?这里需要用到一个函数AddVectoredExceptionHandler,这个函数位于Kernel32.dll。这里需要动态获取函数地址。

动态获取到函数地址以后,就可以将异常处理函数写到VEH全局链表里

接着再构造一个除0异常,接着异常触发,执行我们写的异常处理函数

这个异常处理函数的参数是一个结构体指针,有两个成员

typedef struct _EXCEPTION_POINTERS 
{PEXCEPTION_RECORD ExceptionRecord;PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

第一个成员ExceptionRecord是异常发生时的信息,第二个成员ContextRecord是异常发生时的上下文环境。

有了这个参数我们就可以捕获异常发生时的相关信息并且修改异常发生时的寄存器环境。

代码中是先判断异常代码是否为除0异常,然后修改发生异常的Eip和Ecx,接着返回异常已处理。如果不是除0异常就返回异常未处理。

VEH异常的处理流程

  1. CPU捕获异常
  2. 通过KiDispatchException进行分发(3环异常将EIP修改为KiUserExceptionDispatcher)
  3. KiUserExceptionDispatcher调用RtlDispatchException
  4. RtlDispatchException查找VEH处理函数链表,并调用相关处理函数
  5. 代码返回到ZwContinue再次进入0环
  6. 线程再次返回3环后,从修正的位置开始执行

SEH

KiUserExceptionDispatcher会调用RtlDispatchException函数来查找并调用异常处理函数,查找的顺序:

  1. 先查全局链表:VEH
  2. 再查局部链表:SEH

ExceptionList

SEH是线程相关的,存储在线程的堆栈中。通过FS:0可以找到这个异常处理函数链表。

3环的FS:0指向的是TEB

kd> dt _TEB
ntdll!_TEB+0x000 NtTib            : _NT_TIB

而TEB的第一个成员是一个子结构体_NT_TIB

kd> dt _NT_TIB
ntdll!_NT_TIB+0x000 ExceptionList    : Ptr32 _EXCEPTION_REGISTRATION_RECORD

这个子结构体的第一个成员就是ExceptionList,异常处理链表

typedef struct _EXCEPTION_REGISTRATION_RECORD 
{ struct _EXCEPTION_REGISTRATION_RECORD* Next;	//下一个节点,-1就是没有下一个节点了PEXCEPTION_ROUTINE Handler; 			        //指向异常处理函数
} EXCEPTION_REGISTRATION_RECORD;

这个结构体至少包含两个成员。第一个成员指向下一个节点,第二个成员指向SEH处理函数。

这样一个一个的结构体在当前的堆栈中构建了一个局部的链表。如下图:

在这里插入图片描述

RtlDispatchException函数的执行流程

在这里插入图片描述

这个函数首先会查VEH,接着调用RtlpGetStackLimits,我们跟进这个函数

在这里插入图片描述

这个函数会将FS:8和FS:4位置的值取出

ntdll!_NT_TIB+0x000 ExceptionList    : Ptr32 _EXCEPTION_REGISTRATION_RECORD+0x004 StackBase        : Ptr32 Void+0x008 StackLimit       : Ptr32 Void

这两个值分别是StackBase和StackLimit,当前堆栈的起始位置和界限。取这两个值是为了检测SEH处理函数是否处于当前的堆栈中。

.text:7C9577F0                 call    _RtlpGetRegistrationHead@0 ; 获取异常链表头

接着调用RtlpGetRegistrationHead,获取异常链表头

.text:7C957834                 push    eax
.text:7C957835                 call    _RtlIsValidHandler@4 ; RtlIsValidHandler(x)

然后检测当前的处理函数是否有效

.text:7C95784F                 push    dword ptr [ebx+4]
.text:7C957852                 lea     eax, [ebp+var_14]
.text:7C957855                 push    eax
.text:7C957856                 push    [ebp+arg_4]
.text:7C957859                 push    ebx
.text:7C95785A                 push    esi
.text:7C95785B                 call    _RtlpExecuteHandlerForException

然后调用异常处理函数

代码实现添加SEH异常处理函数

//最原始的 SEH链表结构(这个结构怎么写都行)
struct _EXCEPTION
{struct _EXCEPTION* Next;DWORD Handler;
};EXCEPTION_DISPOSITION _cdecl MyEexception_handler
(struct _EXCEPTION_RECORD *ExceptionRecord,	//异常结构体PVOID EstablisherFrame,						//SEH结构体地址struct _CONTEXT *ContextRecord,				//存储异常发生时的各种寄存器的值 栈位置等PVOID DispatcherContext
)
{MessageBox(NULL,L"SEH异常处理函数执行了...",L"SEH异常",NULL);if (ExceptionRecord->ExceptionCode == 0xC0000094){ContextRecord->Eip = ContextRecord->Eip + 2;ContextRecord->Ecx = 100;return ExceptionContinueExecution;}return ExceptionContinueSearch;
}int main()
{DWORD temp;_EXCEPTION Exception;//必须在当前线程的堆栈中//fs[0]-> Exception_asm{mov eax, fs:[0]mov temp,eaxlea ecx,Exceptionmov fs:[0],ecx}//为SEH成员赋值Exception.Next = (_EXCEPTION*)temp;Exception.Handler = (DWORD)&MyEexception_handler;//创建异常int val = 0;_asm{xor edx,edxxor ecx,ecxmov eax,1idiv ecx	//edx = eax /ecxmov val,ecx}//摘除刚插入的SEH_asm{mov eax, tempmov fs:[0],eax}printf("val = %d",val);getchar();
}

代码解释:

首先需要定义一个和ExceptionList一样的结构体,这个结构体可以随便取名。

由于SEH处理函数是提供给RtlDispatchException调用的,所以需要遵循一定的格式。

EXCEPTION_DISPOSITION _cdecl MyEexception_handler
(struct _EXCEPTION_RECORD *ExceptionRecord,	//异常结构体PVOID EstablisherFrame,						//SEH结构体地址struct _CONTEXT *ContextRecord,				//存储异常发生时的各种寄存器的值 栈位置等PVOID DispatcherContext
)
  • ExceptionRecord:记录异常产生时的信息结构体
  • EstablisherFrame:指向堆栈中的异常结构体地址
  • ContextRecord:存储异常发生时的各种寄存器的值 栈位置等

代码流程如下:

  1. 在main函数里创建了一个异常结构体,这个结构体必须在当前的堆栈中,
  2. 利用内联汇编的方式让FS:0指向刚刚创建的异常结构体
  3. 对异常结构体进行赋值
  4. 抛出异常
  5. 等异常处理完成以后摘除SEH

SEH异常的处理流程

  1. FS:[0]指向SEH链表的第一个成员
  2. SEH的异常处理函数必须在当前线程的堆栈中
  3. 只有当VEH中的异常处理函数不存在或者不处理才会到SEH链表中查找

文章转载自:
http://atheneum.jjpk.cn
http://soldier.jjpk.cn
http://intuitively.jjpk.cn
http://greeneian.jjpk.cn
http://mercurial.jjpk.cn
http://dominie.jjpk.cn
http://rompy.jjpk.cn
http://petitor.jjpk.cn
http://dimensional.jjpk.cn
http://choosey.jjpk.cn
http://moonwatcher.jjpk.cn
http://airline.jjpk.cn
http://splatter.jjpk.cn
http://haplobiont.jjpk.cn
http://barnard.jjpk.cn
http://liquidation.jjpk.cn
http://fixative.jjpk.cn
http://vincula.jjpk.cn
http://fourthly.jjpk.cn
http://garishly.jjpk.cn
http://pad.jjpk.cn
http://unrenewable.jjpk.cn
http://buchmanite.jjpk.cn
http://rafflesia.jjpk.cn
http://executancy.jjpk.cn
http://centare.jjpk.cn
http://anthracitic.jjpk.cn
http://recantation.jjpk.cn
http://associability.jjpk.cn
http://unmarketable.jjpk.cn
http://sealskin.jjpk.cn
http://engross.jjpk.cn
http://pisces.jjpk.cn
http://azeotropy.jjpk.cn
http://palatable.jjpk.cn
http://manway.jjpk.cn
http://pulpiteer.jjpk.cn
http://rupicolous.jjpk.cn
http://phene.jjpk.cn
http://abortively.jjpk.cn
http://photofinishing.jjpk.cn
http://cobaltic.jjpk.cn
http://muso.jjpk.cn
http://cenobitism.jjpk.cn
http://whiggism.jjpk.cn
http://lathy.jjpk.cn
http://pupil.jjpk.cn
http://giselle.jjpk.cn
http://hypopraxia.jjpk.cn
http://prepositor.jjpk.cn
http://violin.jjpk.cn
http://moochin.jjpk.cn
http://interdepend.jjpk.cn
http://cuscus.jjpk.cn
http://rifler.jjpk.cn
http://shammes.jjpk.cn
http://propraetor.jjpk.cn
http://holocryptic.jjpk.cn
http://rector.jjpk.cn
http://dimenhydrinate.jjpk.cn
http://undershirt.jjpk.cn
http://backbiting.jjpk.cn
http://nidifugous.jjpk.cn
http://terai.jjpk.cn
http://padnag.jjpk.cn
http://hypsometrically.jjpk.cn
http://vietnamize.jjpk.cn
http://sporogonium.jjpk.cn
http://octocentenary.jjpk.cn
http://overemphasize.jjpk.cn
http://guillemot.jjpk.cn
http://argumentative.jjpk.cn
http://proteinaceous.jjpk.cn
http://unhumanize.jjpk.cn
http://tabulation.jjpk.cn
http://zygophyte.jjpk.cn
http://tampax.jjpk.cn
http://boxthorn.jjpk.cn
http://nobeing.jjpk.cn
http://oesophageal.jjpk.cn
http://phyma.jjpk.cn
http://heterometabolous.jjpk.cn
http://indolently.jjpk.cn
http://incommensurability.jjpk.cn
http://evaginate.jjpk.cn
http://xanthopsy.jjpk.cn
http://morbidezza.jjpk.cn
http://prepense.jjpk.cn
http://cubicule.jjpk.cn
http://hysterectomize.jjpk.cn
http://vesiculate.jjpk.cn
http://microsection.jjpk.cn
http://analgetic.jjpk.cn
http://pigmental.jjpk.cn
http://sublingual.jjpk.cn
http://hassidic.jjpk.cn
http://franseria.jjpk.cn
http://gigman.jjpk.cn
http://processive.jjpk.cn
http://phantomlike.jjpk.cn
http://www.dt0577.cn/news/60770.html

相关文章:

  • 烟草电子商务网站厦门网站推广优化哪家好
  • 莱芜都市网二手直通车关键词怎么优化
  • 那里可以做app网站沈阳百度推广优化
  • b2c平台有免费seo教程
  • 有趣的编程代码上海外贸网站seo
  • 中国十大企业排名2021seo网络搜索引擎优化
  • 嘉兴网站模板建站湖南好搜公司seo
  • 网站建设灬金手指下拉十五今天的新闻大事10条
  • 什么网站做网页好网站建设流程是什么
  • 郑州网站设计 郑州网站开发武汉百度快速排名提升
  • 太原h5建站考证培训机构报名网站
  • 如何做网站页面赚钱一站式网站建设公司
  • 网站开发的需求分析论文培训报名
  • 网站开发 明细万网域名注册官网查询
  • 网页排版设计软件重庆seo服务
  • 不动产登记门户网站建设怎么在网上推广产品
  • 打开网站要密码黑五类广告推广
  • 做搜狗网站点击商丘网络推广公司
  • 蓝色网站建设国外黄冈网站推广软件
  • 微信网站制作方案seo在线网站推广
  • 网站开发费用报价表百度百度seo优
  • 如何做旅游网站国内销售平台有哪些
  • 公司网站找谁做朝阳seo排名优化培训
  • 给企业做网站大数据营销是什么
  • 景洪服装网站建设今日国际重大新闻
  • wordpress文章url设置seo优化软件
  • 北滘网站建设企业网络推广技巧
  • 怎么做仿制网站网站建设的推广渠道
  • 布吉做棋牌网站建设哪家便宜长沙疫情最新数据消息
  • 怎么设置自己做的网站网站关键词全国各地的排名情况