国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關注微信公眾號

內核級利用通用Hook函數方法檢測進程
2007-01-04   

介紹通用Hook的一點思想:

在系統內核級中,MS的很多信息都沒公開,包括函數的參數數目,每個參數的類型等。在系統內核中,訪問了大量的寄存器,而很多寄存器的值,是上層調用者提供的。如果值改變系統就會變得不穩定。很可能出現不可想象的后果。另外有時候對需要Hook的函數的參數不了解,所以不能隨便就去改變它的堆棧,如果不小心也有可能導致藍屏。所以Hook的最佳原則是在自己的Hook函數中呼叫原函數的時候,所有的寄存器值,堆棧里面的值和Hook前的信息一樣。這樣就能保證在原函數中不會出錯。一般我們自己的Hook的函數都是寫在C文件里面的。例如Hook的目標函數KiReadyThread。

那么一般就自己實現一個:

MyKiReadyThread(...)
{
  ......
  call KiReadyThread
  ......
}

但是用C編譯器編譯出來的代碼會出現一個堆棧幀:

Push ebp
mov ebp,esp

這就和我們的初衷不改變寄存器的數違背了,所以我們可以自己用匯編來實現MyKiReadyThread。

_func@0 proc
  pushad     ;保存通用寄存器
  call _cfunc@0 ;這里是在進入原來函數前進行的一些處理。
  popad       ;恢復通用寄存器
  push eax   
  mov eax,[esp+4] ;得到系統在call 目標函數時入棧的返回地址。
  mov ds:_OrgRet,eax ;保存在一個臨時變量中
  pop eax
  mov [esp],retaddr ;把目標函數的返回地址改成自己的代碼空間的返回地址,使其返回
后能接手繼續的處理
  jmp _OrgDestFunction ;跳到原目標函數中
retaddr:
  pushad       ;原函數處理完后保存寄存器
  call _HookDestFunction@0 ;再處理
  popad     ;回復寄存器
  jmp ds:_OrgRet ;跳到系統調用目標函數的下一條指令。
_func@0 endp

當我們要攔截目標API的時候,只要修改原函數頭5個字節的機器為一個JMP_func就行了。然后把原來的5字節保存,在跳入原函數時,恢復那5個字節即可。

Hook KiReadyThread檢測系統中的進程:

在線程調度搶占的的時候會調用KiReadyThread,它的原型為VOID FASTCALL KiReadyThread (IN PRKTHREAD Thread),在進入KiReadyThread時,ecx指向Thread。所以完全可以Hook KiReadyThread 然后用ecx的值得到但前線程的進程信息。KiReadyThread沒被ntosknrl.exe導出,所以通過硬編碼來。在2000Sp4中地址為0x8043141f。

具體實現:

////////////////////////////////
// 1.cpp
////////////////////////////////
#ifdef __cplusplus
extern "C" {
#endif 

#include "ntddk.h"
#include "string.h"
#include "ntifs.h"
#include "stdio.h"

#define FILE_DEVICE_EVENT 0x8000

#define IOCTL_PASSBUF \
  CTL_CODE(FILE_DEVICE_EVENT, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

void DriverUnload (IN PDRIVER_OBJECT pDriverObject);

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);

void cfunc ();

void HookDestFunction();
NTSTATUS DeviceIoControlDispatch(IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP         pIrp);
extern void func();

void ResumeDestFunction();

const WCHAR devLink[] = L"\\??\\MyEvent";
const WCHAR devName[] = L"\\Device\\MyEvent";
UNICODE_STRING       devNameUnicd;
UNICODE_STRING       devLinkUnicd;   

ULONG OrgDestFunction = (ULONG)0x8043141f; //KiReadyThread

char JmpMyCode [] = {0xE9,0x00,0x00,0x00,0x00};
char OrgCode [5];

char OutBuf[128][16];

int Count = 0;

ULONG orgcr0;
#ifdef __cplusplus
}
#endif

VOID DisableWriteProtect( PULONG pOldAttr)
{

  ULONG uAttr;

  _asm
  {
      push eax;
      mov eax, cr0;
      mov uAttr, eax;
      and eax, 0FFFEFFFFh; // CR0 16 BIT = 0
      mov cr0, eax;
      pop eax;
  };

  *pOldAttr = uAttr; //保存原有的 CRO 屬性

}

