pg3 bypass源码阅读 —— 学习x64内核hook跳板技术
如之前描述的 pg3复杂了许多
先来看看都要hook哪些点
1、hook dpc和定时器分发器,防止seh路线触发pg
KiTimerListExpire,KiRetireDpcList
看一下hook点

hook的就是call的位置。
这里有两种方案:一种是直接jmp + 64bit addr,显然有同步问题,需要暂停所有cpu然后把irql提升到HIGH_LEVEL去操作。
另一种是 call 32bit 跳板 addr,如下图,操作8byte符合原子操作

e8 xxxxxxxx是32位转移,我们需要一个nt范围内的跳板,作者是这样处理的。把KiCustomAccessRoutine4跳转到KiCustomAccessRoutine0,那么KiCustomAccessRoutine4后面的代码就可以随便改了,不需要原子操作,这是一个技巧。

- void VistaAll_DpcInterceptor(
- PKDPC InDpc,
- PVOID InDeferredContext,
- PVOID InSystemArgument1,
- PVOID InSystemArgument2)
- {
- ULONGLONG Routine = (ULONGLONG)InDpc->DeferredRoutine;
- __try
- {
- if((Routine >= 0xFFFFFA8000000000) && (Routine <= 0xFFFFFAA000000000))
- {
- }
- else
- if(KeContainsSymbol((void*)Routine))
- {
- if(!PgIsPatchGuardContext(InDeferredContext))
- InDpc->DeferredRoutine(InDpc, InDeferredContext, InSystemArgument1, InSystemArgument2);
- }
- else
- InDpc->DeferredRoutine(InDpc, InDeferredContext, InSystemArgument1, InSystemArgument2);
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- }
- }
fake dpc的处理非常简单,判断dpc context即可
2.hook ExpWorkerThread 工作线程也有可能触发pg,hook方法同上,fake函数如下
- VOID VistaAll_ExpWorkerThreadInterceptor(PWORKER_THREAD_ROUTINE InRoutine, VOID* InContext, VOID* InRSP)
- {
- ULONGLONG Val = (ULONGLONG)InRoutine;
- if((Val >= 0xfffffa8000000000) && (Val <= 0xfffffaa000000000))
- return;
- __try
- {
- InRoutine(InContext);
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- }
- }
过滤了所有内核的work thread,工作线程是non-seh mode,无法过滤非传统地址,所以过滤了所有的nt工作线程。。总是系统跑起来之后也不会再排新的工作线程就是了。
3.这样还不够,hook KeBugcheckEx作为补充,KeBugcheckEx是被PG循环恢复的,但是分析代码KeBugcheckEx一开始就调用到RtlCaptureContext,所以转去hook RtlCaptureContext,还是用跳板函数,用到了栈回溯
- RtlCaptureContext_Hook PROC
- ; call high level handler without messing up the context structure...
- push rcx
- push rdx
- push r8
- push r9
- push r10
- push r11
- mov rcx, qword ptr[rsp + 128]
- mov rdx, qword ptr[rsp + 7 * 8]
- sub rsp, 32
- call KeBugCheck_Hook
- mov qword ptr [rsp], rax
- add rsp, 32
- pop r11
- pop r10
- pop r9
- pop r8
- pop rdx
- pop rcx
- pop rax
- ; recover destroyed bytes of RtlCaptureContext
- pushfq
- mov word ptr [rcx+38h],cs
- mov word ptr [rcx+3Ah],ds
- mov word ptr [rcx+3Ch],es
- mov word ptr [rcx+42h],ss
- ; jump behind destroyed bytes... (RetVal of RtlCaptureContext_HookEx)
- jmp qword ptr[rsp - 32 - 8 * 7 + 8]
- RtlCaptureContext_Hook ENDP
fake函数将pg进入死循环
- ULONGLONG KeBugCheck_Hook(ULONGLONG InBugCode, ULONGLONG InCaller)
- {
- FAST_MUTEX WaitAlways;
- //判断调用者
- if((InCaller >= KeBugCheckEx_Sym) && (InCaller <= KeBugCheckEx_Sym + 100))
- {
- if(InBugCode == CRITICAL_STRUCTURE_CORRUPTION)
- {
- // KeBugCheckEx disables interrupts before calling RtlCaptureContext()
- EnableInterrupts();
- //进入死循环
- ExInitializeFastMutex(&WaitAlways);
- ExAcquireFastMutex(&WaitAlways);
- ExAcquireFastMutex(&WaitAlways);
- }
- }
- //返回跳转地址
- return RtlCaptureContext_Sym + 14;
- }
jpg 改 rar 
pg3 bypass源码阅读 —— 学习x64内核hook跳板技术的更多相关文章
- vnpy源码阅读学习(1):准备工作
vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...
- Spring源码阅读学习一
昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...
- vnpy源码阅读学习(5):关于MainEngine的代码阅读
关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...
- vnpy源码阅读学习(8):关于app
关于app 在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来.不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不 ...
- vnpy源码阅读学习(9)回到OptionMaster
回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...
- vnpy源码阅读学习(2):学习PyQt5
PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...
- vnpy源码阅读学习(3):学习vnpy的界面的实现
学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...
- vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架
自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...
- requests源码阅读学习笔记
0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...
随机推荐
- 对C语言中指针的入门理解
通过一个例子引出对指针的概念理解 1,例子 #include<stdio.h> int main(void) { ; //小张的身高 ; //小李的身高 ; //小王的身高 int *xi ...
- 【总结】牛客职播第九期:您的美团点评offer已送到门口,快来与我们一起影响世界!
一.介绍 美团点评2018校园春招流程介绍&面试答疑 讲师:燕鹏.Taylor 二.收获 面试时如果太紧张或者内向,容易吃亏,所以建议把面试当做展示自己的一次舞台. 遇见一道编程题目,如果无法 ...
- (转)android媒体--stagefright概述【一】
转自:http://blog.csdn.net/loovejava/article/details/8971790 最近杂七杂八的忙碌着,前几天看了下这部分主要是stagefright模块的,所以更改 ...
- svn -- svn数据仓库
在svn中我们的项目,不能称之为项目或文件夹,而是称之为“仓库” 仓库的建立步骤: 1.创建代码仓库 l 在任意盘符下建立文件夹(D:\svn\myApp\)做为我们的版本库根目录,如我们需要建立一个 ...
- VMware虚拟CentOS 6.5在NAT模式下配置静态IP地址及Xshell远程控制配置
VMware虚拟CentOS 6.5在NAT模式下配置静态IP地址及Xshell远程控制配置 标签: LinuxXshellCentOS 2016-10-15 04:58 127人阅读 评论(0) 收 ...
- 在js中 把 json对象转化为String对象的方法
方法1: 使用js的扩展方法 ** * json对象转字符串形式 */ function json2str(o) { var arr = []; var fmt = function(s) { if ...
- 于erlang依赖的linux调优
[皇室]杭州-sunface(61087682) 上午 9:42:02 http://docs.basho.com/riak/latest/ops/tuning/linux/ 这篇文章对于erlang ...
- 7款HTML5精美应用教程 让你立即爱上HTML5
你喜欢HTML5吗?我想下面的这7个HTML5应用一定会让你爱上HTML5的,不信就一起来看看吧. 1.HTML5/jQuery雷达动画图表 图表配置十分简单 之前我们介绍过不少形形色色的HTML5图 ...
- HDU 3970 Harmonious Set 容斥欧拉函数
pid=3970">链接 题解:www.cygmasot.com/index.php/2015/08/17/hdu_3970 给定n 求连续整数[0,n), 中随意选一些数使得选出的 ...
- 038改变状态栏的颜色(扩展知识:关于iOS不同版本的消息通知知识)
效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @e ...