一份非常棒的inline hook代码

本文介绍了一种在Windows内核模式下实现Apc钩子的方法,通过修改KiInsertQueueApc函数来实现对Apc的拦截与代理调用。文章详细展示了如何寻找KiInsertQueueApc地址并进行内联钩子操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 #include <ntddk.h> #include <ntifs.h>#include <windef.h>ULONG g_KiInsertQueueApc;ULONG g_uCr0; BYTE g_HookCode[5] = { 0xe9, 0, 0, 0, 0 };BYTE g_OrigCode[5] = { 0 }; // &Ocirc;&shy;&ordm;&macr;&E ...
#include <ntddk.h>
#include <ntifs.h>
#include <windef.h>
ULONG g_KiInsertQueueApc;
ULONG g_uCr0;

BYTE g_HookCode[5] = { 0xe9, 0, 0, 0, 0 };
BYTE g_OrigCode[5] = { 0 }; // &Ocirc;&shy;&ordm;&macr;&Ecirc;&yacute;&micro;&Auml;&Ccedil;°×&Ouml;&frac12;&Uacute;&Auml;&Uacute;&Egrave;&Yacute;
BYTE jmp_orig_code[7] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00 }; //&Ograve;ò&Icirc;&ordf;&Ecirc;&Ccedil;&sup3;¤×&ordf;&Ograve;&AElig;&pound;&not;&Euml;ù&Ograve;&Ocirc;&Oacute;&ETH;&cedil;&ouml; 0x08

BOOL g_bHooked = FALSE;

VOID
fake_KiInsertQueueApc (
    PKAPC Apc,
    KPRIORITY Increment
    );
   
VOID
Proxy_KiInsertQueueApc (
    PKAPC Apc,
    KPRIORITY Increment
    );

void WPOFF()
{
  
    ULONG uAttr;
  
    _asm
    {
        push eax;
        mov eax, cr0;
        mov uAttr, eax;
        and eax, 0FFFEFFFFh; // CR0 16 BIT = 0
        mov cr0, eax;
        pop eax;
        cli
    };
  
    g_uCr0 = uAttr; //±&pound;&acute;&aelig;&Ocirc;&shy;&Oacute;&ETH;&micro;&Auml; CRO &#338;&Ugrave;&ETH;&Ocirc;
  
}

VOID WPON()
{
  
    _asm
    {
        sti
        push eax;
        mov eax, g_uCr0; //&raquo;&Ouml;&#143;&Iacute;&Ocirc;&shy;&Oacute;&ETH; CR0 &#338;&Ugrave;&ETH;&Ocirc;
        mov cr0, eax;
        pop eax;
    };
  
}


//
// &Iacute;&pound;&Ouml;&sup1;inline hook
//
VOID UnHookKiInsertQueueApc ()
{
    KIRQL  oldIrql;

    WPOFF();
    oldIrql = KeRaiseIrqlToDpcLevel();
   
    RtlCopyMemory ( (BYTE*)g_KiInsertQueueApc, g_OrigCode, 5 );

    KeLowerIrql(oldIrql);
    WPON();

    g_bHooked = FALSE;
}


