简单inline hook ObReferenceObjectByHandle保护进程和屏蔽文件执行

2013年02月22日 ⁄ 综合 ⁄ 共 3602字 ⁄ 字号 小 中 大 ⁄ 评论关闭
id="cproIframe_u1788635_2" width="336" height="280" src="http://pos.baidu.com/acom?adn=3&at=231&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=11&ch=0&col=zh-CN&conBW=0&conOP=1&cpa=1&dai=2&dis=0&ltr=https%3A%2F%2Fwww.google.com.hk%2F&ltu=http%3A%2F%2Fwww.xuebuyuan.com%2F1348619.html&lu_161=0&lunum=6&n=83099053_cpr&pcs=1920x908&pis=10000x10000&ps=486x1186&psr=1920x1080&pss=1920x506&qn=a5e47b91d2d3883c&rad=&rsi0=336&rsi1=280&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=tabcloud_skin_3&stid=5&td_id=1788635&titFF=%E5%AE%8B%E4%BD%93&titFS=12&titTA=left&tn=text_default_336_280&tpr=1445323768092&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1788635&ti=%E7%AE%80%E5%8D%95inline%20hook%20ObReferenceObjectByHandle%E4%BF%9D%E6%8A%A4%E8%BF%9B%E7%A8%8B%E5%92%8C%E5%B1%8F%E8%94%BD%E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8C%20%7C%20%E5%AD%A6%E6%AD%A5%E5%9B%AD&tt=1445323768088.127.203.203" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; background-color: transparent;">
作 者:Sysnap
时 间:2008-05-30,19:16 链 接:http://bbs.pediy.com/showthread.php?t=65731

// ***************************************************************
//  Author:  Sysnap     
//  Link:    http://hi.baidu.com/sysnap
//  
// ***************************************************************

好久没弄hook了.最近看到还是很多人弄,而且蓝屏,就把我以前的inline hook的code改下,于是有此文,呵呵,给跟我一样的菜鸟科普用的,高手飘过
   现在一般工具的进程保护可能是hook NtOpenProcess和NtTerminateProcess...其实关于进程的话题很多,印象中Sudami同学对这方面面比较懂.下面的代码可以保护进程
   WsysCheck--->>>failed
   IceSword---->>>failed
   Gmer-->>>failed
   RUK--->>>failed
   SnipeSword---->>>failde(不包括内存清0)
   其实这只是简单的进程保护,唯一的好处就是hook导出函数ObReferenceObjectByHandle,稳定...而结束之的方法也有很多,比如内存清0..PspTerminateProcess...PspExitThread等等...其中很多很强大的办法很多anti-rootkit的工具没使用,我想可能就是为了稳定吧.的确
   另外,你可以用这个code来屏蔽某些程序的运行...其实这个code的效果就是已经运行的保护其进程,没有运行的屏蔽其运行....代码写得很草/.对系统性能也有一定影响,自己根据需要再改下吧...
   代码就是inline hook ObReferenceObjectByHandle使其跳到T_ObReferenceObjectByHandle中
   __declspec(naked)  T_ObReferenceObjectByHandle(
    IN HANDLE  Handle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_TYPE  ObjectType  OPTIONAL,
    IN KPROCESSOR_MODE  AccessMode,
    OUT PVOID  *Object,
    OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL
    )
{

_asm
{

mov     edi,edi------>>>执行被修改的前5个字节
   push    ebp
   mov     ebp,esp
   
   push   [ebp+0x1c]------>>>参数压栈
   push   [ebp+0x18]
   push   [ebp+0x14]
   push   [ebp+0x10]
   push   [ebp+0xc]
   push   [ebp+8]
  
   call   MyObReferenceObjectByHandle  -------->>>>调用我们的功能函数 
   cmp   eax,1   
   jz     end
   
   mov   eax,ObReferenceObjectByHandle -------->>>>正常运行原来的函数  
   add   eax,5           
   jmp   eax   
end:
   mov   [ebp+8],-1------>>>>如果不想让这个函数正常运行..无效句柄就可以
   mov   eax,ObReferenceObjectByHandle     
   add   eax,5           
   jmp   eax   
   
}
  对原来函数是否要让其正常运行的判断由MyObReferenceObjectByHandle完成
   
  int  MyObReferenceObjectByHandle(
    IN HANDLE  Handle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_TYPE  ObjectType  OPTIONAL,
    IN KPROCESSOR_MODE  AccessMode,
    OUT PVOID  *Object,
    OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL
    )
{
 
  PEPROCESS Process;
  KIRQL  oldIrql;
  int JmpOffSet;
  unsigned char Code[5]={0x8b,0xff,0x55,0x8b,0xec};//用来恢复现场
  unsigned char JmpCode[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 };

if(*PsProcessType==ObjectType)//判断句柄所属对象类型是不是*PsProcessType
 {

oldIrql = KeRaiseIrqlToDpcLevel();
  __asm
  {
    CLI             
    MOV   eax, CR0     
    AND eax, NOT 10000H 
    MOV   CR0, eax
  }

RtlCopyMemory ( ObReferenceObjectByHandle, Code, 5 );//恢复inline hook以便正确调用ObReferenceObjectByHandle
///  
  
  
  ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&Process,NULL);
  if (_stricmp((char*)((char*)Process+0x174), ProtectName) == 0 )//判断是不是我们要保护的进程
    {
      JmpOffSet= (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
      RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
      RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );
        
      
   __asm
   {
     MOV   eax, CR0
     OR   eax, 10000H
     MOV   CR0, eax
     STI
   }
      
   KeLowerIrql(oldIrql);
   return 1;

}
///  
  
  //否则再次HOOK这个函数
  JmpOffSet= (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
  RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
  RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );
  
  __asm
  {
    MOV   eax, CR0
    OR   eax, 10000H
    MOV   CR0, eax
    STI
  }
  
  KeLowerIrql(oldIrql);

}
 
 return 0;
}

