首页
社区
课程
招聘
[求助]SSDT HOOK NtCreateFile 出现代码判断无效
发表于: 2010-1-20 14:54 6414

[求助]SSDT HOOK NtCreateFile 出现代码判断无效

2010-1-20 14:54
6414
SSDT HOOK  NtCreateFile 出现代码判断无效

第一次代码

NTSTATUS   MYNtCreateFile(
                                                  OUT PHANDLE             FileHandle,
                                                  IN ACCESS_MASK          DesiredAccess,
                                                  IN POBJECT_ATTRIBUTES   ObjectAttributes,
                                                  OUT PIO_STATUS_BLOCK    IoStatusBlock,
                                                  IN PLARGE_INTEGER       AllocationSize OPTIONAL,
                                                  IN ULONG                FileAttributes,
                                                  IN ULONG                ShareAccess,
                                                  IN ULONG                CreateDisposition,
                                                  IN ULONG                CreateOptions,
                                                  IN PVOID                EaBuffer OPTIONAL,
                                                  IN ULONG                EaLength )
{
        ULONG  rreett;
    ULONG ccsd;

        __asm{
                push   EaLength
                        push   EaBuffer OPTIONAL
                        push   CreateOptions
                        push   CreateDisposition
                        push   ShareAccess      
                        push   FileAttributes
                        push   AllocationSize OPTIONAL
                        push   IoStatusBlock
                        push   ObjectAttributes
                        push   DesiredAccess
                        push   FileHandle
                        call  NtCreateFileAddress  
                        mov rreett,eax               
        }
        if (FileHandle != NULL)
        {
                ccsd=*(ULONG*)FileHandle;
                if (ccsd != 0)
                {
                        if (FileAttributes !=0)
                        {        if (check((HANDLE)ccsd) != 0)
                        {
                                DbgPrint("FileAttributes : %08X \n",FileAttributes);
                                DbgPrint("LTAAAAAAA : %s \n",SafePatch);
                        }
                        }
               
                }
        }

       

        return rreett;

}

运行一下任务管理器 多次出现  FileAttributes : 00000000   代码中 的 FileAttributes !=0 竟然无效 刷新一个文件夹表现尤其明显

代码作出如下修改

while (ISRun) //防止多线程同步执行
{

DbgPrint("卡住啦~!!!!!!!........ \n");
goto END;
}   
ISRun=TRUE;
        __asm{
                push   EaLength
                        push   EaBuffer OPTIONAL
                        push   CreateOptions
                        push   CreateDisposition
                        push   ShareAccess      
                        push   FileAttributes
                        push   AllocationSize OPTIONAL
                        push   IoStatusBlock
                        push   ObjectAttributes
                        push   DesiredAccess
                        push   FileHandle
                        call  NtCreateFileAddress  
                        mov rreett,eax               
        }
        if (FileHandle != NULL)
        {
                ccsd=*(ULONG*)FileHandle;
                if (ccsd != 0)
                {
                        if (FileAttributes !=0)
                        {        if (check((HANDLE)ccsd) != 0)
                        {
                                DbgPrint("FileAttributes : %08X \n",FileAttributes);
                                DbgPrint("LTAAAAAAA : %s \n",SafePatch);
                        }
                        }
               
                }
        }

                ISRun=FALSE;
END:
        return rreett;

}

还是会出现 判断无效  也会出现  卡住啦~!!!!!!!........  表现在 打开一些复合文件 刷新文件夹 什么的 运行任务管理器

诚心求教 大牛 这个情况 怎么处理 ? 按理说 不管怎么请求 控制变量 只有执行完才会复位啊 我想过滤 出文件的 创建请求 求大牛指点 不胜感激

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
怎么会出现重复发帖? 申请删除一个帖子
2010-1-20 14:56
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
3
SSDT hook的只是 替换ssdt表的地址,所以替换zwcreatefile的地址,zwcreatefile再去调用NTfilecreate,所以做inline hook 则做NtFileCreatefile,如果你上面不行,

__asm{
    push   EaLength
      push   EaBuffer OPTIONAL
      push   CreateOptions
      push   CreateDisposition
      push   ShareAccess      
      push   FileAttributes
      push   AllocationSize OPTIONAL
      push   IoStatusBlock
      push   ObjectAttributes
      push   DesiredAccess
      push   FileHandle
      call  NtCreateFileAddress  
      mov rreett,eax   
  }
