CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

网络安全,安全,网络安全设备,信息安全产品,网络安全新闻,信息安全市场分析,黑客攻防,防黑反黑技巧,黑客,网络安全技术,网络安全方案,病毒播报,最新病毒库,攻防技巧,入侵渗透,新闻,思科,Juniper,天融信,瑞星,金山,江民,卡巴斯基,赛门铁克, 趋势,绿盟科技,联想网御,MCAFEE,安氏,冰峰网络,网络入侵,木马,病毒,病毒分析,木马分析,样本分析,木马样本分析,病毒样本分析,杀毒软件

您现在的位置: IT专家网 > 安全子站 > 安全技巧

kernel-mode内联函数挂钩的简单实现

作者: CDrea,  出处:IT专家网, 责任编辑: 张帅, 
2007-10-25 15:38
  前段时间看了uty的《kernel inline hook 绕过vice检测》,思路很好但实现起来麻烦了点。这里以CmEnumerateKey为例介绍实现inline hook的简单方法……

  前段时间看了uty的《kernel inline hook 绕过vice检测》,思路很好,但实现起来麻烦了点。这里以CmEnumerateKey为例介绍实现inline hook的简单方法,尽量依靠编译器做更多的事情。

  1、编写fake_CmEnumerateKey,在其中对CmEnumerateKey的调用做后续处理。

      Code:[Copy to clipboard]
  NTSTATUS
    fake_CmEnumerateKey(
  IN PCM_KEY_CONTROL_BLOCK KeyControlBlock,
  IN ULONG Index,
  IN KEY_INFORMATION_CLASS KeyInformationClass,
  IN PVOID KeyInformation,
  IN ULONG Length,
  IN PULONG ResultLength
  )
  {
  NTSTATUS status = STATUS_SUCCESS;
  KdPrint(("[cmhook] nt!CmEnumerateKey() called.\n"));
  status = JMP_CmEnumerateKey(KeyControlBlock, Index, KeyInformationClass, KeyInformation, Length, ResultLength);
  return status;
  }

  2、取得CmEnumerateKey的地址,备份前7个字节,之后修改CmEnumerateKey的前5个字节为jmp xxxxxxxx(fake_CmEnumerateKey入口偏移地址)。

      Code:[Copy to clipboard]
  // 保存原始的7个字节代码
  BYTE g_cOrigCode[7] = {0};
  // JMP xxxxxxxx
  BYTE g_cHookCode[5] = { 0xe9, 0, 0, 0, 0 };
  RtlCopyMemory(g_cOrigCode, (BYTE*)CmEnumerateKey, 7);
  // calc jmp offset
  *( (ULONG*)(g_cHookCode+1) ) = (ULONG)fake_CmEnumerateKey - (ULONG)CmEnumerateKey - 5;
  DisableWriteProtect(&ulAttr);
  RtlCopyMemory((BYTE*)CmEnumerateKey, g_cHookCode, 5);
  EnableWriteProtect(ulAttr);

  3、编写__declspec(naked) JMP_CmEnumerateKey,这个例程实现CmEnumerateKey被修改个7个字节的代码,并转入nt!CmEnumerateKey+7处开始执行。

      Code:[Copy to clipboard]
  __declspec(naked)
  NTSTATUS
  JMP_CmEnumerateKey(
  IN PCM_KEY_CONTROL_BLOCK KeyControlBlock,
  IN ULONG Index,
  IN KEY_INFORMATION_CLASS KeyInformationClass,
  IN PVOID KeyInformation,
  IN ULONG Length,
  IN PULONG ResultLength
  )
  {
  __asm
  {
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  _emit 0x90
  }
  }

  JMP_CmEnumerateKey的主要实现代码在程序运行时进行填充,以下是实现代码:

      Code:[Copy to clipboard]
  BYTE jmp_orig_code[7] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00 };
  // jmp 0008:nt!CmEnumerateKey+7
  *( (ULONG*)(jmp_orig_code+1) ) = (ULONG)((BYTE*)CmEnumerateKey + 7);
  DisableWriteProtect(&ulAttr);
  //
  // CmEnumerateKey修改之前的前7个字节的代码
  // 6a18 push 18h
  // 68d0de4d80 push offset nt!`string'+0xf8 (804dded0)
  //
  RtlCopyMemory((BYTE*)JMP_CmEnumerateKey, g_cOrigCode, 7);
  // jmp 0008:nt!CmEnumerateKey+7
  RtlCopyMemory((BYTE*)JMP_CmEnumerateKey+7, jmp_orig_code, 7);
  EnableWriteProtect(ulAttr);

  这里要注意一个细节,虽然只CmEnumerateKey修改了前5个字节,但这5个字节里面包含两条指令(共7个字节),因此要保存前7个字节。

  修改前:

      Code:[Copy to clipboard]
  kd> u nt!CmEnumerateKey
  nt!CmEnumerateKey:
    80605f54 6a18 push 18h
  80605f56 68d0de4d80 push offset nt!`string'+0xf8 (804dded0)
  80605f5b e80839f2ff call nt!_SEH_prolog (80529868)
  80605f60 e829abffff call nt!CmpLockRegistry (80600a8e)
  80605f65 8b4508 mov eax,dword ptr [ebp+8]
  80605f68 f6400502 test byte ptr [eax+5],2
  80605f6c 7407 je nt!CmEnumerateKey+0x21 (80605f75)
  80605f6e be7c0100c0 mov esi,0C000017Ch

  修改后:

      Code:[Copy to clipboard]
  kd> u nt!CmEnumerateKey
  nt!CmEnumerateKey:
  80605f54 e999143279 jmp cmhook+0x3f2 (f99273f2)
  80605f59 4d dec ebp
  80605f5a 80e808 sub al,8
  80605f5d 39f2 cmp edx,esi
  80605f5f ff ???
  80605f60 e829abffff call nt!CmpLockRegistry (80600a8e)
  80605f65 8b4508 mov eax,dword ptr [ebp+8]
  80605f68 f6400502 test byte ptr [eax+5],2

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    • 解析如何实现自动化的IT安全合规管理评论
      能够解决企业IT、审计和运作团队共同问题的方法一直是企业IT管理者所迫切希望的,自动化的企业合规管理将会及时的发现并掌控企业实际存在的各种问题。
    • 视频讲解:MS Windows系统安全评论
      本文将由7all为IT专家网用户讲解MS Windows操作系统。
    • 浅谈逆向工程在网络安全研究中的运用评论
      从某种程度上来说,计算机软件的逆向工程技术主要过程为分析计算机程序,在分析计算机程序的过程中,逐渐建立起高于源代码级别的更抽象层次的程序运行过程。
    • 评估Vista内核模式的安全性评论
      Windows Vista与之前的MS Windows版本(包括Windows XP SP2)相比增加了很多的安全性。Vista新安全性的特征可以包括驱动签名、PatchGuard、内核模式代码完整性检查等。

天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i