VOID EnableWriteProtect( ULONG uOldAttr )
{

_asm
{
    push eax;
    mov eax, uOldAttr; //恢復原有 CR0 屬性
    mov cr0, eax;
    pop eax;
};

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
  NTSTATUS           Status;
  PDEVICE_OBJECT         pDevice;

  DbgPrint("DriverEntry called!\n");
  RtlInitUnicodeString (&devNameUnicd, devName );
  RtlInitUnicodeString (&devLinkUnicd, devLink );
  Status = IoCreateDevice ( pDriverObject,
  0,
      &devNameUnicd,
  FILE_DEVICE_UNKNOWN,
    0,
    TRUE,
    &pDevice );
    if( !NT_SUCCESS(Status)) 
    {
    DbgPrint(("Can not create device.\n"));
    return Status;
  }
    Status = IoCreateSymbolicLink (&devLinkUnicd, &devNameUnicd);
    if( !NT_SUCCESS(Status)) 
    {
      DbgPrint(("Cannot create link.\n"));
      return Status;
    }
    pDriverObject->DriverUnload = DriverUnload; 
    pDriverObject->MajorFunction[IRP_MJ_CREATE] = 
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] =
  pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =   DeviceIoControlDispatch;
    
  pDriverObject->DriverUnload = DriverUnload;
  * ( (ULONG*) (JmpMyCode+1) ) = (ULONG)func - (ULONG)OrgDestFunction - 5;
  memcpy(OrgCode,(char*)OrgDestFunction,5);
  HookDestFunction();
  
  return STATUS_SUCCESS;
}

void DriverUnload (IN PDRIVER_OBJECT pDriverObject)
{
  NTSTATUS         status;
  ResumeDestFunction();
  if(pDriverObject->DeviceObject != NULL)
    {
      status=IoDeleteSymbolicLink( &devLinkUnicd );
    if ( !NT_SUCCESS( status ) )
        {
            DbgPrint(( "IoDeleteSymbolicLink() failed\n" ));
        }
        IoDeleteDevice( pDriverObject->DeviceObject );
    }
}

void DisplayName(PKTHREAD Thread)
{
  PKPROCESS Process = Thread->ApcState.Process;
  PEPROCESS pEprocess = (PEPROCESS)Process;
  DbgPrint("ImageFileName = %s \n",pEprocess->ImageFileName);
  sprintf(OutBuf[Count++],"%s",pEprocess->ImageFileName);
}

void cfunc (void)
{
  ULONG PKHeader=0;
  __asm
  {
    mov PKHeader,ecx //ecx寄存器是KiReadyThread中的PRKTHREAD參數
  }
  ResumeDestFunction();
  
  if ( PKHeader != 0 && Count < 128 )
  {
    DisplayName((PKTHREAD)PKHeader);   
  }   
}

void HookDestFunction()
{
  DisableWriteProtect(&orgcr0);
  memcpy((char*)OrgDestFunction,JmpMyCode,5);
  EnableWriteProtect(orgcr0);   
}

void ResumeDestFunction()
{
  DisableWriteProtect(&orgcr0);
  memcpy((char*)OrgDestFunction,OrgCode,5);
  EnableWriteProtect(orgcr0);
}

NTSTATUS DeviceIoControlDispatch(
                      IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP         pIrp
                      )
{
  PIO_STACK_LOCATION         irpStack;
  NTSTATUS                 status;
  PVOID                   inputBuffer;
  ULONG                   inputLength;
  PVOID                   outputBuffer;
  ULONG                   outputLength;
  OBJECT_HANDLE_INFORMATION     objHandleInfo;

  status = STATUS_SUCCESS;
  // 取出IOCTL請求代碼
  irpStack = IoGetCurrentIrpStackLocation(pIrp);

  switch (irpStack->MajorFunction)
  {
  case IRP_MJ_CREATE :
    DbgPrint("Call IRP_MJ_CREATE\n");
    break;
  case IRP_MJ_CLOSE:
    DbgPrint("Call IRP_MJ_CLOSE\n");
    break;
  case IRP_MJ_DEVICE_CONTROL:
    DbgPrint("IRP_MJ_DEVICE_CONTROL\n");
    inputLength=irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputLength=irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    switch (irpStack->Parameters.DeviceIoControl.IoControlCode) 
    {
        case   IOCTL_PASSBUF:
        {
          RtlCopyMemory(pIrp->UserBuffer, OutBuf, 20*16);
          
          memset(OutBuf,0,128*16);
          Count = 0;
          break;
        }
        default:
          break;
    }

  default:
    DbgPrint("Call IRP_MJ_UNKNOWN\n");
    break;
  }
  pIrp->IoStatus.Status = status; 
  pIrp->IoStatus.Information = 0; 
  IoCompleteRequest (pIrp, IO_NO_INCREMENT);
  return status;
}

////////////////////////////////
// 1.asm
////////////////////////////////
.386
.model small

.data
_OrgRet dd 0

.code
public _func@0
extrn _cfunc@0:near
extrn _HookDestFunction@0:near
extrn _OrgDestFunction:DWORD

