本程序使用了hde32反汇编引擎,所以性能更加稳定!

#pragma once
#include <ntddk.h>

NTSYSAPI
NTSTATUS
NTAPI
NtCreateSection(OUT PHANDLE SectionHandle,
        IN ACCESS_MASK DesiredAccess,
        IN POBJECT_ATTRIBUTES ObjectAttributes,
        IN PLARGE_INTEGER SectionSize OPTIONAL,
        IN ULONG Protect,
        IN ULONG Attributes,
        IN HANDLE FileHandle);

NTSTATUS
DetourNtCreateSection(OUT PHANDLE SectionHandle,
            IN ACCESS_MASK DesiredAccess,
            IN POBJECT_ATTRIBUTES ObjectAttributes,
            IN PLARGE_INTEGER SectionSize OPTIONAL,
            IN ULONG Protect,
            IN ULONG Attributes,
            IN HANDLE FileHandle);

VOID
TrueCellUnload(IN PDRIVER_OBJECT DriverObject);

BOOLEAN
HookFunc(BOOLEAN IsHook);

NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath);

NTSTATUS
IoQueryFileDosDeviceName(IN PFILE_OBJECT  FileObject,
            OUT POBJECT_NAME_INFORMATION  *ObjectNameInformation );

#include "Ncs.h"
#include "hde32.h"

#pragma comment(lib, "hde32.lib")

UCHAR OriFuncHead[12]={0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90};//假设目标函数头部有12个字节
UCHAR NewFuncHead[5]={0xE9,0x00,0x00,0x00,0x00};//jmp [相对偏移] 的字节码——奇妙的地方
ULONG ulHeadLen=0;

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){
    KdPrint(("[TrueCell] Driver Entry!\r\n"));
    DriverObject->DriverUnload=TrueCellUnload;
    return HookFunc(TRUE)?STATUS_SUCCESS:STATUS_UNSUCCESSFUL;
}

VOID TrueCellUnload(IN PDRIVER_OBJECT DriverObject){
    HookFunc(FALSE);
    KdPrint(("[TrueCell] Driver Unload!\r\n"));
}

_declspec(naked) NTSTATUS
GoNtCreateSection(OUT PHANDLE SectionHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PLARGE_INTEGER SectionSize OPTIONAL,
    IN ULONG Protect,
    IN ULONG Attributes,
    IN HANDLE FileHandle){//跳板
    _asm{
        nop;//    \   
        nop;//    |
        nop;//    |
        nop;//    |
        nop;//    |
        nop;//    |   
        nop;//    >开辟足够大的空间来容纳NtCreateSection开头的ulHeadlen个字节的机器码
        nop;//    |
        nop;//    |
        nop;//    |
        nop;//    |
        nop;//    /
        mov        eax,NtCreateSection;
        add     eax,ulHeadLen;
        jmp     eax
    }
}

NTSTATUS
DetourNtCreateSection(OUT PHANDLE SectionHandle,
            IN ACCESS_MASK DesiredAccess,
            IN POBJECT_ATTRIBUTES ObjectAttributes,
            IN PLARGE_INTEGER SectionSize OPTIONAL,
            IN ULONG Protect,
            IN ULONG Attributes,
            IN HANDLE FileHandle){//代理函数
    PFILE_OBJECT    FileObject;
    POBJECT_NAME_INFORMATION wcFilePath;
    //由Protect判断当前Section是否可执行:一般将要执行的DLL和EXE的都是Section可执行的
    if (Protect & (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY) ){
        //获取FileHandle对应的FILE_OBJEC——其有我们感兴趣的成员和作用
        if (NT_SUCCESS(ObReferenceObjectByHandle(FileHandle,0,NULL,KernelMode,&FileObject,NULL))){//获取文件对象       
        //获取FileObject对应的文件全路径
            if (IoQueryFileDosDeviceName(FileObject,&wcFilePath)==STATUS_SUCCESS){//获取文件对象所对应的文件Dos设备名称,即是全路径
               
                DbgPrint("[TrueCell] %ws\r\n",wcFilePath->Name.Buffer);
                ExFreePool(wcFilePath);//IoQueryFileDosDeviceName获取的OBJECT_NAME_INFORMATION 需要手动释放
            }
            ObDereferenceObject(FileObject);//放弃对FileObject的引用
        }       
    }
    //“返回”到真正的“跳板”处,完成Hook过程
    return GoNtCreateSection(SectionHandle,DesiredAccess,ObjectAttributes,SectionSize,Protect,Attributes,FileHandle);   
}

