NT内核下的inline hook

普及X64 ssdtshadow inline HOOK 序: 我只想说~~再不发帖老大就 不搭理我了~~~ 原因:玩保护玩到了 XINGCODE3 就他的各种检测就让我不得不重视这个问题了:o: 各种窗口 各种X 我的工具 让我忍无可忍,就决定先HOOK了在说其他 最开始我用TA 的代码里面的 HOOK 方法 在 挂钩 NT 内核中的函数算是无往不利 在SHADOWSSDT中就蛋疼菊花紧了~~ 于是 开始自己搞:mad::mad: 阅读详情
inline hook原理大概如下:
     修改被HOOK函数A的头5个字节,使其跳转到我们自定义的函数B,函数B的类型与函数A要相同。因为我们是使用JMP直接跳转到函数B,
 而不是使用正常的CALL指令。在函数B内,我们可以检查函数参数,然后可以直接返回。也可以再调用函数A的一个副本。这个副本在HOOK动作发生的同时,就保存下来了。
     代码非常简单,工程打包供大家学习。高手飘过


/*
 * krembo.c, Demonstration of inline hooking (aka. Detouring) within driver/kernel.
 * - izik@tty64.org
 */

#include <ntddk.h>

// Assembly JMP opcode value

#ifndef X86_JMP
#define X86_JMP 0xE9
#endif

// Number of bytes to overwrite

#ifndef JMP_LENGTH
#define JMP_LENGTH sizeof(X86_JMP) + sizeof(int)
#endif

// Size of a page (4k)

#ifndef PAGE_SIZE
#define PAGE_SIZE 0x1000
#endif

// Pointers macros

#define PAGE_MASK(ptr) (ptr & 0xFFFFF000)

#define OFFSET_IN_PAGE(ptr) (ptr - (ptr & 0xFFFFF000))

// RtlRandom pointer prototype

typedef unsigned long (*RTLRANDOM)(
  unsigned long *seed
);

// Pointers to duplicated (original) and current versions of RtlRandom

RTLRANDOM pDupRtlRandom;
RTLRANDOM pCurRtlRandom;

/*
 * DetourFunction, Detour a function (Install Detour)
 * * pFcnAddr, Pointer to the soon-to-be-detoured function
 * * iHookAddr, Address of the hook function
 * * iPoolType, Pool type of allocated memory
 */

void *DetourFunction(char *pFcnAddr, int iHookAddr, int iPoolType) {
  void *pOrigPage;
    
  // Allocate a `PAGE_SIZE` for the original function (duplicate)
  
  pOrigPage = ExAllocatePoolWithTag(iPoolType, PAGE_SIZE, 0xdeadbeef);//分配一页内存,该函数在WIN 2000下可能不存在,XP下没问题
  
  // Is there enough resources?
  
  if (pOrigPage == NULL) {
    return NULL;
  }
  
  // Duplicate the entire page
  
  RtlCopyMemory(pOrigPage, (char *)PAGE_MASK((int)pFcnAddr), PAGE_SIZE);//拷贝函数内容,把函数所在的一整页都拷贝下来。如果函数不仅仅占据一页呢?
  
  // Calculate the relocation to `iHookAddr`
  
  iHookAddr -= ((int)pFcnAddr + 5);//iHookAddr = iHookAddr - (pFcnAddr +5)  iHookAddr是跳转的相对地址
  
  _asm
  {
    CLI          // disable interrupt
    MOV EAX, CR0    // move CR0 register into EAX
    AND EAX, NOT 10000H // disable WP bit 
    MOV CR0, EAX    // write register back 
  }
  
  // Overwrite the first `JMP_LENGTH` bytes of pFcnAddr (Detour it) 
  
  *(pFcnAddr) = X86_JMP;
  *(pFcnAddr+1) = (iHookAddr & 0xFF);
  *(pFcnAddr+2) = (iHookAddr >> 8) & 0xFF;
  *(pFcnAddr+3) = (iHookAddr >> 16) & 0xFF;
  *(pFcnAddr+4) = (iHookAddr >> 24) & 0xFF;
  
  _asm 
  {
    MOV EAX, CR0    // move CR0 register into EAX
    OR EAX, 10000H    // enable WP bit 
    MOV CR0, EAX    // write register back 
    STI          // enable interrupt
  }
  
  // Return pointer to the duplicate function (within the duplicate page)
  
  return (void *)((int)pOrigPage + OFFSET_IN_PAGE((int)pFcnAddr));//返回我们保存的函数副本地址(原件)
}

/*
 * MyRtlRandom, RtlRandom hook
 * * seed, given seed
 */