//
// &iquest;&ordf;&Ecirc;&frac14;inline hook --  KiInsertQueueApc
//
VOID HookKiInsertQueueApc ()
{
    KIRQL  oldIrql;

    if (g_KiInsertQueueApc == 0) {
        DbgPrint("KiInsertQueueApc == NULL/n");
        return;
    }

    //DbgPrint("&iquest;&ordf;&Ecirc;&frac14;inline hook --  KiInsertQueueApc/n");
    DbgPrint( "KiInsertQueueApc&micro;&Auml;&micro;&Oslash;&Ouml;·t0x%08x/n", (ULONG)g_KiInsertQueueApc );
    // ±&pound;&acute;&aelig;&Ocirc;&shy;&ordm;&macr;&Ecirc;&yacute;&micro;&Auml;&Ccedil;°×&Ouml;&frac12;&Uacute;&Auml;&Uacute;&Egrave;&Yacute;
    RtlCopyMemory (g_OrigCode, (BYTE*)g_KiInsertQueueApc, 5);//&iexcl;&iuml;
    *( (ULONG*)(g_HookCode + 1) ) = (ULONG)fake_KiInsertQueueApc - (ULONG)g_KiInsertQueueApc - 5;//&iexcl;&iuml;
   
   
    // &frac12;&ucirc;&Ouml;&sup1;&Iuml;&micro;&Iacute;&sup3;&ETH;&acute;±&pound;&raquo;¤&pound;&not;&Igrave;á&Eacute;&yacute;IRQL&micro;&frac12;DPC
    WPOFF();
    oldIrql = KeRaiseIrqlToDpcLevel();
 
    RtlCopyMemory ( (BYTE*)g_KiInsertQueueApc, g_HookCode, 5 );
    *( (ULONG*)(jmp_orig_code + 1) ) = (ULONG) ( (BYTE*)g_KiInsertQueueApc + 5 );//&iexcl;&iuml;
   
    RtlCopyMemory ( (BYTE*)Proxy_KiInsertQueueApc, g_OrigCode, 5);//&ETH;&THORN;&cedil;&Auml;Proxy_KiInsertQueueApc&ordm;&macr;&Ecirc;&yacute;&Iacute;·
    RtlCopyMemory ( (BYTE*)Proxy_KiInsertQueueApc + 5, jmp_orig_code, 7);

    // &raquo;&Ouml;&cedil;&acute;&ETH;&acute;±&pound;&raquo;¤&pound;&not;&frac12;&micro;&micro;&Iacute;IRQL
    KeLowerIrql(oldIrql);
    WPON();

    g_bHooked = TRUE;
   
   
}

//
// &Igrave;&oslash;×&ordf;&micro;&frac12;&Icirc;&Ograve;&Atilde;&Ccedil;&micro;&Auml;&ordm;&macr;&Ecirc;&yacute;&Agrave;&iuml;&Atilde;&aelig;&frac12;&oslash;&ETH;&ETH;&Ocirc;¤&acute;&brvbar;&Agrave;í
//
__declspec (naked)
VOID
fake_KiInsertQueueApc (
    PKAPC Apc,
    KPRIORITY Increment
    )
{
 

    // &Egrave;&yen;&micro;&ocirc;DbgPrint,&sup2;&raquo;&Egrave;&raquo;&Otilde;&acirc;&cedil;&ouml;hook&raquo;á&sup2;ú&Eacute;ú&micro;&Yacute;&sup1;é
    //DbgPrint("inline hook --  KiInsertQueueApc &sup3;&Eacute;&sup1;&brvbar;/n");
 
    __asm
    {
               jmp Proxy_KiInsertQueueApc   //&iexcl;&iuml;&Ocirc;&Uacute;&Otilde;&acirc;&Ograve;&raquo;&Iuml;&micro;&Aacute;&ETH;JMP&Ouml;&ETH;&pound;&not;&Atilde;&raquo;&Oacute;&ETH;&Ograve;&raquo;&acute;&brvbar;&Ecirc;&sup1;&Oacute;&Atilde;CALL&pound;&not;&frac14;ò&raquo;&macr;&Aacute;&Euml;&acute;ú&Acirc;&euml;&pound;&not;&Ocirc;&ouml;&Ccedil;&iquest;&Aacute;&Euml;&Icirc;&Egrave;&para;¨&ETH;&Ocirc;
    }
}

//
// &acute;ú&Agrave;í&ordm;&macr;&Ecirc;&yacute;&pound;&not;&cedil;&ordm;&Ocirc;&eth;&Igrave;&oslash;×&ordf;&micro;&frac12;&Ocirc;&shy;&ordm;&macr;&Ecirc;&yacute;&Ouml;&ETH;&frac14;&Igrave;&ETH;&oslash;&Ouml;&acute;&ETH;&ETH;
//
__declspec (naked)
VOID
Proxy_KiInsertQueueApc (
    PKAPC Apc,
    KPRIORITY Increment
    )
{
 
    __asm {  // &sup1;&sup2;×&Ouml;&frac12;&Uacute;
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90  // &Ccedil;°×&Ouml;&frac12;&Uacute;&Ecirc;&micro;&Iuml;&Ouml;&Ocirc;&shy;&ordm;&macr;&Ecirc;&yacute;&micro;&Auml;&Iacute;·×&Ouml;&frac12;&Uacute;&sup1;&brvbar;&Auml;&Uuml;
            _emit 0x90  // &Otilde;&acirc;&cedil;&ouml;&Igrave;&icirc;&sup3;&auml;jmp
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90  // &Otilde;&acirc;×&Ouml;&frac12;&Uacute;±&pound;&acute;&aelig;&Ocirc;&shy;&ordm;&macr;&Ecirc;&yacute;+5&acute;&brvbar;&micro;&Auml;&micro;&Oslash;&Ouml;·
            _emit 0x90 
            _emit 0x90  // &Ograve;ò&Icirc;&ordf;&Ecirc;&Ccedil;&sup3;¤×&ordf;&Ograve;&AElig;,&Euml;ù&Ograve;&Ocirc;±&Oslash;&ETH;&euml;&Ecirc;&Ccedil;0x0080
    }
}

 


