1. 程式人生 > >簡單inline hook ObReferenceObjectByHandle保護程序和遮蔽檔案執行

簡單inline hook ObReferenceObjectByHandle保護程序和遮蔽檔案執行

// ***************************************************************
//  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;
}
上傳的附件
檔案型別: rarsysnap.rar (2008-05-30 19:16, 2.9 KB, 98 次下載)
VOID fake_ObReferenceObjectByHandle (     IN HANDLE Handle,     IN ACCESS_MASK DesiredAccess,     IN POBJECT_TYPE ObjectType,     IN KPROCESSOR_MODE AccessMode,     OUT PVOID *Object,     OUT POBJECT_HANDLE_INFORMATION HandleInformation     ) {   NTSTATUS  status;   WCHAR    Name[300];   BOOL      bFuck = FALSE;   PEPROCESS Process = NULL;   PUCHAR    currentProcessName = NULL;   HANDLE    ProcessID = NULL; // the owner process   status = OldObReferenceObjectByHandle( Handle, DesiredAccess, ObjectType, AccessMode, Object, HandleInformation);   _asm pushad   _asm pushfd               //               //  過濾操作               //
   end:   _asm popfd   _asm popad skip:   _asm nop }

相關推薦

簡單inline hook ObReferenceObjectByHandle保護程序遮蔽檔案執行

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

Inline Hook應用篇】限制開啟檔案選擇對話方塊

我們要實現限制程式不允許傳送檔案,可以通過限制“檔案選擇對話方塊”實現。對於檔案選擇對話方塊的限制,基礎點的就是Hook:GetOpenFileName、SHBrowseForFolder,對這兩個API的Hook,可以限制市面上80%的檔案傳送,但對於QQ之類的在XP系統以上就

簡單使用tornado伺服器,建立hello world頁面及tornado簡單頁面,並配置templatestatic檔案路徑,url分發

首先安裝tornado:我用的最新版5.1.1 cmd 輸入命令 pip install tornado 建立hello world頁面及tornado簡單頁面,並配置template和static檔案路徑,url分發: 這裡要注意:py檔名不能用tornado,import時會報錯!

簡單的ssm框架的搭建配置檔案

ssm框架裡邊的配置: 1.src路徑下直接存放資料庫和log4j的properties檔案 2.src路徑下建個config包,分別放置ssm的xml檔案 3.修改WEB-INF路徑下的web.xml 4.注意放置配置檔案的路徑問題 1.src路徑下的jd

Linux核心工程導論——程序:ELF檔案執行原理(2)

ELF強符號與弱符號(本小節是轉別人的)我們經常在程式設計中碰到一種情況叫符號重複定義。多個目標檔案中含有相同名字全域性符號的定義,那麼這些目標檔案連結的時候將會出現符號重複定義的錯誤。比如我們在目標檔案A和目標檔案B都定義了一個全域性整形變數global,並將它們都初始化,

QT創建模態對話框阻塞整個應用程序非模態對話框唯一性約束的簡單示例

t對象 geometry ges con png qwidget int imu 唯一性約束 QT創建模態對話框阻塞整個應用程序和非模態對話框唯一性約束的簡單示例 部分代碼: // 創建模態對話框阻塞整個應用程序和非模態對話框唯一性約束 QMenu *pD

inline Hook簡單介紹

What is Inline Hook ? 就是一個函式鉤子而已,把程式原本要呼叫的函式改成另一個函式,就是對原函式的一個掛鉤(hook) 。 How did this work ? 讓我們看看呼叫一個函式控制流的跳轉圖: fun_b 呼叫 fun_a

程序執行簡單tcp聊天程式

如果需要一個服務端可以連線多個客戶端,並同時與多個(不超多listen第二個引數及最大同時併發數)客戶端通訊,可以利用多程序即建立子程序,子程序來完成服務端的接受和傳送資料;也可以建立多個執行緒。對於tcp一些介面具體使用可以檢視這篇部落格:https://bl