unsigned long MyRtlRandom(unsigned long *seed) {//HOOK发生时,原始函数跳转到该函数位置,★该函数的类型与原始函数相同
  unsigned long retval;

  DbgPrint(("MyRtlRandom invoked "));
  
  retval = pDupRtlRandom(seed);  //retval 是被HOOK函数的原件的地址,见DriverEntry(),在该函数内部又调用原始函数的原件(副本)
  
  //DbgPrint(("Returning value = %d, from OldRtlRandom(%d)/n"));
  
  return retval;
}

/*
 * RestoreDetouredFunction, Restore a detoured function (Remove detour)
 * * pDupFcn, Pointer to the duplicated function
 * * pOrigFcn, Pointer to the original function
 */

void RestoreDetouredFunction(char *pOrigFcn, char *pDupFcn) { //移除HOOK
  int offset;
  
  _asm
  {
    CLI          // disable interrupt
    MOV EAX, CR0    // move CR0 register into EAX
    AND EAX, NOT 10000H // disable WP bit 
    MOV CR0, EAX    // write register back 
  }

  // Uninstall the detour, Restore `JMP_LENGHT` bytes from the duplicate function.
  
  for (offset = 0; offset < JMP_LENGTH; offset++) {
    pOrigFcn[offset] = pDupFcn[offset];
  }
  
  _asm 
  {
    MOV EAX, CR0    // move CR0 register into EAX
    OR EAX, 10000H    // enable WP bit 
    MOV CR0, EAX    // write register back 
    STI          // enable interrupt
  }
  
  // Deallocate the duplicate page
  
  ExFreePoolWithTag((void *)((int)pDupFcn - OFFSET_IN_PAGE((int)pOrigFcn)), 0xdeadbeef);
  
  return ;
}

/*
 * DriverUnload, Driver unload point
 * * DriverObject, self (Driver)
 */

void DriverUnload(IN PDRIVER_OBJECT DriverObject) {
  unsigned long seed;

  if (pDupRtlRandom != NULL) { //pDupRtlRandom为我们保存的原始函数原件

    DbgPrint(("Removeing detour from RtlRandom/n"));

    // Remove detour

    RestoreDetouredFunction((char *)pCurRtlRandom, (char *)pDupRtlRandom);  

    // Do another self-test

    seed = 31337;

    pCurRtlRandom(&seed);
    
    // No bugcheck? ;-)
  }
  
  //DbgPrint(("Krembo unloaded!/n"));
  
  return ;
}

/*
 * DriverEntry, Driver Single Entry Point
 * * DriverObject, self (Driver)
 * * RegistryPath, given RegistryPath
 */

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) {
  UNICODE_STRING pFcnName;
  unsigned long seed;

  //DbgPrint(("Krembo loaded!/n"));
  
  // Register unload routine
  
  DriverObject->DriverUnload = DriverUnload;
  
  // Lookup RtlRandom address
  
  RtlInitUnicodeString(&pFcnName, L"RtlRandom");
  
  pCurRtlRandom = MmGetSystemRoutineAddress(&pFcnName);
  
  //DbgPrint(("Found RtlRandom @ 0x%08x/n", pCurRtlRandom));
  
  // Detour RtlRandom

  pDupRtlRandom = DetourFunction((char *)pCurRtlRandom, (int)MyRtlRandom, (int)NonPagedPool);

  // Detour status?

  if (pDupRtlRandom == NULL) {
    
    // Unable to detour
         
    DbgPrint(("Unable to detour RtlRandom! (Not enough resources?)/n"));
  
  } else {
  
    //DbgPrint(("Duplicate Function @ 0x%08x/n", pDupRtlRandom));

    // Detour installed, do a self-test
  
    DbgPrint(("Detour installed, going into a self-test .../n"));
    ////DbgPrint(("Detour installed, going into a self-test .../n"));
    
    // Dummy seed for the self-test
    
    seed = 31337;

    pCurRtlRandom(&seed);
    
  }
  
  return STATUS_SUCCESS;
}
通过hook Linux内核函数,监控进程/线程创建与销毁 还是实验室蛋疼项目的需求催出来的东西,蛋疼要死,CS专业读研难道就等于干2-3年义工?? Linux实际上木有线程这玩意,具体到内核里面就是个进程组头+一堆轻量级进程 太感谢Linus了,工作量瞬间下来了,在内核线程/进程无差别的,写一套东西就忽悠交差说是两套都做了,反正那帮子人也不懂。。。。 所有的进程创建都是通过do_fork()内核函数来做的,所有进程销毁都是走do_exit(),系统 阅读详情

相关推荐

内核编程之SSDTHook(2)Hook NtOpenProcess实现进程保护

本博文由优快云博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: 上一篇博文“内核编程之SSDTHook(1)原理(地址:)”中,介绍了SSDTHook的原理,这一篇博文,我们来写一个实例,通过Hook NtOpenProcess来的实现进程保护。 我之前写过两篇Ring3下的API Inline Hook的博文,这两篇博文通过Inline

