首页
社区
课程
招聘
[分享]inline hook NtQueryDirectoryFile
发表于: 2008-5-8 19:12 14715

[分享]inline hook NtQueryDirectoryFile

2008-5-8 19:12
14715

不敢说原创了 因为没什么是我创的

学习了Rootkits.Subverting.the.Windows.Kernel中的detour补丁一章和一篇kernel inline hook的精华写下了下面代码 练练手
inline hook NtQueryDirectoryFile实现了隐藏文件 代码其实还有很多要改进的地方 inline hook 应该还有很多发展的空间 比如我这个代码开头就jmp了 太明显了 可以改后面的字节再jmp
好不容易实现了 就赶紧发上来了 给和我一样新手们 改改就可以hook 别的api了


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

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
这种方法学习是不错....但用于隐藏文件????不太行啊
2008-5-8 20:14
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
写地不错啊。

2008-5-8 20:32
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
为什么啊
2008-5-8 23:23
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
5
__asm
  {
    forwArd:
    call bAck
  }
这句写的精彩。
2008-5-9 09:00
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
BOOL hook后面少了个分号,
if(NT_SUCCESS(Check()))
    {
      DbgPrint(" check SUCCESS");
      write();
      hook=true;   //这里好象不能用小写的,hook定义的是BOOL.而不是bool,
    }
2008-5-9 10:01
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
谢谢提醒 我改了 那句其实是后加的 没经编译的
2008-5-9 10:58
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我修改了隐藏的文件名,改成一个目录,在XPDDK下编译后,一旦访问到隐藏的目录
就蓝屏重启了。比如,隐藏了目录ABC,一旦在地址栏里输入ABC就BOSD了。
还有令我不解的是:
//return rc;
            __asm
            {
              popad
              mov esp,ebp
              pop ebp
              mov eax,rc
              ret 0x2C
            }

为什么不用
return rc;
呢?
NtQueryDirectoryFile函数和zwQueryDirectoryFile谁是最底层?感觉两个函数都一样啊。
2008-5-9 15:09
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
第一个问题 我不知道 还在考虑
第二个问题 因为是nake func 堆栈都要自己平衡
第三个问题 NtQueryDirectoryFile
2008-5-9 15:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
为什么会出现这个 warning 那:
'MyNtQueryDirectoryFile' : function should return a value; 'void' return type assumed
因为这个warning .sys 没有被生成。
我用的是 DDKWizard 的编译环境, 2003 DDK。
2008-5-9 15:53
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
直接用ddk编译试试
2008-5-9 16:02
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
给你我的sys
上传的附件:
2008-5-9 16:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
环境好了。
谢谢LZ 的帮助及分享。
2008-5-9 16:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不好意思,还得问一下。这个驱动怎么用那。我试了一下:

"RtlInitAnsiString(&HideDirFile,"c:\\Test");" 和
"RtlInitAnsiString(&HideDirFile,"c:\\Test\\Test.txt");"

怎么没有隐藏成功。有什么不对的地方么?
2008-5-9 16:53
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这样写:
RtlInitAnsiString(&HideDirFile,"Test");
就可以隐藏任何test目录了。
不能带路径。
我用OD试了一下,在调用NtQueryDirectoryFile函数时,会把上级目录放在FileName参数里,
NTAPI NtQueryDirectoryFile(
  IN  HANDLE FileHandle,
  IN  HANDLE Event OPTIONAL,
  IN  PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN  PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN  ULONG Length,
  IN  FILE_INFORMATION_CLASS FileInformationClass,
  IN  BOOLEAN ReturnSingleEntry,
  IN  PUNICODE_STRING FileName OPTIONAL,   //上级目录
  IN  BOOLEAN RestartScan
  );

我要对此参数进行过滤要怎么做?比如:当FileName="c:\test"就函数直接反回。我试了N次都是因为FileName的数据类型不能强制转换而不能通过。
UNICODE_STRING uniFileNamenew;

ANSI_STRING  FileNamenew;
RtlInitUnicodeString(&uniFileNamenew,FileName);
      RtlUnicodeStringToAnsiString(&FileNamenew,&uniFileNamenew,TRUE);

if(RtlCompareMemory(FileNamenew.Buffer,HideDirFile.Buffer,HideDirFile.Length ) == HideDirFile.Length)
{
rc=0;
__asm
            {
              popad
              mov esp,ebp
              pop ebp
              mov eax,rc
              ret 0x2C
            }

}

大概意思就是上面这段代码,我知道肯定不简单,我C++的数据类型转换不熟,请hfyy大哥看看要怎么改?
2008-5-9 17:18
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
如果你不做什么操作 返回的rc就是原谅调用NtQueryDirectoryFile返回的NTSTATUS 我想根本看不出什么区别吧
2008-5-10 16:42
0
游客
登录 | 注册 方可回帖
返回
//