通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
简析利用调试寄存器实现内核函数的HOOK
责任编辑:酷酷の鱼   更新日期:2008-3-11
 

 

void PrintHook()
{
  DbgPrint(" Now Get In ZwCreateFile Hook: %d...Pid: %d...\n", g_HookNumber++, (DWORD)PsGetCurrentProcessId());
}

__declspec(naked) void NewZwCreateFile()
{
  __asm
  {   
    pushfd;                 // 仅仅适合于 XP 操作系统
    call PrintHook;
    popfd;
    mov eax,0x25;         
    jmp g_OldCreateFile;
  }
}

void SetHB()         // set hardware breakpoint 设置硬件断点
{
  __asm
  {
    mov eax, ZwCreateFile;     // 想要挂接的函数或者地址
    mov dr0, eax;
    mov eax, dr7;
    or eax, 0x2703;         // 也要修改 dr7:GD 位,以免DrX被操作系统或其他程序修改
    and eax, 0xfff0ffff;
    mov dr7, eax;
  }
}

__declspec(naked) void NewDBEntry()
{
  __asm
  {
    pushfd;
    push eax;

    mov eax, dr6;
    test eax, 0x2000;
    jz NOT_EDIT_DRX;

    // 以下是如果有对DRX的操作的简单处理,如有需要可以修改
    // 我只是简单的跳过这些指令
    and eax, 0xFFFFDFFF;
    mov dr6, eax;         // 清除DR6的标志

    cmp g_bExit, 0;
    jnz MY_DRV_EXIT;     // 驱动 Unload

    mov eax, [esp+8];     // 获取堆栈中的 EIP
    add eax, 3;           // 由于所有对 DRX 的操作全都是3个字节的
    mov [esp+8], eax;     // 修改 EIP ,跳过当前指令,返回时执行下条指令

    jmp MY_INT_END;

NOT_EDIT_DRX:

    mov eax, dr6;
    test eax, 0x1;
    jz SYS_INT;         // 如果不是Dr0 产生的中断,则跳回原系统中断

    mov eax, [esp+8];
    cmp eax, ZwCreateFile;   // 判断一下是不是 ZwCreateFile 的线性地址
    jnz SYS_INT;

    mov eax, NewZwCreateFile;
    mov [esp+8],eax;     // 修改堆栈中的 EIP ,实现返回时跳转


MY_INT_END:   

    mov eax, dr7;
    or eax, 0x2000;     // 恢复 GD 位
    mov dr7, eax;

MY_DRV_EXIT:             // 整个驱动 UnLoad 时,不恢复 Dr7

    pop eax;
    popfd;
    iretd;

SYS_INT:
    pop eax;
    popfd;
    jmp g_OldDBEntry;
    
  }
}

DWORD GetDBEntry()
{
  PIDTENTRY IdtEntry;
  DWORD Entry;

  __asm sidt g_IDTR;

  IdtEntry = (PIDTENTRY)(g_IDTR.IDTBase + 8);

  Entry = IdtEntry->HiOffset << 16;
  
  Entry |= IdtEntry->LowOffset;

  return Entry; 
}

void HookDBInt()
{
  DWORD NewEntry;
  PIDTENTRY IdtEntry;

  NewEntry = (DWORD)NewDBEntry;

  g_OldCreateFile = (DWORD)ZwCreateFile + 5;     // 新的要跳转过去的地址

  g_OldDBEntry = GetDBEntry();

  IdtEntry = (PIDTENTRY)(g_IDTR.IDTBase + 8);

  CliAndDisableWPBit();

  IdtEntry->LowOffset = (USHORT)NewEntry;

  IdtEntry->HiOffset = (USHORT)( NewEntry >> 16 );

  ReLoadCR0AndSti();

  SetHB();

  g_bExit = FALSE;

  return;
}

void UnHookDBInt()
{
  PIDTENTRY IdtEntry;
  DWORD Entry;
  
  __asm sidt g_IDTR;
  
  IdtEntry = (PIDTENTRY)(g_IDTR.IDTBase + 8);

  CliAndDisableWPBit();

  g_bExit = TRUE;

  __asm mov eax, dr7;           // 产生一次例外并且清除Dr7:GD

  if ( g_OldDBEntry != 0 )
  {
    IdtEntry->LowOffset = (USHORT)g_OldDBEntry;
    
    IdtEntry->HiOffset = (USHORT)( g_OldDBEntry >> 16 );     
  }

  ReLoadCR0AndSti();
  
  DbgPrint(" UnLoad drx hook..\n");

  return;
}

NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject)
{   
  UnHookDBInt();
  
  return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(
              IN PDRIVER_OBJECT DriverObject,
              IN PUNICODE_STRING RegistryPath
              )
{
  HookDBInt();
  
  DriverObject->DriverUnload = DriverUnload;

  DbgPrint("Load drxhook Driver Ok...\n");

  return STATUS_SUCCESS;
}
/***********************/

以上代码实现了简单的ZwCreateFile 函数的HOOK,可以拿DbgView查看效果.

由于本人水平有限,代码中难免有错误出现,希望指正.
同时也希望各位牛人来指点,yykingking@126.com




/**************下面是罗嗦几句********************/
1.这个方法呢首先不怎么实用,因为你用了调试寄存器后某些壳也想用,因此就冲突了,可能会使某些东西失效,不如传统的HOOK好用(据说利用缺页中断HOOK也比较好用,没试过)。还有人认为呢这个HOOK虽然是HOOK成功了,但是还得HOOK中断向量,没有必要。其实呢,只是多了种思路罢了,多给大家提供一些想法而已。
2.其次呢,这个方法是我在调试某ARK时想到的,这个ARK的作者说他们会恢复函数的inline hook然后才去调用(大面积的恢复,甚至是整个文件的恢复),于是我就用调试器在该函数上下断点,结果自然是没有断下了,因为下的 (0xcc)断点被恢复了。于是就索性下了个硬件断点,这下就断住了,然后呢就想到了拿这个东西来HOOK。然后就去网上搜资料,发现不少人还是稍微提到过这个方法的,包括 vxk,xikug,都说过。

上一页  [1] [2] 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    普通文章 FBI承认多次违规获取公民个人资料
    普通文章 百度Hi进入扫尾阶段 公测在即
    普通文章 谷歌手机平台遭质疑 Android开发包现漏洞
    普通文章 推荐:网络病毒安全防范诀窍共分享
    普通文章 简析利用调试寄存器实现内核函数的HOOK
    普通文章 fckeditor网页编辑器的漏洞
    普通文章 遇到sql server 2005 ,恢复xp_cmdshell的办法
    普通文章 斗地主4.0注册算法分析
    普通文章 浪漫情书v3.11注册算法分析
    普通文章 企业如何处理自己产品的安全漏洞
    热门文章
    普通文章瑞星公司03月01日发布 每日计算机病毒及木马播报
    普通文章微软Hotmail故障未解决 用户转用谷歌
    普通文章关注未成年人 欧盟5500万营造安全网络环境
    普通文章德国司法部门在线搜查须获法官许可
    普通文章Safari不在贝宝(paypal)安全浏览器列表中
    普通文章“艳照门”图片长沙再拘人
    普通文章手机版火狐浏览器年内推出 暂瞄准视窗和Linux
    普通文章美国白领社交网站LinkedIn昨晚瘫痪一个小时
    普通文章黑客行为调查:四成以上黑客在研究“免杀”病毒
    普通文章AJAX应用程序容易遭受到新型攻击
    精彩专题