一份非常棒的inline hook代码

 #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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值