首页 网络安全 安全学院 查看内容

一份非常棒的inline hook代码

2008-12-20 10:43 878 0

摘要: #include <ntddk.h> #include <ntifs.h>#include <windef.h>ULONG g_KiInsertQueueApc;U...
关键词: nbsp KiInsertQueueApc micro Ouml Ocirc Ecirc frac yacute ETH pound

#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; VOIDfake_KiInsertQueueApc (    PKAPC Apc,    KPRIORITY Increment    );    VOIDProxy_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) VOIDfake_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) VOIDProxy_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;÷KiInsertQueueApcULONG 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;}
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部