_func@0 proc
  pushad
  call _cfunc@0
  popad
  push eax
  mov eax,[esp+4]
  mov ds:_OrgRet,eax
  pop eax
  mov [esp],retaddr
  jmp _OrgDestFunction
retaddr:
  pushad
  call _HookDestFunction@0
  popad
  jmp ds:_OrgRet
_func@0 endp
END

//////////////////////////////////////////
// app.cpp
//////////////////////////////////////////

#include 
#include 

#define FILE_DEVICE_EVENT 0x8000
#define CTL_CODE( DeviceType, Function, Method, Access ) (           \
  ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

#define FILE_ANY_ACCESS           0
#define METHOD_BUFFERED           0
#define FILE_DEVICE_UNKNOWN         0x00000022

#define IOCTL_PASSBUF \
  CTL_CODE(FILE_DEVICE_EVENT, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

int main()
{
    HANDLE     hDevice;   
    bool     status; 
    ULONG     dwReturn;
    char     outbuf[129][16];
    hDevice = NULL;
    m_hCommEvent = NULL;
    hDevice = CreateFile( "\\\\.\\MyEvent",
            GENERIC_READ|GENERIC_WRITE,
            FILE_SHARE_READ | FILE_SHARE_WRITE, 
            NULL,
            OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL, 
            NULL);
    if(hDevice == INVALID_HANDLE_VALUE)
    {
      printf("createfile wrong\n");
      getchar();
      return 0;
    }
  while(1)
  {
    memset(outbuf,0,129*16);
    status =DeviceIoControl(hDevice,
            IOCTL_PASSBUF,
            NULL,
            0,
            &outbuf,
            128*16,
            &dwReturn,NULL);
    if( !status)
    {
        printf("IO wrong+%d\n", GetLastError());
        getchar();
        return 0;
    }
    int c=0;
    while( *((char*)(&outbuf)+c*16) )
    {
        //把csrss.exe和自身進程信息跳過,因為會產生有大量的信息。
        if ( strcmp((char*)(&outbuf)+c*16,"app.exe") && \
          strcmp((char*)(&outbuf)+c*16,"csrss.exe") )
          printf("%s\n",(char*)(&outbuf)+c*16);
        c++;
    }
    Sleep(1);
  }
}

試驗結果:

......
TTPlayer.exe
System
TTPlayer.exe
vrvmon.exe
TTPlayer.exe
System
System
Explorer.EXE
Explorer.EXE
Explorer.EXE
......

測試、編譯環境Windows2000 Sp4、Windows2000 DDK。沒寫出線程的隱藏進程代碼,不過基本上實現得差不多了,只需要把返回的信息,和Ring3級查詢得到的信息進行適時對比就能查出異常進程了。

責任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001


熱詞搜索:

上一篇:木馬知識基礎之讓程序作為服務來運行
下一篇:黑客基礎知識系列之認清木馬的原理

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
卡一卡二国产精品| 亚洲午夜激情av| 成人一道本在线| 亚洲欧洲av一区二区三区久久| 成人免费观看av| 亚洲精品免费在线播放| 欧美在线观看视频在线| 秋霞成人午夜伦在线观看| 精品对白一区国产伦| 国产成人免费网站| 一个色妞综合视频在线观看| 欧美人与z0zoxxxx视频| 国内久久婷婷综合| |精品福利一区二区三区| 欧美日韩日日夜夜| 日韩美一区二区三区| 久久久国产精品麻豆| 91网址在线看| 日本三级韩国三级欧美三级| 久久久av毛片精品| 91免费在线视频观看| 日韩av在线播放中文字幕| 久久色.com| 91福利国产精品| 美女被吸乳得到大胸91| 中文字幕一区二| 7777精品伊人久久久大香线蕉最新版| 久久99精品国产麻豆婷婷| 亚洲国产精品99久久久久久久久| 精品视频1区2区| 高清不卡一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲免费高清视频在线| 26uuu国产电影一区二区| 在线精品观看国产| 大尺度一区二区| 奇米一区二区三区| 亚洲一区二区三区在线看| 国产日韩欧美电影| 欧美精品在线一区二区三区| 韩国av一区二区三区在线观看| 亚洲一区二区三区自拍| 欧美国产禁国产网站cc| 日韩亚洲国产中文字幕欧美| 91久久精品国产91性色tv| 国产91精品在线观看| 免费的国产精品| 亚洲一区二区高清| 自拍偷拍亚洲综合| 久久精品一区蜜桃臀影院| 91精品国产高清一区二区三区蜜臀| 91在线视频免费观看| 国内外精品视频| 老司机精品视频线观看86| 亚洲成人动漫在线免费观看| 亚洲老妇xxxxxx| 亚洲欧洲性图库| 国产欧美综合色| 久久久久久久久久看片| 日韩欧美在线123| 欧美一区二区三区电影| 欧美日韩免费不卡视频一区二区三区| 国产91精品入口| 国产91精品在线观看| 国产激情精品久久久第一区二区 | 国产欧美一区二区精品久导航| 欧美日韩国产成人在线免费| 色吊一区二区三区| 91社区在线播放| 色综合天天做天天爱| 99在线热播精品免费| av在线综合网| 91论坛在线播放| 在线观看中文字幕不卡| 在线看一区二区| 欧美吻胸吃奶大尺度电影| 在线免费观看一区| 欧美三区免费完整视频在线观看| 欧美中文字幕亚洲一区二区va在线 | 亚洲精品成a人| 亚洲蜜桃精久久久久久久| 国产精品欧美一区喷水| 中文字幕第一区二区| ...av二区三区久久精品| 一区二区在线看| 午夜精品福利一区二区三区av| 亚洲mv在线观看| 美女在线观看视频一区二区| 蜜桃av一区二区三区电影| 激情五月婷婷综合网| 国产98色在线|日韩| 91丨porny丨国产| 在线看不卡av| 在线播放视频一区| 久久亚洲捆绑美女| 国产精品久久久久久久久免费丝袜| 国产精品麻豆一区二区| 亚洲另类春色校园小说| 天天操天天干天天综合网| 久久精品99国产国产精| 懂色av一区二区三区免费观看| 99精品视频一区二区三区| 欧美日韩另类一区| 久久亚区不卡日本| 1000精品久久久久久久久| 亚洲一卡二卡三卡四卡无卡久久 | 91免费观看国产| 欧美日本一区二区三区四区 | 日韩免费观看2025年上映的电影 | 亚洲一区自拍偷拍| 日韩国产欧美在线观看| 国产高清亚洲一区| 在线观看亚洲a| 欧美videossexotv100| 成人欧美一区二区三区视频网页 | 丝袜美腿亚洲综合| 国产精品1区2区3区在线观看| www.av亚洲| 日韩视频免费直播| 亚洲天堂免费看| 另类欧美日韩国产在线| 日本国产一区二区| 日韩精品一区二区三区在线| 自拍偷自拍亚洲精品播放| 免费国产亚洲视频| 色视频一区二区| 久久久国产一区二区三区四区小说| 亚洲自拍与偷拍| 国产盗摄视频一区二区三区| 欧美久久一二三四区| 中文久久乱码一区二区| 老司机精品视频一区二区三区| 一本久久精品一区二区| 久久综合九色综合欧美就去吻| 一区二区久久久久久| 国产不卡视频一区二区三区| 日韩限制级电影在线观看| 亚洲一区免费在线观看| 成人黄色国产精品网站大全在线免费观看| 欧美日韩不卡一区| 一区二区三区欧美久久| 成人免费高清在线| 精品国产制服丝袜高跟| 三级久久三级久久久| 色8久久人人97超碰香蕉987| 欧美韩国一区二区| 老司机免费视频一区二区| 宅男在线国产精品| 亚洲va天堂va国产va久| 色婷婷av一区| 一区二区三区四区激情| 99re成人在线| 国产精品久久久久婷婷二区次| 久久99精品久久久久| 日韩精品一区二区在线观看| 奇米精品一区二区三区在线观看一| 欧美午夜寂寞影院| 夜夜揉揉日日人人青青一国产精品| 不卡一区二区在线| 中文字幕成人在线观看| 成人av在线资源| 国产精品丝袜一区| 成人黄动漫网站免费app| 欧美国产一区二区| 国产成人精品免费| 国产精品嫩草影院av蜜臀| 国产91丝袜在线播放九色| 中文字幕欧美日本乱码一线二线 | 91丝袜呻吟高潮美腿白嫩在线观看| 国产欧美精品一区二区色综合| 国产精品一区一区三区| 国产性天天综合网| 99精品国产热久久91蜜凸| 国产精品久久久久婷婷二区次| 99久久免费精品| 玉米视频成人免费看| 欧美在线短视频| 免费成人在线观看视频| www久久精品| 国产精品一卡二卡| 中文字幕在线观看不卡| 91麻豆123| 免费看欧美女人艹b| 精品久久久久久无| 9色porny自拍视频一区二区| 亚洲黄色性网站| 欧美一级日韩一级| 国产乱国产乱300精品| 亚洲欧洲av在线| 666欧美在线视频| 韩国一区二区三区| 中文字幕一区二区三区不卡| 欧美艳星brazzers| 蜜桃一区二区三区在线观看| 欧美高清在线一区二区| 欧洲精品在线观看| 精品一区二区三区av| 国产精品乱人伦中文| 欧美日本国产视频| 国产91在线观看|