有了网站 域名然后么做dw怎么用模板
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:53
当前位置: 首页 > news >正文
有了网站 域名然后么做,dw怎么用模板,阿卯网站建设,网站添加地图导航文章目录 VEHKiUserExceptionDispatcher函数分析代码实现添加VEH异常处理函数VEH异常的处理流程 SEHExceptionListRtlDispatchException函数的执行流程代码实现添加SEH异常处理函数SEH异常的处理流程 VEH 当用户异常产生后#xff0c;内核函数KiDispatchException并不是像处理… 文章目录 VEHKiUserExceptionDispatcher函数分析代码实现添加VEH异常处理函数VEH异常的处理流程 SEHExceptionListRtlDispatchException函数的执行流程代码实现添加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,LVEH异常处理函数执行了…,LVEH异常,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(LKernel32.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异常的处理流程 CPU捕获异常通过KiDispatchException进行分发(3环异常将EIP修改为KiUserExceptionDispatcher)KiUserExceptionDispatcher调用RtlDispatchExceptionRtlDispatchException查找VEH处理函数链表并调用相关处理函数代码返回到ZwContinue再次进入0环线程再次返回3环后从修正的位置开始执行 SEH KiUserExceptionDispatcher会调用RtlDispatchException函数来查找并调用异常处理函数查找的顺序 先查全局链表VEH再查局部链表SEH ExceptionList SEH是线程相关的存储在线程的堆栈中。通过FS:0可以找到这个异常处理函数链表。 3环的FS:0指向的是TEB kd dt _TEB ntdll!_TEB0x000 NtTib : _NT_TIB而TEB的第一个成员是一个子结构体_NT_TIB kd dt _NT_TIB ntdll!_NT_TIB0x000 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_TIB0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD0x004 StackBase : Ptr32 Void0x008 StackLimit : Ptr32 Void这两个值分别是StackBase和StackLimit当前堆栈的起始位置和界限。取这两个值是为了检测SEH处理函数是否处于当前的堆栈中。 .text:7C9577F0 call _RtlpGetRegistrationHead0 ; 获取异常链表头接着调用RtlpGetRegistrationHead获取异常链表头 .text:7C957834 push eax .text:7C957835 call _RtlIsValidHandler4 ; RtlIsValidHandler(x)然后检测当前的处理函数是否有效 .text:7C95784F push dword ptr [ebx4] .text:7C957852 lea eax, [ebpvar_14] .text:7C957855 push eax .text:7C957856 push [ebparg_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,LSEH异常处理函数执行了…,LSEH异常,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存储异常发生时的各种寄存器的值 栈位置等 代码流程如下 在main函数里创建了一个异常结构体这个结构体必须在当前的堆栈中利用内联汇编的方式让FS:0指向刚刚创建的异常结构体对异常结构体进行赋值抛出异常等异常处理完成以后摘除SEH SEH异常的处理流程 FS:[0]指向SEH链表的第一个成员SEH的异常处理函数必须在当前线程的堆栈中只有当VEH中的异常处理函数不存在或者不处理才会到SEH链表中查找
- 上一篇: 有了空间和域名 网站容易做吗浦口区网站建设售后保障
- 下一篇: 有了域名 网站建设网站图片批量上传
相关文章
-
有了空间和域名 网站容易做吗浦口区网站建设售后保障
有了空间和域名 网站容易做吗浦口区网站建设售后保障
- 技术栈
- 2026年03月21日
-
有了空间和域名 网站容易做吗广州可信网站认证服务器
有了空间和域名 网站容易做吗广州可信网站认证服务器
- 技术栈
- 2026年03月21日
-
有了ddns怎么建设网站2018网站内容和备案
有了ddns怎么建设网站2018网站内容和备案
- 技术栈
- 2026年03月21日
-
有了域名 网站建设网站图片批量上传
有了域名 网站建设网站图片批量上传
- 技术栈
- 2026年03月21日
-
有了域名建设网站运营哪里学的比较专业
有了域名建设网站运营哪里学的比较专业
- 技术栈
- 2026年03月21日
-
有了域名之后怎么做自己的网站做百度商桥网站
有了域名之后怎么做自己的网站做百度商桥网站
- 技术栈
- 2026年03月21日