不要按上面这样写,按照下面这样写
return ZwCreateFile(
             FileHandle,
               DesiredAccess,
ObjectAttributes,
   IoStatusBlock,
     AllocationSize OPTIONAL,
             FileAttributes,
              ShareAccess,
                 CreateDisposition,
             CreateOptions,
             EaBuffer ,
                EaLength )
{

如果你确实要这样写先要

__asm{
    push   EaLength
      push   EaBuffer OPTIONAL
      push   CreateOptions
      push   CreateDisposition
      push   ShareAccess      
      push   FileAttributes
      push   AllocationSize OPTIONAL
      push   IoStatusBlock
      push   ObjectAttributes
      push   DesiredAccess
      push   FileHandle
      call     IoCreateFile  
      mov rreett,eax   
  }
这样写因为在windbg反汇编如下:
nt!NtCreateFile:
8057d328 8bff            mov     edi,edi
8057d32a 55              push    ebp
8057d32b 8bec            mov     ebp,esp
8057d32d 33c0            xor     eax,eax
8057d32f 50              push    eax
8057d330 50              push    eax
8057d331 50              push    eax
8057d332 ff7530          push    dword ptr [ebp+30h]
8057d335 ff752c          push    dword ptr [ebp+2Ch]
8057d338 ff7528          push    dword ptr [ebp+28h]
8057d33b ff7524          push    dword ptr [ebp+24h]
8057d33e ff7520          push    dword ptr [ebp+20h]
8057d341 ff751c          push    dword ptr [ebp+1Ch]
8057d344 ff7518          push    dword ptr [ebp+18h]
8057d347 ff7514          push    dword ptr [ebp+14h]
8057d34a ff7510          push    dword ptr [ebp+10h]
8057d34d ff750c          push    dword ptr [ebp+0Ch]
8057d350 ff7508          push    dword ptr [ebp+8]
8057d353 e86effffff      call    nt!IoCreateFile (8057d2c6)
所以显而易见到你的错误
2010-1-20 16:45
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
感谢大牛liukeblue指点 不胜感激
应为是只想过滤 文件的创建 R3 一般 CreateFile->ZwCreateFile->NtCreateFile->IoCreateFile

但并不是 所有的 创建都是 有 ZwCreateFile 传下去的 所以 才选得 NtCreateFile 本来想做的在底层点

IoCreateFile  但 太底层了请求太多 过滤代码不好写 关键是稳定性不好掌握 要是弄的再好点 那应该要 文件

过滤驱动了? 这样好像越跑越远了

看大牛的提示 问题应该在 函数 堆砌 被破坏了? 前面是 VC 函数头 自己保护的代码 应为没有使用  

static __declspec(naked)  不知道我理解的对否?  

我去研究下 太感谢 大牛指点了 万分感谢~!!
2010-1-21 00:05
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
再次 谢谢 大牛 的 指点  已经可以了 代码改为 如下 运行很稳定

ULONG  NtCreateFileret;
ULONG  lsFileHandle;
NTSTATUS MYNtCreateFile(
                                                OUT PHANDLE             FileHandle,
                                                IN ACCESS_MASK          DesiredAccess,
                                                IN POBJECT_ATTRIBUTES   ObjectAttributes,
                                                OUT PIO_STATUS_BLOCK    IoStatusBlock,
                                                IN PLARGE_INTEGER       AllocationSize OPTIONAL,
                                                IN ULONG                FileAttributes,
                                                IN ULONG                ShareAccess,
                                                IN ULONG                CreateDisposition,
                                                IN ULONG                CreateOptions,
                                                IN PVOID                EaBuffer OPTIONAL,
                                                IN ULONG                EaLength )
{
        __asm{
                push   EaLength
                        push   EaBuffer OPTIONAL
                        push   CreateOptions
                        push   CreateDisposition
                        push   ShareAccess      
                        push   FileAttributes
                        push   AllocationSize OPTIONAL
                        push   IoStatusBlock
                        push   ObjectAttributes
                        push   DesiredAccess
                        push   FileHandle
                        call  NtCreateFileAddress  
                        mov NtCreateFileret,eax       
        }
        if (FileAttributes != 0 && DesiredAccess == 0xC0100080)
        {
                DbgPrint("FileAttributes : %08X \n",FileAttributes);
                DbgPrint("DesiredAccess : %08X \n",DesiredAccess);
                ////////////////建立文件请求拦截////////////////
                if (FileHandle != NULL)
                {
                        lsFileHandle=*(ULONG*)FileHandle;
                        if (lsFileHandle != 0)
                        {
                                if (check((HANDLE)lsFileHandle) != 0)
                                {
                                       
                                        DbgPrint("LT : %s \n",SafePatch);
                                       
                                }
                        }
                }
               
        }
       
        return NtCreateFileret;
}
2010-1-21 01:20
0
雪    币: 379
活跃值: (152)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
6
不好意思,我并不是什么大牛,我也是驱动编程初学者,我觉得真正的大牛是:qihoocom、achillis 、sudami等等,这些才是真正的大牛,值得我们学习,特此声明
2010-1-21 09:58
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
这里为什么要对参数压栈呢 直接调用就行了  没必要汇编啊  用FSD HOOK做吧
2010-1-21 11:35
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
感谢大牛提示 刚学驱动 呵呵 什么都不懂 FSD 太专业了 就算用 minifilter 都有点吃不消
2010-1-21 12:07
0
游客
登录 | 注册 方可回帖
返回
//