能力值:
( LV9,RANK:610 )
|
-
-
2 楼
谁说Win7不行的。。。你代码没写好而已~
如果你是为了ShadowSSDT Hook的话,不用非得找csrss进程,只要不是System不是smss.exe就可以了。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
不是为了ShadowSSDT hook,我是小菜,能够讲的多一点吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
要是为了ShadowSSDT Hook的话,教主空间有篇文章。说得比较详细。
|
能力值:
( LV9,RANK:610 )
|
-
-
5 楼
贴个某驱动里的源码,未测试~~
char* QueryHandleInfo(SYSTEM_INFORMATION_CLASS SystemInformationClass)
{
SIZE_T bufferlen=0x4000;
PVOID buffer;
NTSTATUS status;
while ( 1 )
{
buffer = ExAllocatePool(NonPagedPool, bufferlen);
if ( !buffer )
break;
status = ZwQuerySystemInformation(SystemInformationClass, buffer, bufferlen, 0);
if ( status != STATUS_INFO_LENGTH_MISMATCH )
{
if ( status == STATUS_SUCCESS )
return buffer;
ExFreePool(buffer);
return 0;
}
ExFreePool(buffer);
bufferlen *= 2;
}
return NULL;
}
/*
typedef struct _SYSTEM_HANDLE_INFORMATION {
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
SHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
*/
HANDLE GetCsrssProcessId()
{
char* buffer;
int HandleCount;
int cnt=0;
OBJECT_ATTRIBUTES oa;
CLIENT_ID ClientId;
HANDLE hTargetProc;
HANDLE ObjectHandle;
PVOID Object;
PEPROCESS ProcessObject;
char ObjectInformation[500];
ULONG ReturnLength;
WCHAR *ObjectName;
PSYSTEM_HANDLE_INFORMATION pSysHandleInfo;
PUNICODE_STRING pNameInfo;
NTSTATUS status;
BOOL bFound;
ULONG v3=0;
pNameInfo=(PUNICODE_STRING)ObjectInformation;
ObjectName=pNameInfo->Buffer;
if ( *NtBuildNumber >= 6000 ) // Vista or later
{
pfnPsAcquireProcessExitSynchronization = (NTSTATUS (__stdcall *)(PEPROCESS))MmGetSystemRoutineAddress(&usPsAcquireFunName);
pfnPsReleaseProcessExitSynchronization = (NTSTATUS (__stdcall *)(PEPROCESS))MmGetSystemRoutineAddress(&usPsReleaseFunName);
}
buffer = QueryHandleInfo(SystemHandleInformation); // 使用查询句柄\Windows\ApiPort所有者的方法
if ( buffer == NULL )
return 0;
HandleCount = *(ULONG*)buffer;
if ( HandleCount ==0 )
{
ExFreePool(buffer);
return 0;
}
pSysHandleInfo=(PSYSTEM_HANDLE_INFORMATION)(buffer + sizeof(ULONG));
while ( 1 )
{
InitializeObjectAttributes(&oa,NULL,0x200,NULL,0);
ClientId.UniqueProcess = (HANDLE)pSysHandleInfo->ProcessId;
ClientId.UniqueThread = 0;
if ( NT_SUCCESS(ZwOpenProcess(&hTargetProc, 0x40u, &oa, &ClientId)) )
{
if ( ZwDuplicateObject(hTargetProc, (HANDLE)pSysHandleInfo->Handle, NtCurrentProcess(), &ObjectHandle, 0, 0, 2u) >=0)
{
if ( ZwQueryObject(ObjectHandle, ObjectTypeInfo, &ObjectInformation, 0x500u, &ReturnLength) >= 0
&& pNameInfo->Buffer
&& (!_wcsnicmp(pNameInfo->Buffer, L"Port", 4u) || !_wcsnicmp(pNameInfo->Buffer, L"ALPC Port", 9u))
&& ZwQueryObject(ObjectHandle, ObjectNameInfo, &ObjectInformation, 0x500u, &ReturnLength) >= 0
&& pNameInfo->Buffer
&& ObjectInformation
&& !_wcsnicmp(L"\\Windows\\ApiPort", pNameInfo->Buffer, 0x10u))
break;
}
else
{
if ( *NtBuildNumber >= 6000
&& pfnPsAcquireProcessExitSynchronization
&& pfnPsReleaseProcessExitSynchronization)
{
if (NT_SUCCESS(PsLookupProcessByProcessId(ClientId.UniqueProcess, &ProcessObject)))
{
if ( NT_SUCCESS(pfnPsAcquireProcessExitSynchronization(ProcessObject)) )
{
KeAttachProcess(ProcessObject);
if ( NT_SUCCESS(ObReferenceObjectByHandle((HANDLE)pSysHandleInfo->Handle, 0x80000000u, 0, 0, &Object, 0)) )
{
if ( Object == pSysHandleInfo->Object )
{
if ( NT_SUCCESS(ZwQueryObject((HANDLE)pSysHandleInfo->Handle,ObjectTypeInfo,&ObjectInformation,0x500,&ReturnLength))
&& pNameInfo->Buffer
&& !_wcsnicmp(pNameInfo->Buffer, L"ALPC Port", 9)
&& NT_SUCCESS(ZwQueryObject((HANDLE)pSysHandleInfo->Handle,ObjectNameInfo,&ObjectInformation,0x500,&ReturnLength))
&& pNameInfo->Buffer
&& ObjectInformation
&& !_wcsnicmp(pNameInfo->Buffer, L"\\Windows\\ApiPort", 16))
{
bFound = TRUE;
}
}
}
if ( Object )
ObfDereferenceObject(Object);
pfnPsReleaseProcessExitSynchronization(ProcessObject);
KeDetachProcess();
ObfDereferenceObject(ProcessObject);
ZwClose(hTargetProc);
if ( bFound )
{
ExFreePool(buffer);
return ClientId.UniqueProcess; // 找到Csrss.exe的PID
}
}
else
{
ObfDereferenceObject(ProcessObject);
}
}
}
ZwClose(hTargetProc);
}
ZwClose(ObjectHandle);
}//enfif of OpenProcess
++cnt;
pSysHandleInfo++;
if ( cnt >= HandleCount )
{
ExFreePool(buffer);
return 0;
}
bFound = FALSE;
}//end of while
ExFreePool(buffer);
ZwClose(ObjectHandle);
ZwClose(hTargetProc);
return ClientId.UniqueProcess;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
非常感谢,学习~~
|
能力值:
( LV15,RANK:520 )
|
-
-
7 楼
向里面注入一个线程获取吧
|
能力值:
(RANK:1130 )
|
-
-
8 楼
我一般是r3,CsrGetProcessId,然后传到r0去
切换用户后要重新获取
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我今天测试了一下(win7中),上面那段驱动的代码获取的是csrss进程Session0的的PID,由r3层获取csrss的pid然后传入r0也可以,r3层我是用Toolhelp获取,你是用的什么方法呢?
|
能力值:
(RANK:1130 )
|
-
-
10 楼
Session 0的pid在某些情况下是没法使用的
我的方法是r3,调用未公开API - ntdll.CsrGetProcessId,返回和这个r3程序同一个Session的csrss的pid传到r0(如果就一个桌面,一般来说,获取到的就是session 1)
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
好东西,mark下研究研究
|
能力值:
(RANK:400 )
|
-
-
12 楼
海风的方法挺简单的, 学习了.
|
能力值:
( LV12,RANK:760 )
|
-
-
13 楼
路过,远离csrss.exe很多年了~有需要的时候,直接hook一下ZwReadFile然后看调用者名是csrss.exe记录一下pid就好~何必枚举~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
数字里面的大牛写的还是很标准D……
|
能力值:
( LV9,RANK:610 )
|
-
-
15 楼
呵,不管是键盘还是鼠标,都得用到这玩意儿。。。
|
能力值:
( LV9,RANK:610 )
|
-
-
16 楼
查询句柄信息这块儿我觉得循环次数太多。。。可能是考虑兼容Win2000才这么写的吧,要不然两次就行了~
|
能力值:
( LV12,RANK:760 )
|
-
-
17 楼
话说 如果是键盘鼠标,直接XX kbdclass.sys和mouclass.sys多好
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
调用者名这个……是不是不够可靠……
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
一直以为这个是风格出的……不晓得2K怎么处理的……
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
这不就是365的代码
|