如之前描述的 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后面的代码就可以随便改了,不需要原子操作,这是一个技巧。

  1.  
    void VistaAll_DpcInterceptor(
  2.  
    PKDPC InDpc,
  3.  
    PVOID InDeferredContext,
  4.  
    PVOID InSystemArgument1,
  5.  
    PVOID InSystemArgument2)
  6.  
    {
  7.  
    ULONGLONG Routine = (ULONGLONG)InDpc->DeferredRoutine;
  8.  
     
  9.  
    __try
  10.  
    {
  11.  
    if((Routine >= 0xFFFFFA8000000000) && (Routine <= 0xFFFFFAA000000000))
  12.  
    {
  13.  
    }
  14.  
    else
  15.  
    if(KeContainsSymbol((void*)Routine))
  16.  
    {
  17.  
    if(!PgIsPatchGuardContext(InDeferredContext))
  18.  
    InDpc->DeferredRoutine(InDpc, InDeferredContext, InSystemArgument1, InSystemArgument2);
  19.  
    }
  20.  
    else
  21.  
    InDpc->DeferredRoutine(InDpc, InDeferredContext, InSystemArgument1, InSystemArgument2);
  22.  
    }
  23.  
    __except(EXCEPTION_EXECUTE_HANDLER)
  24.  
    {
  25.  
    }
  26.  
    }

fake dpc的处理非常简单,判断dpc context即可

2.hook ExpWorkerThread 工作线程也有可能触发pg,hook方法同上,fake函数如下

  1.  
    VOID VistaAll_ExpWorkerThreadInterceptor(PWORKER_THREAD_ROUTINE InRoutine, VOID* InContext, VOID* InRSP)
  2.  
    {
  3.  
    ULONGLONG Val = (ULONGLONG)InRoutine;
  4.  
     
  5.  
    if((Val >= 0xfffffa8000000000) && (Val <= 0xfffffaa000000000))
  6.  
    return;
  7.  
     
  8.  
    __try
  9.  
    {
  10.  
    InRoutine(InContext);
  11.  
    }
  12.  
    __except(EXCEPTION_EXECUTE_HANDLER)
  13.  
    {
  14.  
    }
  15.  
    }

过滤了所有内核的work thread,工作线程是non-seh mode,无法过滤非传统地址,所以过滤了所有的nt工作线程。。总是系统跑起来之后也不会再排新的工作线程就是了。

3.这样还不够,hook KeBugcheckEx作为补充,KeBugcheckEx是被PG循环恢复的,但是分析代码KeBugcheckEx一开始就调用到RtlCaptureContext,所以转去hook RtlCaptureContext,还是用跳板函数,用到了栈回溯

  1.  
    RtlCaptureContext_Hook PROC
  2.  
     
  3.  
    ; call high level handler without messing up the context structure...
  4.  
    push rcx
  5.  
    push rdx
  6.  
    push r8
  7.  
    push r9
  8.  
    push r10
  9.  
    push r11
  10.  
    mov rcx, qword ptr[rsp + 128]
  11.  
    mov rdx, qword ptr[rsp + 7 * 8]
  12.  
    sub rsp, 32
  13.  
    call KeBugCheck_Hook
  14.  
    mov qword ptr [rsp], rax
  15.  
    add rsp, 32
  16.  
    pop r11
  17.  
    pop r10
  18.  
    pop r9
  19.  
    pop r8
  20.  
    pop rdx
  21.  
    pop rcx
  22.  
    pop rax
  23.  
     
  24.  
    ; recover destroyed bytes of RtlCaptureContext
  25.  
    pushfq
  26.  
    mov word ptr [rcx+38h],cs
  27.  
    mov word ptr [rcx+3Ah],ds
  28.  
    mov word ptr [rcx+3Ch],es
  29.  
    mov word ptr [rcx+42h],ss
  30.  
     
  31.  
    ; jump behind destroyed bytes... (RetVal of RtlCaptureContext_HookEx)
  32.  
    jmp qword ptr[rsp - 32 - 8 * 7 + 8]
  33.  
     
  34.  
    RtlCaptureContext_Hook ENDP