zuishikonghuan的博客 7725

5.9 Windows驱动开发:内核InlineHook挂钩技术

内核挂钩的原理是一种劫持系统函数调用的技术,用于在运行时对系统函数进行修改或者监控。其基本思想是先获取要被劫持的函数的地址,然后将该函数的前15个字节的指令保存下来,接着将自己的代理函数地址写入到原始函数上,这样当API被调用时,就会默认转向到自己的代理函数上执行,从而实现函数的劫持。

微软技术分享 9198

[原创]NT系统信息察看工具 : NtInfoGuy

NT系统信息查看工具,GDT,IDT,SSDT,SSDTSDW,SYSMOD,SYSVAL

享受开发,颠倒银河 5475

在Ring0下HOOK Ntdll.dll的Nt*函数的方法

typedef struct _SECTION_IMAGE_INFORMATION { PVOID EntryPoint; ULONG StackZeroBits; ULONG StackReserved; ULONG StackCommit; ULONG ImageSubsystem; WORD SubsystemVersionLow; WORD SubsystemVe

坦然 3093

绿色版简易变速齿轮工具包

变速齿轮是一款经典的Windows平台系统级调速工具,以其轻量、高效、无需安装的特性深受开发者、游戏爱好者及逆向工程人员的喜爱。其核心功能是通过调整目标程序的时钟频率,实现对程序运行速度的精确控制,适用于游戏加速、调试延时、教学演示等多种场景。本章将从工具的起源出发,探讨其功能定位、用户群体及在不同应用场景中的实际价值,为后续深入剖析其底层技术实现奠定基础。变速齿轮通过深入理解Windows NT内核的系统调用机制,结合动态适配、权限控制和安全规避策略,实现了在不同版本Windows系统上的稳定运行。

weixin_30700095的博客 884

BEVFusion(mit)最强环境安装,部署复现

BEVFusion作为一项经典的工作,值得深入探索。然而由于配置环境比较麻烦,耽误了一些时间。经过几次成功配置之后,有了一些总结,在这里记录下来,供大家参考避坑,也方便自己下次查阅。

qq_45783225的博客 1万+

一种注册表沙箱的思路、实现——Hook Nt函数

        Nt函数是在Ring3层最底层的函数了,选择此类函数进行Hook,是为了提高绕过门槛。我的Hook方案使用的是微软的Detours。(转载请指明出处)        Detours的Hook和反Hook的写入如下:DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(lpOriF...

方亮的专栏 6078

【第一篇】Xshell连接服务器部署前后端项目(连接服务器)

利用Xshell连接服务器部署前后端项目

blog 1074

驱动开发:内核层InlineHook挂钩函数

在上一章中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩其实与应用层一致,都是使用劫持执行流并跳转到我们自己的函数上来做处理,唯一的不同的是内核Hook只针对内核API函数,但由于其身处在最底层所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的,对于安全从业者来说学会使用内核挂钩也是很重要。挂钩的原理可以总结为,通过得到原函数地址,然后保存该函数的前15。

微软技术分享 1万+

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 474

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 321

详谈内核三步走Inline Hook实现

 http://www.cppblog.com/sleepwom/archive/2009/10/17/98819.html?opt=admin 详谈内核三步走Inline Hook实现(一)Inline hook原理Inline hook通俗的说就是对函数执行流程进行修改,达到控制函数过滤操作的目的。理论上我们可以在函数任何地方把原来指令替换成我们的跳转指令,也确实有些人在inline的

ivan240的专栏 1419

Linux ARM平台开发系列讲解(GMSL摄像头篇)1.2 MAX9296 GMSL链路配置

串行器 +解串器组成,软件需要做的就是写这三部分的驱动,让摄像头数据能到达。3. 配置解串器和串行器的GMSL链路。串行器和解串器上电成功之后,就可以配置。软件配置(注意软件只可以配置速率,2. 9296上电,使能芯片。的版本和速率,比如版本是配置。配置成功之后,就会出现串行器。的链路,其它同类型的。设备地址,我设置的是。...

DSMGUOGUO的博客 1万+

360内核 inline Hook 分析

今天下载了360的最新的版本,想看下最近360在内核的钩子与以前有没有变化! 与以前一样还是通过分析找到360下钩子的地方。结果发现与以前没有什么变化。 Hook之前: kd> u nt!KiFastCallEntry+0xe1nt!KiFastCallEntry+0xe1:8053e621 2be1 sub esp,ecx8053e...

anxi2128的博客 233

基于PyTorch+Transformer实现谣言检测系统

本项目使用基于`PyTorch+Transformer`的谣言检测模型,将文本中的谣言事件进行连续向量化,通过一维卷积神经网络的学习训练来挖掘表示文本深层的特征,避免了特征构建的问题,并能发现那些不容易被人发现的特征,从而产生更好的效果。

优快云 精品推荐 6352

软件设计师---计算机系统

软件设计师---计算机系统

我从不打没有准备的仗! 3万+

说说过游戏保护二

这仅仅是RING 3的普通运用而已, 千万不要认为做外挂的不会驱动. 相反,与游戏开发公司那点可怜的薪水比起来. 外挂的利润只会让更多的驱动开发者    加入这一行列. 即使你HOOK接管了这一切函数,不管是inline还是普通的ssdt. 下面的驱动很轻易的就能突破任意的HOOK.    复制内容到剪贴板    代码:    .....................    NTSTATUS N...

爱码农爱生活 233

控制科学与工程(自动化)保研经验【2】——南开、同济篇

禁止转载 1、南开人工智能学院夏令营   保研之旅第一个夏令营就是南开,南开夏令营非常早(6月份),当时我们专业仅有两人入营。夏令营前一天我们两个坐高铁来到了天津,几经辗转来到了南开的津南校区,非常偏僻。在自己找的酒店住了一晚,第二天一早去学院报到,资格审查、报销路费等等,然后开营仪式,吃饭,入住酒店,实验室参观。   开营仪式和实验室参观了解到,南开人工智能学院是国内第一批人工智能学院,和很多高...

Control Everything 6532

Windows内核实验005 Inline Hook

文章目录准备工作寻找Inline Hook的返回地址编写代码动态变化的返回地址JmpTargetAddrInline Hook基本框架示例代码实战HOOK KiTrap01无需计算偏移的Inline Hook方法示例代码 准备工作 寻找Inline Hook的返回地址 假设我们现在要HOOK KiFastCallEntry这个内核函数,让所有的程序在进入零环之前先跳到我们自己的代码。 但是会出现...

鬼手的博客 1507

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Inline Hook IofCallDriver 截获所有IRP

前段时间搞了一些Inline HOOK API的demo,例如对NtQueryDirectoryFile Inline HOOK 进行文件的隐藏,(恰好NtQueryDirectoryFile 在SSDT有导出,也可以采用改SSDT来实现HOOK.,只不过Inline HOOK 隐蔽性好点).而NtQueryDirectoryFile是调用IofCallDriver的(我猜的),那么HOOK Io

1614

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

多核发dpc安全inline hook

VOID OpSafeInlineHook(PVOID TargetAddress, PVOID ReadyOpCode, ULONG OpCodeLength) { PMDL MdlFuncAddress; ASSERT(TargetAddress && ReadyOpCode && OpCodeLength); if (ScmMapVirtualAddress(T

kedebug 1900

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

HOOK

HOOK是一种通过更改程序的数据结构或代码结构从而改变程序运行路线的一种方法。其中包括用户模式的HOOK和内核模式的HOOK(Windows 64bit 系统有SG保护,有些HOOK不能这样简单的实现,此处仅仅记录方法)。 用户层的HOOK:IAT-HOOK,  远程线程DLL注入,远程线程代码注入,内联HOOK(可用mHOOK库) 其中IAT-HOOK主要是修改程序PE文件中的IAT

BlackStone的博客 1379

HOOK集合----SSDT Inline Hook(X86 win7)

介绍: SSDT InlineHook是在SSDT Hook 基础上来进一步Hook的,SSDTHook 是直接将SSDT表中的 Nt*函数替换成Fake函数,而SSDT Inline Hook是将原函数代码的前五个字节改变为 E9 _ _ _ _ ,后面跟的是Offset,也就是我们Fake函数的偏移地址,这样当Ring3层函数,比如OpenProcess在Ring3 层被调用...

qq_42021840的博客 392

从了解 Hook 到全方面会用 Hook

文章摘要: 本文系统梳理了从Ring3到Ring-2的Hook技术演进,揭示了不同权限层级下的实现原理、检测与绕过策略。 用户态Hook(Ring3):涵盖IAT/EAT Hook、Inline Hook、VTable Hook等,通过修改函数指针或指令劫持API调用,易被内存比对或CRC校验检测。 内核态Hook(Ring0):传统手段如SSDT/IDT Hook受PatchGuard制约,高级技术如PTE Hook、回调机制(Minifilter/ObRegisterCallbacks)更隐蔽,依赖内核

csc4188的博客 304

【免杀前置课——HOOK】二十四、消息HOOK,各种句柄的区别HMODULE,HANDLE等,IAT HOOK,Inline hook,硬编码是什么?调试dll窍门(附代码)

【免杀前置课——HOOK】二十四、消息HOOK,各种句柄的区别HMODULE,HANDLE等,IAT HOOK,Inline hook,硬编码是什么?调试dll窍门(附代码)

m0_62783065的博客 1075
上一篇: 一种注入进程,获得完全操控的方法之二
下一篇: 一份非常棒的inline hook 代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值