Hook KiUserExceptionDispatcher参数指针错误的问题

跟了一个晚上,终于解决了

大概要实现的是用这个函数替换ntdll中的KiUserExceptionDispatcher,实现方法如下:

 VOID NTAPI KiUserExceptionDispatcher(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { DWORD retValue; if (RtlDispatchException(pExcptRec,pContext)) { retValue=::ZwContinue( pContext,0); }else{ retValue=::ZwRaiseException(pExcptRec,pContext,0); } /*略过.............*/ }

参考:http://www.longene.org/techdoc/0359381001224576966.html

这样看着只是通过KiUserExceptionDispatcher来调用ZwContinue与Zw...函数,看着很正常,几乎网上所有代码都是这个形式来写的(不知道他们是怎么通过的- -!)

运行时就出问题了,当有异常发生时 要么就是在RtlDispatchException里面不出来也没反应,要么就是一直循环的调用他,这个函数是R3异常处理的入口点,只要这里面发生异常还是调用他 - -!

在正常情况下,进入函数第一条指令时:

ESP=返回地址,ESP+X才是参数

..........................................................................

跟到刚刚才发现,跑到函数入口点时[ESP]=第一个参数,[ESP+4]=第二个参数,根本没有返回地址

而自己写的这个函数,永远是[ESP+4]=第一个参数,[ESP+8]=第二个参数.. - -! 这样不错才惨了...

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

这是KiUserExceptionDispatcher,异常无数,但从没见过执行到77C7014A, ZwContinue直接进入内核了,而进ZwRaiseException后,估计程序就崩了,RtlRaiseException这里也是没见执行过的,- - 都摆设..

-----------------------------------------------------------------------------------------------------

问题点找着了,翻遍了GG BING也没见有说无返回地址参数问题,最后为了省事把他当作跳板转到其它函数中处理(没有汇编基础的感觉这方法是最简单*_*-)

VOID NTAPI KiUserExceptionDispatcher_BT(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { DWORD retValue; if (RtlDispatchException(pExcptRec,pContext)) { ::AfxMessageBox("ZwContinue"); retValue=::ZwContinue( pContext,0); }else{ ::AfxMessageBox("ZwRaiseException"); retValue=::ZwRaiseException(pExcptRec,pContext,0); } } VOID NTAPI KiUserExceptionDispatcher(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { __asm { /* -_-! 这里入栈看着有些不顺似的-如果真不会执行到RETN貌似不用压栈也得 */ push [esp+4] push [esp+4] call KiUserExceptionDispatcher_BT /* 看着不顺眼,问题解决就成 - -! */ /*补充:需Release下,Debug栈是乱的*/ } }

 

哎,真走了不少弯路,当时以为是参数顺序错了..结果_估计_是该函数是由内核空间转入用户空间入口,则无返回地址入栈,网上文章也没细看,问题解决百岁!

---------------------------------------------------------------------------------------------------------------------

注:

RtlDispatchException在Ntdll中未导出,需按各个版本处理该函数地址

处理如下:

typedef NTSTATUS(NTAPI *pRtlDispatchException)(PEXCEPTION_RECORD pExcptRec,CONTEXT * pContext); pRtlDispatchException RtlDispatchException=NULL; /*这是WIN7 64位旗舰版下的地址,也就是在反汇编中看到的第一个Call地址*/ RtlDispatchException=(pRtlDispatchException)0x77CB865B;

经过上面的函数处理,能够捕捉到的异常貌似都能够通过了,然后就能在程序中制造出种种异常,一一奸杀,=_=

转载于:https://www.cnblogs.com/SilenceRet/archive/2010/12/04/6805047.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker image Introduce

Docker 的image是运行的基本.例如我们build一个image时, 在Dockerfile每条指令会产生一个可读写的image, 下一条指令使用上一条指令产生的image为基础, 继续产生image(然后删除上一个image), 如果指令没有对image有修改的动作, 那么可以使用image cache. 所有的指令执行完, 生成…

vue 筛选组件_记一个复杂组件(Filter)的从设计到开发

此文前端框架使用 rax,全篇代码暂未开源(待开源)原文链接地址:Nealyang/PersonalBlog前言貌似在面试中,你如果设计一个 react/vue 组件,貌似已经是司空见惯的问题了。本文不是理论片,更多的是自…

python的正则表达式 re

2019独角兽企业重金招聘Python工程师标准>>> 原文发表在: http://luy.li/2010/05/12/python-re/ 延伸阅读:python的 内建函数 和 subprocess 。此文是本系列的第三篇文章了,和之前一样,内容出自官方文档,但…

福克斯保养明细

福克斯轮胎厚度: 胎冠厚度在13mm左右(胎冠花纹深7mm、胎冠厚6mm), 胎侧厚度5mm。 现在的轿车轮胎一般胎面胶层厚度都比较厚,以165/70R13 锦湖KR19轮胎为例:花纹深度为7毫米,缓冲层1-1.5毫米,冠带…

USACO 1.1 Your Ride Is Here

今天开始切USACO 加油 /* ID: aznfy1 PROG: ride LANG: C */ #include <iostream> #include <fstream> #include <string> #include <stdio.h>using namespace std;char a[10],b[10];int main() {freopen("ride.in","r",stdin);f…

Mysql支持的数据类型(总结)

2019独角兽企业重金招聘Python工程师标准>>> 一.数值类型 Mysql支持所有标准SQL中的数值类型&#xff0c;其中包括严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC)&#xff0c;以及近似数值数据类型(FLOAT,REAL,DOUBLE PRESISION),并在此基础上进行扩展。 扩展后增…

uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

理解&#xff1a;let变量的作用域只能在当前函数中js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net全局作用域中&#xff0c;用 const 和 let 声明的变量不在 window 上&#xff0c;那到底在哪里&#xff1f;如何去获取&#xff1f;​blog.csdn.n…

C语言求十个数中最大值

一.代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,63,7,8,9,11 };int sz sizeof(arr) / sizeof(arr[0]);int max arr[0];int i 0;for (i 1; i < 10; i){if (arr[i] > max)max arr[i];}printf("%d\n&qu…

ubuntu20.04安装timeshift最新方法

总结&#xff1a; 现在可以使用如下代码安装 sudo apt-get update sudo apt-get install timeshift原因&#xff1a; 在尝试Timeshift系统备份与还原中的方法时&#xff0c; sudo apt-add-repository -y ppa:teejee2008/ppa运行失败。 更改为以下代码&#xff1a; sudo a…

SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)

在保密你的服务器和数据&#xff0c;防备当前复杂的攻击&#xff0c;SQL Server有你需要的一切。但在你能有效使用这些安全功能前&#xff0c;你需要理解你面对的威胁和一些基本的安全概念。这篇文章提供了基础&#xff0c;因此你可以对SQL Server里的安全功能充分利用&#xf…

索引超出数组界限是什么意思_从V8源码分析一个JS 数组的内存占用问题

前段时间&#xff0c;在排查一个问题的时候&#xff0c;遇到了一个有点令人困惑的情况&#xff0c;有下面这两段代码&#xff1a;const a new Array(99999); a[99998] undefined;const b new Array(99999); b[99999] undefined;我们通过 node --inspect-brk 来分别运行这两…

C语言打印九九乘法口诀

一.代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() {int i 0;int j 0;for (i 1; i < 10; i){for (j 1; j < i; j){printf("%d*%d%-2d", i, j, i * j);}printf("\n");}return 0; }二.运行结果

自动机理论、形式语言和计算导论提纲

我真的是觉得这门课太虚了。。这个总结基于名教材《自动机理论、语言和计算导论》&#xff08;机械工业&#xff09;&#xff0c;也可以说是这本书的总结。由于这门课里很多罗马字母&#xff0c;打字很困难所以能省略的公式都不写了&#xff0c;可以算是入门介绍了。这里省略的…

C语言求斐波那契数列

一.递归算法 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int fib(int k) {if (k < 2)return 1;elsereturn fib(k - 1) fib(k - 2); } int main() {int n 0;int res 0;printf("求输入斐波那契数列的阶数");scanf("%d", &n);res…

nginx $mail-send()发送邮件报错_基于SMTP协议的E-MAIL电子邮件发送客户端软件C#实现...

摘 要电子邮件在当今社会中扮演了一个很重要的角色。越来越多的人在使用它。而且用它的人数势必会继续增加。虽然&#xff0c;现在已经有很多的邮件收发软件例如著名的FoxMail 但是对于大多数的非专业的人来说它还是有点难度稍嫌负责。因此&#xff0c;我们就利用SMTP和Pop协议…

【转】DCT变换的透彻解析

3、离散余弦变换 DCT  将图像从色彩域转换到频率域&#xff0c;常用的变换方法有&#xff1a;DCT变换的公式为&#xff1a;f(i&#xff0c;j) 经 DCT 变换之后&#xff0c;F(0&#xff0c;0) 是直流系数&#xff0c;其他为交流系数。  还是举例来说明一下。  8x8的原始图…

安防硬件WIZnet基于全硬件TCP/IP的安防产品应用及方案

在本文中,我们主要介绍安防硬件的内容,自我感觉有个不错的建议和大家分享下 WIZnet立足于生产全硬件TCP/IP协议栈芯片&#xff0c;为单片机提供理想的处置计划。整体来讲&#xff0c;其应用领域还是非常广泛的&#xff0c;以智能电表为代表的Smart Energy&#xff1b;以数字楼宇…

在Android命令行启动程序的方法

在Android中&#xff0c;除了从界面上启动程序之外&#xff0c;还可以从命令行启动程序&#xff0c;使用的是命令行工具am.启动的方法为 # am start -n 包(package)名/包名.活动(activity)名称 启动的方法可以从每个应用的AndroidManifest.xml的文件中得到&#xff0c;以计算器…

python每隔半个小时执行一次_一篇文章教你用Python抓取微博评论

【Part1——理论篇】试想一个问题&#xff0c;如果我们要抓取某个微博大V微博的评论数据&#xff0c;应该怎么实现呢&#xff1f;最简单的做法就是找到微博评论数据接口&#xff0c;然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口&#xff0c;如下图所…

r数据框计算字符出现次数_R语言系列第二期:①R变量、脚本、作图等模块介绍...

在上一篇文章里&#xff0c;给大家介绍了R语言的下载&#xff0c;界面操作&#xff0c;6个处理对象等等。在这些内容的基础上&#xff0c;我们在这个部分为大家介绍一些实用知识&#xff0c;包括描述工作区结构、图形设备以及它们的参数等问题&#xff0c;还有初级编程和数据输…