首页
社区
课程
招聘
[旧帖] 简单的inlone Hook蓝屏,求解决. 0.00雪花
发表于: 2012-3-18 22:16 4214

[旧帖] 简单的inlone Hook蓝屏,求解决. 0.00雪花

2012-3-18 22:16
4214
#include <ntddk.h>
#include <WinDef.h>

ULONG CroValue;

BYTE OriginalByte2[5]={0};
BYTE JmpAddr2[5]={0xE9,0,0,0,0};

extern POBJECT_TYPE *PsProcessType;

NTKERNELAPI NTSTATUS ZwSetInformationFile(
        IN HANDLE  FileHandle,
        OUT PIO_STATUS_BLOCK  IoStatusBlock,
        IN PVOID  FileInformation,
        IN ULONG  Length,
        IN FILE_INFORMATION_CLASS  FileInformationClass
        );

NTSTATUS NewMyZwSetInformationFile(
                                                                   IN HANDLE  FileHandle,
                                                                   OUT PIO_STATUS_BLOCK  IoStatusBlock,
                                                                   IN PVOID  FileInformation,
                                                                   IN ULONG  Length,
                                                                   IN FILE_INFORMATION_CLASS  FileInformationClass
                                                                   );

//打开页面包含
VOID  EnablePageProtect()
{
        _asm
        {
                __asm
                {
                        push eax
                                mov eax,CroValue
                                mov cr0,eax
                                pop eax
                }
        }
}

//关闭页面包含
VOID  DisablePageProtect()
{
        __asm
        {
                push eax
                        mov eax,cr0
                        mov CroValue,eax
                        and eax,0fffeffffh
                        mov cr0,eax
                        pop eax
        }

}

_declspec(naked) NTSTATUS OriginalZwSetInformationFile(
        IN HANDLE  FileHandle,
        OUT PIO_STATUS_BLOCK  IoStatusBlock,
        IN PVOID  FileInformation,
        IN ULONG  Length,
        IN FILE_INFORMATION_CLASS  FileInformationClass)
{

        __asm
        {  
                mov edi,edi
                push ebp
                mov ebp,esp
                mov eax,ZwSetInformationFile
                add eax,5
                jmp eax

        }
}

NTSTATUS NewMyZwSetInformationFile(
                                                                   IN HANDLE  FileHandle,
                                                                   OUT PIO_STATUS_BLOCK  IoStatusBlock,
                                                                   IN PVOID  FileInformation,
                                                                   IN ULONG  Length,
                                                                   IN FILE_INFORMATION_CLASS  FileInformationClass
                                                                   )
{

        NTSTATUS status;
        status=OriginalZwSetInformationFile(FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);

        if (status==STATUS_SUCCESS)
        {
                DbgPrint("ZwSetInformationFile进来了");
        }

        return status;
}

VOID InlineHookWith()
{
        KIRQL Kirql;

        RtlCopyMemory(OriginalByte2,(BYTE *)ZwSetInformationFile,5);

        *(ULONG *)(JmpAddr2+1)=(ULONG)NewMyZwSetInformationFile-((ULONG)ZwSetInformationFile+5);

        DisablePageProtect();

        Kirql=KeRaiseIrqlToDpcLevel();

        RtlCopyMemory((BYTE *)ZwSetInformationFile,JmpAddr2,5);
        KeLowerIrql(Kirql);

        EnablePageProtect();

}

VOID UnInlineHook()
{
        KIRQL Kirql;

        DisablePageProtect();
        Kirql=KeRaiseIrqlToDpcLevel();

        RtlCopyMemory((BYTE *)ZwSetInformationFile,OriginalByte2,5);

        KeLowerIrql(Kirql);
        EnablePageProtect();

}

VOID OnUnload( IN PDRIVER_OBJECT pDriverObject )
{

        UnInlineHook();

        DbgPrint("My Driver Unloaded!");

}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath )
{
        DbgPrint("My Driver Loaded!");
        pDriverObject->DriverUnload = OnUnload;
        InlineHookWith();

        return STATUS_SUCCESS;
}

windbg 调试代码走到
status=OriginalZwSetInformationFile(FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);
就蓝屏了

不知道是哪里错了,这段代码是根据别人的代码改的,求大牛帮忙解决一下...

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
标记一下,有时间帮你看看`~
2012-3-18 22:22
0
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
windbg看准点

Zw函数没有push ebp mov ebp,esp
再说 你替换人家的 mov eax ,ServiceId
也不执行
2012-3-18 22:25
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呵呵 好多变量都没有赋值,肯定蓝得很爽的
如:,CroValue 应该 == 0x10000,不过可能你那种写法也行

还有:
0: kd> u ZwSetInformationFile
nt!ZwSetInformationFile:
80501ebc b8e0000000      mov     eax,0E0h
80501ec1 8d542404        lea     edx,[esp+4]
80501ec5 9c              pushfd
80501ec6 6a08            push    8
80501ec8 e8e4050400      call    nt!KiSystemService (805424b1)
80501ecd c21400          ret     14h
nt!ZwSetInformationJobObject:
80501ed0 b8e1000000      mov     eax,0E1h
80501ed5 8d542404        lea     edx,[esp+4]

-------------------------------------------------
目的函数头部确实跟你的有点不一样
2012-3-18 22:45
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
乱七八糟撒...
hook 的Zw函数却用Nt函数接管,hook的前5字节,NtSetInformationFile前5字节不是  mov edi,edi    push ebp    mov ebp,esp,UNHOOK的时候其实又再次hook的,而且函数Zw函数
2012-3-18 23:25
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
先弄个硬编码的试试吧
2012-3-19 08:20
0
雪    币: 106
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还在解决中,不过还是要谢谢大家...
2012-3-19 09:11
0
雪    币: 284
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好多变量都没有赋值,肯定蓝得很爽的
2012-3-27 17:02
0
游客
登录 | 注册 方可回帖
返回
//