ULONG GetFunctionAddr( IN PCWSTR FunctionName)
{
    UNICODE_STRING UniCodeFunctionName;
    RtlInitUnicodeString( &UniCodeFunctionName, FunctionName );
    return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName );  

}

//&cedil;ù&frac34;&Yacute;&Igrave;&Oslash;&Otilde;÷&Ouml;&micro;&pound;&not;&acute;&Oacute;KeInsertQueueApc&Euml;&Ntilde;&Euml;÷&Ouml;&ETH;&Euml;&Ntilde;&Euml;÷KiInsertQueueApc
ULONG FindKiInsertQueueApcAddress()
{
  char * Addr_KeInsertQueueApc = 0;
  int i = 0;
  char Findcode[] = { 0xE8, 0xcc, 0x29, 0x00, 0x00 };
  ULONG Addr_KiInsertQueueApc = 0;
    Addr_KeInsertQueueApc = (char *) GetFunctionAddr(L"KeInsertQueueApc");
  for(i = 0; i < 100; i ++)
  {
        if( Addr_KeInsertQueueApc[i] == Findcode[0] &&
      Addr_KeInsertQueueApc[i + 1] == Findcode[1] &&
      Addr_KeInsertQueueApc[i + 2] == Findcode[2] &&
      Addr_KeInsertQueueApc[i + 3] == Findcode[3] &&
      Addr_KeInsertQueueApc[i + 4] == Findcode[4]
      )
    {
      Addr_KiInsertQueueApc = (ULONG)&Addr_KeInsertQueueApc[i] + 0x29cc + 5;
      break;
    }
  }
  return Addr_KiInsertQueueApc;
}


VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
  DbgPrint("My Driver Unloaded!");
  UnHookKiInsertQueueApc();
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
  DbgPrint("My Driver Loaded!");
  theDriverObject->DriverUnload = OnUnload;
   
  g_KiInsertQueueApc = FindKiInsertQueueApcAddress();
  HookKiInsertQueueApc();

  return STATUS_SUCCESS;
}

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
内容概要:本文详细介绍了IEEE论文《Predefined-Time Sensorless Admittance Tracking Control for Teleoperation Systems With Error Constraint and Personalized Compliant Performance》的复现与分析。论文提出了一种预定义时间的无传感器导纳跟踪控制方案,适用于存在模型不确定性的遥操作系统。该方案通过具有可调刚度参数的导纳结构和预定义时间观测器(PTO),结合非奇异预定义时间终端滑模流形和预定义时间性能函数,实现了快速准确的导纳轨迹跟踪,并确保误差约束。文中详细展示了系统参数定义、EMG信号处理、预定义时间观测器、预定义时间控制器、可调刚度导纳模型及主仿真系统的代码实现。此外,还增加了动态刚度调节器、改进的广义动量观测器和安全约束模块,以增强系统的鲁性和安全性。 适合人群:具备一定自动化控制理论基础和编程能力的研究人员、工程师,尤其是从事机器人遥操作、人机交互等领域工作的专业人士。 使用场景及目标:①理解预定义时间控制理论及其在遥操作系统中的应用;②掌握无传感器力观测技术,减少系统复杂度;③学习如何利用肌电信号实现个性化顺应性能调整;④探索如何在保证误差约束的前提下提高系统的响应速度和精度。 阅读建议:本文内容涉及较多的数学推导和技术细节,建议读者先熟悉基本的控制理论和Python编程,重点理解各个模块的功能和相互关系。同时,可以通过运行提供的代码示例,加深对理论概念的理解,并根据自身需求调整参数进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值