吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8915|回复: 7
收起左侧

[其他转载] Inline Hook NtOpenFile 简单实现保护指定路径文件

[复制链接]
zzage 发表于 2009-8-31 01:26
NtOpenFile.JPG

;Inline Hook NtOpenFile 简单实现保护指定路径文件
;Code:zzage[LCG][DST]
;Bolg:http://hi.baidu.com/zzage
.386
.model flat,stdcall
option casemap:none

include \masm32\include\w2k\ntstatus.inc
include \masm32\include\w2k\ntddk.inc
include \masm32\include\w2k\hal.inc
include \masm32\include\w2k\ntoskrnl.inc
includelib \masm32\lib\w2k\ntoskrnl.lib
includelib \masm32\lib\w2k\hal.lib
include \masm32\Macros\Strings.mac

.data
OldNtOpenFile proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
NtOpenFile_Addr dd ?
oldIrql dd ?
szName UNICODE_STRING <?>
uCmdPathName dw '\','?','?','\','C',':','\','W','I','N','D','O','W','S','\','S','Y','S','T','E','M','3','2','\','c','m','d','.','e','x','e',0

.code


DriverUnload proc pDriverObject:PDRIVER_OBJECT
        pushad
        
        cli
        mov eax, cr0
        and eax,0fffeffffh
        mov cr0, eax
        
        invoke KeRaiseIrqlToDpcLevel
        mov oldIrql,eax
        
        mov ecx,5
        mov edi,NtOpenFile_Addr
        mov esi,offset OldNtOpenFile
        rep movsb
        
        invoke KeLowerIrql,oldIrql
        
        mov eax, cr0
        or eax,10000h
        mov cr0, eax
        sti
        
        popad

        ret
DriverUnload endp


OldNtOpenFile proc FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,ShareAccess,OpenOptions

        nop
        nop
        mov eax,NtOpenFile_Addr
        add eax,5
        jmp eax

OldNtOpenFile endp



MyNtOpenFile proc FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,ShareAccess,OpenOptions
         
        mov eax,ObjectAttributes
        assume eax:ptr OBJECT_ATTRIBUTES
        
        invoke RtlCompareUnicodeString ,[eax].ObjectName,offset szName,TRUE
            
        .if eax == 0
                mov        eax,STATUS_ACCESS_DENIED
                ret
        .endif
        
        assume eax:nothing
        
        invoke OldNtOpenFile,FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,ShareAccess,OpenOptions
        ret

MyNtOpenFile endp

DriverEntry proc pDriverObject:PDRIVER_OBJECT,pRegistryPath:PUNICODE_STRING

        pushad
        invoke RtlInitUnicodeString,offset szName,offset uCmdPathName

        cli
        mov eax, cr0
        and eax,0fffeffffh
        mov cr0, eax
        
        invoke KeRaiseIrqlToDpcLevel
        mov oldIrql,eax
        
        invoke MmGetSystemRoutineAddress,$CCOUNTED_UNICODE_STRING("NtOpenFile")

        mov NtOpenFile_Addr,eax
        mov ecx,5
        mov esi,eax
        mov edi,offset OldNtOpenFile
        rep movsb
        mov edx,offset MyNtOpenFile
        sub edx,eax
        sub edx,5
        mov byte ptr [eax],0e9h
        xchg [eax+1],edx
        
        invoke KeLowerIrql,oldIrql
        
        mov eax, cr0
        or eax,10000h
        mov cr0, eax
        sti
        
        mov eax,pDriverObject
        assume eax:ptr DRIVER_OBJECT
        mov [eax].DriverUnload,offset DriverUnload
        assume eax:nothing


        popad
        mov eax,STATUS_SUCCESS
        ret

DriverEntry endp

end DriverEntry

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

惜双双 发表于 2009-8-31 03:07
本帖最后由 惜双双 于 2009-8-31 03:08 编辑

呵呵。。鉴定完毕。。

楼主汇编高手。。。

不过。。

我觉得有个地方需要注意一下。。

第一。。CR0欺骗不安全。。建议用MDL。(不要嫌繁琐。封装成函数后用起来可舒服了。比CR0都快)。

第二。就算真的想用CR0欺骗。也应该换个写法。。。

下面是我自己封装的一个函数。你看下。

注意:不是说你的写法不好。。主要是。我个人测试的时候发现。。

你的写法(其实也算是我以前的写法)。在单核挺好。双核下。只要加载。立马蓝。

但修改成下面后。则正常。。

VOID MmExchangeValue(PULONG  Target,ULONG  Value)
{
        KIRQL oldIrql;
        oldIrql = KeRaiseIrqlToDpcLevel();
        __asm
        {
                push eax
                        mov eax, cr0
                        mov CR0VALUE, eax
                        and eax, 0fffeffffh  
                        mov cr0, eax
                        pop eax  
        }


        InterlockedExchange(Target,Value);

        __asm
        {

                push eax
                        mov eax, CR0VALUE
                        mov cr0, eax
                        pop eax   
        }
        KeLowerIrql(oldIrql);
}

最后。还是比较推荐MDL法。。
mycsy 发表于 2009-8-31 03:08
汇编 和他不熟……

继续看楼上两位高人的讨论
wgz001 发表于 2009-8-31 06:48
Cici 发表于 2009-8-31 07:04
[s:219]1l楼和2楼的加油哦
 楼主| zzage 发表于 2009-8-31 15:34
呵呵。。鉴定完毕。。

楼主汇编高手。。。

不过。。

我觉得有个地方需要注意一下。。

第一。。CR0欺骗不安全。。建议用MDL。(不要嫌繁琐。封装成函数后用起来可舒服了。比CR0都快)。

第二。就算真的 ...
惜双双 发表于 2009-8-31 03:07

汇编还是小菜,汗,不敢称什么高手,用汇编写,只是为了能比较容易注意和理解一些细节上的问题.
呵呵,MDL确实繁琐些,还是习惯用CR0...多谢你的再次指点啊!
这Inline Hook方法在多核的情况下确实不安全,加自旋锁等法子,以前看众大牛也讨论过,貌似也不是彻底解决安全法子,不过在关中断的情况,连续用两条指令完成写内存,安全性应该会好一些~不过这只是简单Inline Hook例子,也没考虑太多因素,只是学习学习,呵呵,帖子里那个演示效果图片,就是在我那双核笔记本的环境下测试,倒是没蓝..RP好啊...哈哈!看来看去还是SSDT Hook好啊,稳定...也简单!
fulongzai 发表于 2010-8-2 23:41
都是大牛级别的啊!厉害
NikolayD 发表于 2014-2-27 18:53
Good info. Thanks for sharing.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 00:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表