首页
社区
课程
招聘
[求助]Hook了NtSetValueKey后系统没了反应,请问为什么?
发表于: 2009-8-18 04:09 5368

[求助]Hook了NtSetValueKey后系统没了反应,请问为什么?

2009-8-18 04:09
5368
我采用的SSDT钩子,挂接后,执行完我的函数系统就没了反应,好像被挂起一样,也不蓝屏也不咋地,WinDug里显示Debuggee is running,不知道怎么回事,特发帖求助,挂接的函数为:
NTSTATUS NTAPI KrNtSetValueKey( HANDLE KeyHandle, PUNICODE_STRING ValueName, ULONG TitleIndex, ULONG Type, PVOID Data, ULONG DataSize)
{
	UNICODE_STRING FunName =RTL_CONSTANT_STRING(L"ZwSetValueKey");
	ULONG JmpAdress  = GetOldServiceAdressFromListById( GetServiceId(&FunName));
	PEPROCESS Process;
	UNICODE_STRING KeyName;
	KeyName.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, MAX_PATH*sizeof(TCHAR), MEM_YMYTAG);
	KeyName.MaximumLength = MAX_PATH;
	KeyName.Length = 0;
	if(NT_SUCCESS(GetNameByHandle(KeyHandle, &KeyName)))
	{
		if(Type == REG_SZ)           //该处并未进入
		{
			Process = PsGetCurrentProcess();

			Mylstrcpyn(g_MonitBuffer->Info.RegInfo.szProName, (PWSTR)((ULONG)Process+0x174), NAME_SIZE);
			UnicodeStringToUnicode(g_MonitBuffer->Info.RegInfo.szRegPath, &KeyName, MAX_PATH-NAME_SIZE);
			UnicodeStringToUnicode(g_MonitBuffer->Info.RegInfo.szValueName, ValueName, NAME_SIZE);
			Mylstrcpyn(g_MonitBuffer->Info.RegInfo.szValueData, (LPTSTR)Data, MAX_PATH-NAME_SIZE);
			KeSetEvent(g_pEvent[0], IO_NO_INCREMENT, FALSE);
			LARGE_INTEGER time = RtlConvertLongToLargeInteger(-10000);
			while(!(g_MonitBuffer->bFlag) || g_MonitBuffer->bAction != ACTION_REGMONIT)
			{			
				KeDelayExecutionThread(KernelMode, FALSE, &time);
			}
			ObDereferenceObject(Process);
			if(g_MonitBuffer->bFlag == FLAG_NO)
			{
				return -1;
			}
			else if(g_MonitBuffer->bFlag == FLAG_YES)
			{
				__asm
				{
					mov eax,JmpAdress;
					mov esp,ebp;
					pop ebp;	
					jmp eax;
				}
			}
		}
	}
	__asm
	{
		mov eax,JmpAdress;
		mov esp,ebp;
		pop ebp;	
		jmp eax;
	}
}


正如上述代码中的注释一样,if(NT_SUCCESS(GetNameByHandle(KeyHandle, &KeyName)))这个判断成立,紧接着由于if(Type == REG_SZ) 这个条件不成立,所以直接跳至结尾的汇编代码处,其中的JmpAdress确是是真实的内核函数地址,我用WinDbg看了的,在jmp前堆栈里的数据也和调用我挂接的函数时一致,堆栈平衡,但是只要F5后系统就没了响应,我用的虚拟机双机调试的,WinDbg显示Debuggee is running,请问问题出在哪??出了这样的状况我下手的地方都没了,调试都没得调了。。。

万般无奈,我把代码改成这样了,可是问题依旧:
typedef NTSTATUS (NTAPI *pFnNtSetValueKey)( HANDLE KeyHandle, PUNICODE_STRING ValueName, ULONG TitleIndex, ULONG Type, PVOID Data, ULONG DataSize);

NTSTATUS NTAPI KrNtSetValueKey( HANDLE KeyHandle, PUNICODE_STRING ValueName, ULONG TitleIndex, ULONG Type, PVOID Data, ULONG DataSize)
{
//	__asm int 3;
	UNICODE_STRING FunName =RTL_CONSTANT_STRING(L"ZwSetValueKey");
	pFnNtSetValueKey NtSetValueKey  = (pFnNtSetValueKey)GetOldServiceAdressFromListById( GetServiceId(&FunName));
return NtSetValueKey(KeyHandle, ValueName, TitleIndex, Type, Data, DataSize);
}

都削光了,可是问题依旧,很不明白啊

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
TSTATUS FakedZwSetValueKey
(
IN HANDLE  KeyHandle,
IN PUNICODE_STRING  ValueName,
IN ULONG  TitleIndex  OPTIONAL,
IN ULONG  Type,
IN PVOID  Data,
IN ULONG  DataSize
)
{
        char pch[MAXPATHLEN];
        char regValue[MAXPATHLEN];
        ANSI_STRING ansi;
        char aProcessName[PROCNAMELEN];
        GetFullName2(KeyHandle,pch);
        GetProcessName(aProcessName);
        DbgPrint("ZwSetValueKey is called by %s\n",aProcessName);

        RtlUnicodeStringToAnsiString(&ansi,ValueName,TRUE);
                if(ansi.Length<MAXPATHLEN)     
                {   
                        memcpy(regValue,ansi.Buffer,ansi.Length);   
                        regValue[ansi.Length]=0x00;   
                }   
                else   
                {   
                        memcpy(regValue,ansi.Buffer,MAXPATHLEN);   
                        regValue[MAXPATHLEN-1]=0x00;   
                }   
               
                RtlFreeAnsiString(   &ansi   );   
        strcat(aProcessName,"$$");
        strcat(pch,regValue);
        if (GoOrNot(aProcessName,pch))
        {
                return RealZwSetValueKey(
                                                                 KeyHandle,
                                                                 ValueName,
                                                                 TitleIndex,
                                                                 Type,
                                                                 Data,
                                                                 DataSize);
        }
        else
        {
                return STATUS_ACCESS_DENIED;
        }

}
2009-8-18 09:43
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
   山寨版的IS上挖出来的,我不是要一个函数
2009-8-18 11:39
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
Winker的回答很有道理
你需要的就是一个函数
例子可能并不怎样 但至少能让你掌握大概流程和思路
2009-8-18 21:31
0
游客
登录 | 注册 方可回帖
返回
//