恢复平衡0x8b,0xff,0x55,0x8b,0xec相关推荐

  1. 关于Win7 x64下过TP保护(应用层)(转)

    非常感谢大家那么支持我上一篇教程. Win10 快出了,所以我打算尽快把应用层的部分说完. 调试对象:DXF 调试工具:CE.OD.PCHunter.Windbg 调试先言:TP的应用层保护做得比较多 ...

  2. [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护

    首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了. 在他的教程里我学到了不少东西. 第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出. ...

  3. IDT系列:(二)中断处理过程,使用bochs调试IDT中的中断服务程序

    一.中断处理的过程 根据Intel 64 and IA-32 Architectures Software Developer's Manual 的介绍,在中断或异常产生是,CPU会将当前执行的指令( ...

  4. D3D游戏降帧的动态创建D3D设备以及ShellCode HOOK玩法

    欢迎转载,转载请注明出处:http://blog.csdn.net/gnorth/article/details/9327971 说白了,也就是HOOK掉Present,这种代码,其实百度上某些地方有 ...

  5. 用c++编写破解Windows密码程序

    用c++编写破解Windows密码程序(缺点只能破解当前电脑的密码) .cpp文件 #include "CrackWinPassword.h" #pragma warning(di ...

  6. C/C++ 到 shellcode 过程

    最简单的弹出cmd代码 1 #include<stdio.h>2 #include <windows.h>3 void main()4 {5 system("star ...

  7. 红黑树:自平衡的二叉查找树

    前一篇博文中写道,二叉查找树是一种具有较高性能的符号表实现,在理想情况下它可以保证查找.插入和删除操作的时间复杂度在对数级别.二叉查找树可以动态地插入和删除元素,在插入和删除操作的过程中,二叉查找树的 ...

  8. pid算法通俗解释,平衡车,倒立摆,适合不理解PID算法的人来看!

                        先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线 http://liuxinyu520zhuanshu.qzone.qq.c ...

  9. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

最新文章

  1. 何恺明等人提TensorMask框架:比肩Mask R-CNN,4D张量预测新突破
  2. 1010 [HNOI2008]玩具装箱toy
  3. Codeforces 482E ELCA (LCT)
  4. 前K个高频元素(top k)(TX)
  5. LINUX下的RAID使用
  6. directly test Gateway frontend service in AG3 SICF
  7. 去中心化存储项目Sia计划于2月初启动Sia基金会
  8. git 报错does not have a commit checked out
  9. 基于深度学习的青菜病害区域图像语义分割与定位
  10. python如何看字符串长度_Python如何查找字符串的长度?(代码示例)
  11. matlab怎么编写风雨荷载时程,风雨荷载作用下输电塔动力响应分析
  12. T检验、卡方检验、F检验
  13. java源代码审计报告_审计档案管理系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...
  14. 算是我看源码时的一个小技巧吧~
  15. 《那些年啊,那些事——一个程序员的奋斗史》——28
  16. 计算机显示在屏幕上怎么取消,电脑显示屏显示的九宫格怎样取消掉
  17. 编写iptables模块实现不连续IP地址的DNAT-POOL
  18. buu firmware
  19. 提示猜数字范围python_Python 猜数字游戏
  20. 酒链世界为何会火起来?酒链世界是什么?

热门文章

  1. 降雷皇(最长上升子序列数量)解题报告
  2. 有效解决solidworks无法获得下列许可solidworks standard。使用此许可文件不支持此版本(-21.126.0)
  3. iOS推送证书显示“此证书不受信任”
  4. 微软对联服务器关闭了吗,新浪与微软签中文对联生成器许可协议
  5. VM 16 Pro 遇到VPMC无法启动导致虚拟机无法启动求大神赐教!
  6. 香港金曲奖分析(1983-2017 by SIRMAN)
  7. OpenCV--性别年龄预测(附源码)
  8. 几种常用的接口协议的积累,欢迎补充
  9. html地图添加marker,腾讯地图添加多marker标注样式
  10. 减少无线链接切换导致数据体验变差的技术简介