本程序使用了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;

}

HOOK NtCreateSection的更多相关文章

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

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

  2. 【旧文章搬运】分析了一下360安全卫士的HOOK

    原文发表于百度空间及看雪论坛,2009-10-08 看雪论坛地址:https://bbs.pediy.com/thread-99128.htm 看时间,09年的国庆节基本上就搞这玩意儿了...==== ...

  3. Hook exe 和 file

    c#拦截程序的运行 EasyHook  + win7 64位 LocalHook.GetProcAddress("Kernel32.dll", "CreateProces ...

  4. svnserver hook python

    在使用中可能会遇到的错误排除 :1.Error: svn: 解析"D:\www\test"出错,或svn: E020024: Error resolving case of 'D: ...

  5. Android Hook技术

    原文:http://blog.csdn.net/u011068702/article/details/53208825 附:Android Hook 全面入侵监听器 第一步.先爆项目demo照片,代码 ...

  6. Frida HOOK微信实现骰子作弊

    由于微信摇骰子的功能在本地进行随机后在发送,所以存在可以hook掉判断骰子数的方法进行修改作弊. 1.frida实现hook java层函数1)写个用来测试的demo,当我们点击按钮的时候会弹出窗口显 ...

  7. java的关闭钩子(Shutdown Hook)

    Runtime.getRuntime().addShutdownHook(shutdownHook);    这个方法的含义说明:        这个方法的意思就是在jvm中增加一个关闭的钩子,当jv ...

  8. IDT HOOK思路整理

    IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...

  9. Android Hook 借助Xposed

    主要就是使用到了Xposed中的两个比较重要的方法,handleLoadPackage获取包加载时候的回调并拿到其对应的classLoader:findAndHookMethod对指定类的方法进行Ho ...

随机推荐

  1. Merge k Sorted Arrays【合并k个有序数组】【优先队列】

    Given k sorted integer arrays, merge them into one sorted array. Example Given 3 sorted arrays: [ [1 ...

  2. D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本)

    现在用D3.js + react做一个带坐标轴和比例尺的柱形图.我已经尽力把代码全部注释上了,最后我也会把完整柱形图代码奉上.如果还有疑惑的,可以去翻看一下我之前介绍的方法,以下方法都有介绍到. 还有 ...

  3. vue 报错:Cannot read property '__ob__' of undefined

    我的原因:引入组件后未注册 <script> import ComFirst from "../../components/ComFirst.vue" import C ...

  4. JVM基本知识总结

    大概两三个月之前阅读了<深入理解Java虚拟机>(周志明著),也为了加深印象,这里简单的做下总结,想完整点了解JVM知识的也可以阅读本书,书写的不错,相当通俗易懂. 第一部分 内存管理机制 ...

  5. CSIC_716_20191119【常用模块的用法 subprocess、re、logging、防止自动测试、包的理论】

    subprocess模块 可以通过python代码给操作系统终端发送命令,并可以得到返回结果. import subprocess str = input('>>>请输入命令') # ...

  6. [转]SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程【附源代码Demo】

    一.新建项目 运行IDEA,进入初始化界面,然后我们选择新建项目(进入主界面新建项目也是一样的) 在Maven选项卡里面找到对应的java web选项,然后我们点下一步 这一步填入组织等信息,这里比较 ...

  7. Java 多线程 - synchronized与Lock的区别

    https://blog.csdn.net/qq_39521554/article/details/81130442 http://www.cnblogs.com/huangbw/p/8516024. ...

  8. luoguP1890 gcd区间 [st表][gcd]

    题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...

  9. python相关软件安装流程图解——MySQL 8.0.13安装教程(windows 64位)——MYSQL依赖的软件——MYSQL必须的系统DLL插件——MYSQL真正的安装

    https://www.mysql.com/https://www.mysql.com/downloads/https://dev.mysql.com/downloads/windows/https: ...

  10. (转)获取android手机内部存储空间和外部存储空间的参数 && 如何决定一个apk的安装位置

    转:http://blog.csdn.net/zhandoushi1982/article/details/8560233 获取android文件系统的信息,需要Environment类和StatFs ...