BOOLEAN HookFunc(BOOLEAN IsHook){
    ULONG  Offset;
    KIRQL  Irql;   
    ULONG  CR0Value;
    hde32s hs;
    PUCHAR code_pos;

if (IsHook==FALSE && ulHeadLen==0){
        return FALSE;
    }
    KdPrint(("[TrueCell] %s\r\n",IsHook?"Hook":"UnHook"));

Irql=KeRaiseIrqlToDpcLevel();
    if (IsHook){
        Offset=(ULONG)DetourNtCreateSection-(ULONG)NtCreateSection-5;
        RtlCopyMemory(NewFuncHead+1,(PUCHAR)&Offset,4);

code_pos=(PUCHAR )NtCreateSection;
        while (ulHeadLen<5){//利用反汇编引擎HDE,解析目标函数位置头部能容纳Hook跳转指令所需空间的大小
            RtlZeroMemory(&hs,sizeof(hs));
            ulHeadLen+=hde32_disasm(code_pos,&hs);
            code_pos+=ulHeadLen;
        }
        RtlCopyMemory(OriFuncHead,(PUCHAR)NtCreateSection,ulHeadLen);
        RtlCopyMemory(GoNtCreateSection,(PUCHAR)NtCreateSection,ulHeadLen);//将目标函数位置头部的指令复制到踏板函数体内
    }   
    _asm{//关闭写保护
        cli;
        push eax;   
        mov eax,cr0;
        mov CR0Value,eax;
        and eax,0xfffeffff;
        mov cr0,eax;
        pop eax;
    }
    if (IsHook){
        RtlMoveMemory((PUCHAR)NtCreateSection,NewFuncHead,5);
    }else{
        RtlMoveMemory((PUCHAR)NtCreateSection,OriFuncHead,ulHeadLen);
    }
    _asm{//重启写保护
        push eax;
        mov eax,CR0Value;
        mov cr0,eax;
        pop eax;
        sti;
    }
    KeLowerIrql(Irql);

return TRUE;
}

转载于:https://www.cnblogs.com/vcerror/p/4289158.html

HOOK NtCreateSection相关推荐

  1. 内核编程之SSDTHook(3)Hook NtCreateSection监控所有可执行模块加载

    本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/d ...

  2. 阻止反外挂GPK/sys加载思路

    思路建议: sys 驱动加载之前,要 CreateService ,试试拦截这个api?或者更底层? 不重启的话,Hook ZwLoadDriver,ZwSetSysteminformation基本就 ...

  3. 内核级HOOK的几种实现与应用

    实现内核级 HOOK 对于拦截.分析.跟踪系统内核起着致关重要的作用.实现的方法不同意味着应用侧重点的不同.如想要拦截 NATIVE API 那么可能常用的就是 HOOK SERVICE TABLE  ...

  4. 也谈SSDT Hook(二)

    一.实战篇 本不想摘代码,既然实战,就不多讲废话了,还是贴上吧,谁都有违背原则的时候:). 代码一:经典案例,替换NtQuerySystemInformation,列取所有查询到的进程名,我使用修改C ...

  5. 分析了一下360安全卫士的HOOK

    by: achillis 分析了一下360的HOOK,通过直接hook KiFastCallEntry实现对所有系统调用的过滤. 我分析的版本如下: 主程序版本: 6.0.1.1003 HookPor ...

  6. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  7. 在React Hook里使用history.push跳转

    在React Hook里使用history.push跳转 react hook里用不了this.props.history的解决方法 首先引入 import { useHistory } from ' ...

  8. 在react hook里使用mobx(配置mobx依赖)

    在powershell里安装依赖 (直接npm i mobx或者npm i mobx-react是会报错的) npm i mobx mobx-react --save save是下载到"de ...

  9. HDU-1698-Just a Hook

    HDU-1698-Just a Hook http://acm.hdu.edu.cn/showproblem.php?pid=1698 还是成段更新线段树 #include<stdio.h> ...

  10. 一套使用注入和Hook技术托管入口函数的方案

    工作中,我们可能会经常使用开源项目解决一些领域中的问题.这种"拿来主义"是一种"专业人干专业事"的思想,非常实用.(转载请指明出于breaksoftware的c ...

最新文章

  1. python中的列表生成式_Python中的列表生成式
  2. 图解 wp WordPress 文章 链接 在新窗口打开
  3. 变更AD计算机名称和IP地址
  4. SpringBoot+MyBatis+Shiro 搭建杂谈
  5. CSS------给字体添加边框时,边框大小无法改变问题
  6. java jai create 方法_使用JAI扩展Java Image的功能
  7. c# 保存和打开文件的方法
  8. 图像拼图:HTML游戏
  9. VC下ctreectrl的使用方法及节点前图标添加方法
  10. python 容器类型存放_Python学习笔记三(容器)
  11. freeswith 录制 MP4格式视频
  12. Unix网络编程第一卷学习总结
  13. Java动态数组ArrayList
  14. 推荐一款STM32F030K6T6兼容替换灵动MM32F031K6T6
  15. 在家做什么可以赚钱?适合在家的5个小项目!
  16. 牛客SQL练习-39-针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引
  17. 教资计算机报高中害死初中,教师资格证报名入口必须电脑登录吗_中小学教师资格考试网...
  18. Oracle提高命中率及优化
  19. Ubuntu配置Hadoop——(七)安装配置Spark
  20. php玩偶,玩偶娃衣 织法教程|毛衣花样图解|视频教程-编织人生

热门文章

  1. android内存泄露问题分析,内存泄露实例分析 -- Android内存优化第四弹
  2. python import as 实例化_python中import list,dictionary常量在class实例化时遇到的坑
  3. myeclipse导入项目中文乱码_建立一个可烧录的空项目
  4. MFC 多字节和UNICODE的相互转换(解决中文utf8-ASCNII乱码问题)
  5. 专访 | 阿里前辈李智慧:如何培养架构思维,我把20年的架构经讲给你听
  6. ArcCatalog连接ArcSDE连接报:unable to create new database connection file,permission is denied
  7. Ubuntu编写第一个Python程序
  8. 在iOS中获取UIView的所有层级结构 相关
  9. JS中showModalDialog (模态窗口)详细使用
  10. 什么是Code Review