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
Hook KiUserExceptionDispatcher参数指针错误的问题相关推荐
- C/C++指针错误与调试相关学习总结
使用VS2010调试技巧让C指针无处遁形 http://blog.csdn.net/21aspnet/article/details/6723758 Linux 下调试远没有windows下的VS方便 ...
- swift函数参数指针传递inout和@escaping冲突的解决方法
这里写目录标题 需求 解决方法 容易产生的问题 总结 今天深入解决关于函数参数指针的问题.问题是这样,我在swift的一个函数里面,参数里需要传递一个指针类型的Int,但是这个函数里面还有一个逃逸闭包 ...
- exc_bad_access(code=1, address=0x789870)野指针错误
原因: exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后.再去通过该对象去调 ...
- 微信退款参数格式错误
微信退款失败返回信息是: <xml><return_code><![CDATA[FAIL]]></return_code> <return_msg ...
- Soul网关源码阅读番外篇(一) HTTP参数请求错误
Soul网关源码阅读番外篇(一) HTTP参数请求错误 共同作者:石立 萧 * 简介 在Soul网关2.2.1版本源码阅读中,遇到了HTTP请求加上参数返回404的错误,此篇文章基于此进行探索 ...
- autolisp获取目录服务器信息失败,大神们,帮忙看看这个代码哪儿有问题?老是出现“参数类型错误:...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 defun c:ZHDGX() (claim) (command "layer" "m" "dgxj&q ...
- php微信支付mch_id参数格式错误,再说一下微信支付踩到的坑 mch_id 参数格式错误...
微信小程序支付在好久之前写过一次,后来再写的话也是用别人的 SDK 了,之前写的文章好像留了一点坑 博客有发过一篇关于微信小程序支付的文章,见PHP完成微信小程序在线支付功能 贴了代码没有检查,也给 ...
- php微信支付mch_id参数格式错误,在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误...
一.问题描述 在调用统一下单接口时,报mch_id参数格式错误,但商户ID确实是10位数字正确的,可就是一直报这个错误 返回的错误xml如下: 二.排错过程 1.多次对比官网xml格式,确认生成的xm ...
- MyBatis-Plus分页查询where后面的参数拼接错误报### The error occurred while setting parameters
MyBatis-Plus分页查询条件参数拼接错误! ### The error may exist in file [D:\SourcrGit\IOT_sxx\iot-parent\iot\targe ...
最新文章
- 每一个人都是平凡的英雄
- 剑指offerpython_剑指offer系列python实现 日更(一)
- 10个调试Java的技巧
- oracle收发邮件存储过程
- html中如何让图片交错,HTML5/Canvas 光圈交错幻觉
- c语言5的阶乘流程图_5 种前途迷茫的编程语言
- regexbuddy使用记录
- C++/C--vector初始化与赋值【转载】
- 宏定义 是否retina高清屏,判断当前设备
- 前端开发---ppt展示页面评论区展示
- PHP 的魔术方法及其应用
- iOS9自动布局神器StackView
- python模拟浏览器教程_Python使用win32com实现的模拟浏览器功能示例
- matlab高斯型积分,电子科大MATLAB第14节高斯型积分程序.ppt
- 史上最简单的LSTM文本分类实现:搜狗新闻文本分类(附代码)
- 干货 | 还不了解中介调节模型?赶紧收藏本文吧。
- 《Linux运维总结:SVN提示Node remains in conflict解决办法》
- iOS 15 正式版发布,210 条改进大汇总
- ArcGIS教程:确定空间关系
- Java多线程探究-死锁原因
热门文章
- Python 安装库的方法及解决pip 安装时速度缓慢的方法
- 如何在64位Ubuntu16.04下安装java开发环境
- 64位ubuntu 12.04编译linux内核提示openssl/opensslv.h文件缺失
- 【自动驾驶-Autonomous】自动驾驶定义
- Eigen入门之密集矩阵 8 - resharp slicing切片
- 在.net中加载dll的一种错误问题原因及处理
- React with Webpack - 3: 内联image、font
- 【边缘检测】RCF: Richer Convolutional Features for Edge Detection
- 这些贷款冷知识你知道多少?
- [转] 常见WinCE启动失败原因分析