開發除錯linux服務時幾個好用的程序埠查詢命令組合簡單指令碼(ps netstat awk grep)

這幾天在搭建flume服務並在其框架下開發,反覆除錯輸入命令讓人不厭其煩,因此在這裡記錄一下自己找到的一些小技巧: 首先,把自己的應用程式做成一個service是一個很好的選擇,一個service就需要支援start 和 stop,start能啟動程式,stop能找到sta

一個基於xposedinline hook的一代殼脫殼工具

注:1.手機要api  21版本以上xposed要支援art模式才可以,手機脫殼時要在art模式下2.E/Xposed(28813):  java.lang.UnsatisfiedLinkError:  dlopen  failed:  couldn't  map ;/dat

Android.mk添加本地程序庫的經常使用模版

size 例如 center 配置文件 clear hello main 解釋 共享 Android.mk添加本地程序和庫的經常使用模版 Android中添加本地程序或者庫。這些程序和庫與其所在路徑沒有關系。僅僅與它們的配置文件Android.mk有關。Androi

【Java】Swing+IO流實現一個簡單的文件加密程序

als oncommand override fault 源文件 abs directory imp select EncrytService package com.my.service; import java.io.File; import java

【Java】Swing+IO流實現一個簡單的文件加密程序(較完整版)

move 初始 baidu images 文件選擇器 while login 一個 ktr 留著參考 beans package com.my.bean; import java.io.Serializable; public class

MySQL 實現調用外部程序系統命令

基本 variables clu sch linu popu logserver git arm MySQL 實現調用外部程序和系統命令Refer:http://www.cnblogs.com/yunsicai/p/4080864.html1) Download lib

【linux基礎】rpm安裝程序管理

rpm使用1.了解應用程序應用程序(app):安裝在os上完成特定功能的軟件。應用程序的類型:*.rpm(redhat分支默認軟件格式),*.deb(debian分支默認軟件格式),源代碼(通用的軟件格式,也是生成rpm和deb的基礎),其他自帶安裝程序及免安裝的軟件。用戶程序常用的目錄:/etc,/var/

智能門鎖測試程序PCB板線路通斷檢測程序經驗總結

自己的 掌握 while 測試程序 gpio 情況 電子工程師 下一步 檢測 這次去WZ出差,還是很累的,之前一年多沒有搞嵌入式了,更重要的是之前沒有接觸太深刻GPIO的用法等等原因,導致很心累。 必須掌握的技能: (1)SPI和IIC總線,模擬和專用外設兩種方式,他們的重

微信小程序-----安裝,編寫第一個小程序運行到手機端

alt ima 下載 weixin nload 公眾平臺 軟件 分享 微信公眾平臺 第一步: 微信公眾平臺註冊賬號,並選擇小程序,網址:mp.weixin.qq.com 填寫相關信息,如:主體類型(個人或者企業)    AppID 在開發中都是用的到的,

指定的 DSN 中,驅動程序應用程序之間的體系結構不匹配

bsp 密碼 import wow win 技術分享 img syswow64 導入   在做通過 PL/SQL 導入Excel 數據的時候,在進行數據庫連接的時候,選擇DSN為Excel ,輸入用戶名和密碼,進行Connect 出現錯誤“指定的 DSN 中,驅動程序和應用

自動生成簡單四則運算的C語言程序

程序 輸入 oid break 運行 scan 由於 小學 and   該程序是在博客園裏面找的,具體是誰的找了半天沒找到,無法提供它原本的鏈接。由於自己寫的過於簡單,且有一些功能暫時無法實現,所以就找了一個來應付作業,望原諒。在這個程序的源碼中我改了一個錯誤的地方,源碼中

win 64 ring0 inline hook

防止 還要 全局 技術 png ret 寄存器 保存 ces 以下內容參考黑客防線2012合訂本316頁 1.首先要註意的問題 inline hook 不能截斷指令. 也就是說修改目標函數的指令實現跳轉到自己的函數裏面時, 不能截斷掉目標函數的指令. 因為在自己的函數裏