频道栏目
首页 > 资讯 > 网络协议 > 正文

如何在Windows NT中隐藏自己(一)

04-11-02        来源:[db:作者]  
收藏   我要投稿

=====[ 1. 目录 ]================================================================

1. 目录
2. 介绍
3. 文件
       3.1 NtQueryDirectoryFile
       3.2 NtVdmControl
4. 进程
5. 注册表
       5.1 NtEnumerateKey
       5.2 NtEnumeratevalueKey
6. 系统服务和驱动
7. 挂钩和展开
       7.1 权限
       7.2 全局钩子
       7.3 新进程
       7.4 DLL
8. 内存
9. 句柄
       9.1 命名句柄并获得类型
10. 端口
       10.1 WinXP的Netstart,OpPorts,WinXP的FPort
       10.2 Win2k和NT4的OpPorts,Win2k的FPort
11. 结束语


=====[2. 介绍 ]=================================================================

这篇文档是关于在Windows NT中隐藏对象、文件、服务和进程等的技术。这些方法是建立在
挂钩Windows API的基础上的,具体描述见我的“挂钩Windows API”。

所有的这些都是我在编写rootkit代码时自己研究出来的,所有我在写这篇文章时的效率很高,
而且很容易就写成了。这要归功于我的付出。

在这篇文档中所提到的对任意对象的隐藏是指通过改变命名对象的系统过程使之跳过对这个
对象的命名过程。这样这个对象就只是这个过程的返回值,好象它不存在一样。

基本方法(不包括描述上的区别)是我们使用原始调用和原始函数然后我们改变它的输出。

在这个版本的文档中我们讲述如何隐藏文件、进程、关键字和注册表键值,系统服务和驱动,
分配的内存和句柄。


=====[ 3. 文件 ]================================================================

有很多隐藏文件而使其对系统不可见的可能。我们只针对改变API的技术而不涉及那些修改文
件系统的技术。这也更加简单因为我们不需要知道很多实际的文件系统是如何工作的。

=====[ 3.1 NtQueryDirectoryFile ]===============================================

Windows NT中,在目录中寻找文件是通过在这个目录和它所有的子目录中寻找得到的。因为
枚举文件要用到NtQueryDirectoryFile。

   NTSTATUS 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 FileInformationLength,
       IN FILE_INformATION_CLASS FileInformationClass,
       IN BOOLEAN ReturnSingleEntry,
       IN PUNICODE_STRING FileName OPTIONAL,
       IN BOOLEAN RestartScan
   );
  
对我们来说重要的参数是FileHandle,FileInformation和FileInformationClass。File-
Handle是一个可以从NtOpenFile得到的目录对象的句柄。FileInformation是一个指向一块
已分配内存的指针,函数向这里写入用户想要得到的信息。FileInformationClass决定在
FileInformation中写入的记录类型。

FileInformationClass是一个可变的枚举类型,但是我们只需要其中的四个值,这四个值用
来枚举目录的内容。

   #define FileDirectoryInformation        1
   #define FileFullDirectoryInformation    2
   #define FileBothDirectoryInformation    3
   #define FileNamesInformation            12
  
对于FileDirectoryInformation写入FileInformation的记录结构是:

   typedef struct _FILE_DIRECTORY_INformATION {
       ULONG NextEntryOffset;
       ULONG Unknown;
       LARGE_INTEGER CreationTime;
       LARGE_INTEGER LastAccessTime;
       LARGE_INTEGER LastWriteTime;
       LARGE_INTEGER ChangeTime;
       LARGE_INTEGER EndOfFile;
       LARGE_INTEGER AllocationSize;
       ULONG FileAttributes;
       ULONG FileNameLength;
       WCHAR FileName[1];
   } FILE_DIRECTORY_INformATION, *PFILE_DIRECTORY_INformATION;
  
对于FileFullDirectoryInformation:

   typedef struct _FILE_FULL_DIRECTORY_INformATION {
       ULONG NextEntryOffset;
       ULONG Unknown;
       LARGE_INTEGER CreationTime;
       LARGE_INTEGER LastAccessTime;
       LARGE_INTEGER LastWriteTime;
       LARGE_INTEGER ChangeTime;
       LARGE_INTEGER EndOfFile;
       LARGE_INTEGER AllocationSize;
       ULONG FileAttributes;
       ULONG FileNameLength;
       ULONG EaInformationLength;
       WCHAR FileName[1];
   } FILE_FULL_DIRECTORY_INformATION, *PFILE_FULL_DIRECTORY_INformATION;
  
对于FileBothDirectoryInformation:

   typedef struct _FILE_BOTH_DIRECTORY_INformATION {
       ULONG NextEntryOffset;
       ULONG Unknown;
       LARGE_INTEGER CreationTime;
       LARGE_INTEGER LastAccessTime;
       LARGE_INTEGER LastWriteTime;
       LARGE_INTEGER ChangeTime;
       LARGE_INTEGER EndOfFile;
       LARGE_INTEGER AllocationSize;
       ULONG FileAttributes;
       ULONG FileNameLength;
       ULONG EaInformationLength;
       UCHAR AlternateNameLength;
       WCHAR AlternateName[12];
       WCHAR FileName[1];
   } FILE_BOTH_DIRECTORY_INformATION, *PFILE_BOTH_DIRECTORY_INformATION;
  
对于FileNamesInformation:

   typedef struct _FILE_NAMES_INformATION {
       ULONG NextEntryOffset;
       ULONG Unknown;
       ULONG FileNameLength;
       WCHAR FileName[1];
   } FILE_NAMES_INformATION, *PFILE_NAMES_INformATION;
  
这个函数在FileInformation写入一个这些结构的列表。在这些结构类型中只有三个变量对我
们很重要。

NextEntryOffset是详细列表项的长度。第一项可以在地址FileInformation + 0处找到。所
以第二项就是在第一项的偏移FileInformation + NextEntryOffset处。最后一项的Next-
EntryOffset字段为0。

FileName是文件的完成文件名。

FileNameLength是文件名的长度。

如果我们想要隐藏一个文件,我们要分辨出这四个类型的结构然后对每一个返回的记录我们
需要把其中的文件名与我们要隐藏的文件名进行比较。如果我们要隐藏第一个记录,我们就
要根据第一个结构的大小移动后面的结构。这就导致第一个记录被重写。如果我们要隐藏另
一个记录,我们可以简单的改写前一个记录的NextEntryOffset字段。如果我们想隐藏最后一
个记录,那么它前面一个记录的NextEntryOff

相关TAG标签
上一篇:如何在Windows NT中隐藏自己(二)
下一篇:DDOS与DDOS追踪的介绍
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站