首页
社区
课程
招聘
[求助]关于Inline hook的问题
发表于: 2010-1-22 12:27 6038

[求助]关于Inline hook的问题

2010-1-22 12:27
6038
#include <ntddk.h>

typedef NTSTATUS (*ZwTerminateProcess)(
                            IN HANDLE  ProcessHandle,
                            IN NTSTATUS  ExitStatus);
ULONG GetFunctionAddr(IN PCWSTR FunctionName);

ZwTerminateProcess OldAddress;

VOID
  DriverUnload(
    IN PDRIVER_OBJECT  DriverObject
    )
{
        DbgPrint("驱动已经被卸载了\n");
}

ULONG GetFunctionAddr(IN PCWSTR FunctionName)
{
        UNICODE_STRING HookFunctionName;
        RtlInitUnicodeString(&HookFunctionName,FunctionName);
        return (ULONG)MmGetSystemRoutineAddress(&HookFunctionName);
}

NTSTATUS
  MyZwTerminateProcess(
    IN HANDLE  ProcessHandle,
    IN NTSTATUS  ExitStatus
    )
{
        NTSTATUS status;

        //先保存所有寄存器的原来状态,到时好恢复现场环境,跟加壳软件开始的指令也是一样
        _asm
        {
                pushad
                pushfd
        }
        DbgPrint("Hook Success\n");

         //先恢复现场环境,跳转回原地址
        _asm
        {
                popad
                popfd
                mov ecx,ProcessHandle
                mov edx,ExitStatus
                call OldAddress;
                mov status,eax
        }

        return status;
}

VOID InlineHook()
{
        KIRQL oldIrql;
        ULONG Address;

        Address = GetFunctionAddr(L"ZwTerminateProcess");
        _asm
        {
                mov eax,Address
                mov esi,[eax+2]
                mov eax,[esi]
                mov OldAddress,eax
        }

        //提升中断层次
          oldIrql=KeRaiseIrqlToDpcLevel();

        __asm
          {
                   cli
                   mov eax,cr0
                   and eax,not 10000h
                   mov cr0,eax
          }

        //进行地址替换  
        _asm
        {
                mov eax,Address
                mov esi,[eax+2]
                mov dword ptr [esi],offset MyZwTerminateProcess
        }

         _asm
          {
                  mov eax,cr0
                  or eax,10000h
                  mov cr0,eax
                  sti
          }

        //恢复中断层次
        KeLowerIrql(oldIrql);
        return ;
       
}

NTSTATUS
  DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING  RegistryPath
    )
{
        DbgPrint("驱动已经加载了\n");
        DbgPrint("Hello World\n");
        InlineHook();
        DriverObject->DriverUnload = DriverUnload;
        return STATUS_SUCCESS;
}

--------------------------------------------------------------------
以上代码是我想inline hook ZwTerminateProcess函数,但是我点击开启驱动马上就蓝屏了。
请各位大侠们看看代码哪个地方有问题?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
大概瞄了几眼,蓝屏的地方太多了。。

windbg + VM来调式吧,你会很清楚的知道蓝屏在哪句代码上,一出问题就马上提问,水平提高不了多少的。。。
2010-1-22 16:07
0
雪    币: 2512
活跃值: (672)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
就是因为我这边不能搭建调试的环境,所以才给大侠们看的。
2010-1-22 16:52
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
自己去网上找个hook引擎来替换下面这个吧,硬盘不小心被我格了。。。

#include <ntddk.h>
#include "InlineHook.h"

typedef NTSTATUS (*ZWTERMINATEPROCESS)(
                                                                           IN HANDLE  ProcessHandle,
                                                                           IN NTSTATUS  ExitStatus);
ZWTERMINATEPROCESS OldZwTerminateProcess;

int ZwTerminateProcessPatchCodeLen = 0;

#pragma LOCKEDCODE
PVOID ZwTerminateProcessRet;

int iProcess = FALSE;

#pragma LOCKEDCODE
__declspec(naked) NTSTATUS ZwTerminateProcessHookZone(,...)
{
        _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;
                _emit 0x90;
                _emit 0x90;
                jmp [ZwTerminateProcessRet];
        }
}

NTSTATUS DriverUnload(
                                          IN PDRIVER_OBJECT  DriverObject
                                          )
{
        if (iProcess == TRUE)
        {
                UnHookApi(L"ZwTerminateProcess",FALSE,0,(PVOID)ZwTerminateProcessHookZone,ZwTerminateProcessPatchCodeLen);
        }
        DbgPrint("驱动已经被卸载了\n");
        return STATUS_SUCCESS;
}
NTSTATUS
NewZwTerminateProcess(
                                          IN HANDLE  ProcessHandle,
                                          IN NTSTATUS  ExitStatus
                                          )
{
        NTSTATUS status;

        DbgPrint("Hook Success\n");

        OldZwTerminateProcess = (ZWTERMINATEPROCESS)ZwTerminateProcessHookZone;

        status = OldZwTerminateProcess(ProcessHandle,ExitStatus);
        if( NT_SUCCESS(status))
        {
                return status;
        }
        return status;
}
NTSTATUS
DriverEntry(
                        IN PDRIVER_OBJECT  DriverObject,
                        IN PUNICODE_STRING  RegistryPath
                        )
{
        int bRet;
        DbgPrint("驱动已经加载了\n");
        DbgPrint("Hello World\n");
        DriverObject->DriverUnload = DriverUnload;
        bRet = HookApi((DWORD)NewZwTerminateProcess,L"ZwTerminateProcess",FALSE,0,(PVOID)ZwTerminateProcessHookZone,&ZwTerminateProcessPatchCodeLen,&ZwTerminateProcessRet);
        if(!bRet)
        {
                DbgPrint("hook ZwTerminateProcess failed\n");

        }else{

                iProcess = TRUE;
        }
        return STATUS_SUCCESS;
}
2010-1-22 19:12
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
请参考 详谈内核三步走inline实现
2010-1-22 20:40
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
http://bbs.pediy.com/showthread.php?t=98493&highlight=
2010-1-22 20:41
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
vmware经常靠不住,我前天HOOK WRITE_PORT_UCHAR就失败了,一改写hal.exe的内存就死机。也不蓝屏,调试器里也没什么提示。换真机调试就正常。所以还是双物理机调试稳当点
2010-1-22 22:16
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
hello,chen老师 会看新的机会么?
2019-8-9 14:54
0
游客
登录 | 注册 方可回帖
返回
//