fake函数将pg进入死循环

  1.  
    ULONGLONG KeBugCheck_Hook(ULONGLONG InBugCode, ULONGLONG InCaller)
  2.  
    {
  3.  
    FAST_MUTEX WaitAlways;
  4.  
     
  5.  
    //判断调用者
  6.  
    if((InCaller >= KeBugCheckEx_Sym) && (InCaller <= KeBugCheckEx_Sym + 100))
  7.  
    {
  8.  
    if(InBugCode == CRITICAL_STRUCTURE_CORRUPTION)
  9.  
    {
  10.  
    // KeBugCheckEx disables interrupts before calling RtlCaptureContext()
  11.  
    EnableInterrupts();
  12.  
     
  13.  
    //进入死循环
  14.  
    ExInitializeFastMutex(&WaitAlways);
  15.  
    ExAcquireFastMutex(&WaitAlways);
  16.  
    ExAcquireFastMutex(&WaitAlways);
  17.  
    }
  18.  
    }
  19.  
     
  20.  
    //返回跳转地址
  21.  
    return RtlCaptureContext_Sym + 14;
  22.  
    }

jpg 改 rar 

pg3 bypass源码阅读 —— 学习x64内核hook跳板技术的更多相关文章

  1. vnpy源码阅读学习(1):准备工作

    vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...

  2. Spring源码阅读学习一

    昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...

  3. vnpy源码阅读学习(5):关于MainEngine的代码阅读

    关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...

  4. vnpy源码阅读学习(8):关于app

    关于app 在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来.不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不 ...

  5. vnpy源码阅读学习(9)回到OptionMaster

    回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...

  6. vnpy源码阅读学习(2):学习PyQt5

    PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...

  7. vnpy源码阅读学习(3):学习vnpy的界面的实现

    学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...

  8. vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架

    自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...

  9. requests源码阅读学习笔记

    0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...

随机推荐

  1. (笔记)如何安装Arm-linux-gcc

      如何安装Arm-linux-gcc   安装交叉编译工具链: 1.首先以root用户登入 2.复制arm-linux-gcc-4.3.2.tgz到根目录下tmp文件夹里 3.解压命令tar xvz ...

  2. Linux中几个与文档相关的命令

    一.介绍 本文将介绍几个与文档相关的命令 软件环境: 物理机 Windows 8.0 虚拟机 VMware Workstation 12 Linux系统 CentOS 7.3 二.命令cat 命令ca ...

  3. 获取Java正在执行的方法

    new Object(){}.getClass().getEnclosingMethod().getName(); Thread.currentThread().getStackTrace()

  4. js作为参数,并且返回值;js的回调模式 callback

    有这样一个情景,当我们弹出一个 prompt的时候,要求用户在文本框输入一个文字,然后点击确认,就可以拿到返回值 var temp=prompt("请输入您的名字");     a ...

  5. T4生成实体,单张表和多张表

    # 使用说明 . 把T4目录放在项目的根目录 . 配置连接字符串,在tt文件的最底部 . generateAllEntity.tt生成全部的实体类 . generateSingleEntityByNa ...

  6. Launchpad图标大小怎么调整?

    一.首先运行“终端”程序,执行以下命令: 1.调整每一列显示图标数量,7 表示每一列显示7个 defaults write com.apple.dock springboard-rows -int 7 ...

  7. 安装Java Decompiler

    原文:https://blog.csdn.net/yh_zeng2/article/details/75948467 Java Decompiler是Java语言的反编译工具,具体介绍见博客Java ...

  8. (Dos)/BAT命令入门与高级技巧详解(转)

    目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1.REM 和 :: 2.ECHO 和 @ 3.PAUSE 4.ERRORLEVEL 5.TITLE 6.COLOR 7.mode 配置系统设 ...

  9. redis 的 HyperLogLog

    Redis 在 2.8.9 版本添加了 HyperLogLog 结构. Redis HyperLogLog 是用来做基数统计的算法 HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大 ...

  10. ABBYY FineReader 12没你想得那么简单

    你是否觉得自己对ABBYY FineReader 12已经了如指掌了?也许你会认为它不过就是一款OCR文字识别软件,能够快速方便地将扫描纸质文档.PDF文件或者数码相机的图像转换为可编辑.可搜索的格式 ...