能力值:
( LV2,RANK:10 )
2 楼
xp下和2003 要hook NtCreateProcessEx,以前在别的人的文章里说的。
能力值:
( LV2,RANK:10 )
3 楼
谢谢楼上 那么NtOpenProcess 直接return STATUS_ACCESS_DENIED;
为什么会对程序没有任何影响呢
能力值:
( LV2,RANK:10 )
4 楼
HOOK了 这个果然可以,但是 运行下去还是会蓝 求大牛指点啊!!
NTSTATUS __stdcall MyNtCreateProcessEx(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE InheritFromProcessHandle,
IN ULONG CreateFlags,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugObject OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN ULONG JobMemberLevel
)
{
NTSTATUS state = realCreateProcess(ProcessHandle,
DesiredAccess,
ObjectAttributes,
InheritFromProcessHandle,
CreateFlags,
SectionHandle ,
DebugObject ,
ExceptionPort ,
JobMemberLevel);
DbgPrint("MyNtCreateProcess() called");
if(NT_SUCCESS(state) || ObjectAttributes)
{
DbgPrint( "ObjectName: %s\n", ObjectAttributes->ObjectName );
return state;
}
else
return STATUS_ACCESS_DENIED;
}
能力值:
( LV12,RANK:300 )
5 楼
if(NT_SUCCESS(state) || ObjectAttributes) { DbgPrint( "ObjectName: %s\n", ObjectAttributes->ObjectName ); return state; } else return STATUS_ACCESS_DENIED;
这种代码也太……
谁跟你说NT_SUCCESS(state)了ObjectAttributes就一定有效的(它也是OPTIONAL的)?
谁跟你说ObjectAttributes存在ObjectName就一定要有效的?就算它有效了,它是UNICODE_STRING,显示出来也不是用%s啊。
又是谁跟你说else就直接return STATUS_ACCESS_DENIED的?
还有你说的NtOpenProcess保护无效又是什么意思?对NtOpenProcess进行HOOK通通返回失败,当然会影响一些操作,如果你说不会影响,那说明你还没试过那些会被它影响的操作,也就是说你连OpenProcess怎么用恐怕都还不清不楚。
最后说一句,连NtOpenProcess(以及Ring3的OpenProcess)的功能以及什么情况下使用都搞不清楚的话,你来写SSDT HOOK是不是早了点?
能力值:
( LV2,RANK:10 )
6 楼
就是这个理儿
lz 的代码 中
NTSTATUS __stdcall MyNtCreateProcessEx(
然后还 NTSTATUS state =
realCreateProcess (ProcessHandle,
能力值:
( LV12,RANK:210 )
7 楼
我给你的建议:把SSDT原理搞明白再做SSDT HOOK
能力值:
( LV2,RANK:10 )
8 楼
各位大牛谢谢了 我确实才接触驱动 还在学习中哈
SSDT HOOK我的理解就是把 表地址替换了 但是我这样做为什么会蓝屏 呢
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE InheritFromProcessHandle,
IN ULONG CreateFlags,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugObject OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN ULONG JobMemberLevel
我把这些参数按照顺序全部打印出来 是这个样子的
rootkit: NewNtCreateProcessEx() 0x0007D944 0x001F0FFF 0x00000000 0xFFFFFFFF 0x00000000 0x000007B0 0x00000000 0x00000000 0x00000000
应该说我重新调用了它真实的地址后应该和以前一样 不会蓝屏的啊 但事实确实相反
NTSTATUS NewNtCreateProcessEx(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN HANDLE Unknown OPTIONAL)
{
CHAR aProcessName[PROCNAMELEN];
GetProcessName( aProcessName );
DbgPrint("rootkit: NewNtCreateProcessEx() from %s 0x%08X\n", aProcessName,OldNtCreateProcessEx);
DbgPrint("rootkit: NewNtCreateProcessEx() 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\
\n", ProcessHandle,DesiredAccess,ObjectAttributes,ParentProcess,InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown\
);
//DbgPrint("ok");
return OldNtCreateProcessEx(ProcessHandle,DesiredAccess,
ObjectAttributes,ParentProcess,InheritObjectTable,SectionHandle,DebugPort,ExceptionPort,Unknown);
这些代码也都是网上找的 但是就是调试不过
}
能力值:
( LV2,RANK:10 )
9 楼
蓝屏 不蓝了 但是不知道如何在我的mycreateprocess获得镜像名称 请教大家哈
能力值:
( LV12,RANK:300 )
10 楼
一般创建进程时ObjectAttributes其实是空的,SectionHandle才是有内容的。因此一般通过这个SectionHandle获取进程文件名。
代码参考http://bbs.pediy.com/showthread.php?p=432627中sudami的回复。
原理是:
ObReferenceObjectByHandle,通过SectionHandle得到SectionObject,即指向_SECTION_OBJECT结构的指针。
通过_SECTION_OBJECT得到SegmentObject成员,指向一个_SEGMENT_OBJECT结构。
_SEGMENT_OBJECT结构的BaseAddress成员,指向一个_CONTROL_AREA结构。
这个_CONTROL_AREA结构的FilePointer成员,就是指向描述文件的_FILE_OBJECT结构的指针
从_FILE_OBJECT结构的DeviceObject成员中得到所在盘符(调用RtlVolumeDeviceToDosName),加上FileName成员指定的路径,就是这个文件的全路径。
相关结构(XP SP3,windbg中得到)
lkd> dt _SECTION_OBJECT nt!_SECTION_OBJECT +0x000 StartingVa : Ptr32 Void +0x004 EndingVa : Ptr32 Void +0x008 Parent : Ptr32 Void +0x00c LeftChild : Ptr32 Void +0x010 RightChild : Ptr32 Void +0x014 Segment : Ptr32 _SEGMENT_OBJECT lkd> dt _SEGMENT_OBJECT nt!_SEGMENT_OBJECT +0x000 BaseAddress : Ptr32 Void +0x004 TotalNumberOfPtes : Uint4B +0x008 SizeOfSegment : _LARGE_INTEGER +0x010 NonExtendedPtes : Uint4B +0x014 ImageCommitment : Uint4B +0x018 ControlArea : Ptr32 _CONTROL_AREA +0x01c Subsection : Ptr32 _SUBSECTION +0x020 LargeControlArea : Ptr32 _LARGE_CONTROL_AREA +0x024 MmSectionFlags : Ptr32 _MMSECTION_FLAGS +0x028 MmSubSectionFlags : Ptr32 _MMSUBSECTION_FLAGS lkd> dt _CONTROL_AREA nt!_CONTROL_AREA +0x000 Segment : Ptr32 _SEGMENT +0x004 DereferenceList : _LIST_ENTRY +0x00c NumberOfSectionReferences : Uint4B +0x010 NumberOfPfnReferences : Uint4B +0x014 NumberOfMappedViews : Uint4B +0x018 NumberOfSubsections : Uint2B +0x01a FlushInProgressCount : Uint2B +0x01c NumberOfUserReferences : Uint4B +0x020 u : __unnamed +0x024 FilePointer : Ptr32 _FILE_OBJECT +0x028 WaitingForDeletion : Ptr32 _EVENT_COUNTER +0x02c ModifiedWriteCount : Uint2B +0x02e NumberOfSystemCacheViews : Uint2B lkd> dt _FILE_OBJECT nt!_FILE_OBJECT +0x000 Type : Int2B +0x002 Size : Int2B +0x004 DeviceObject : Ptr32 _DEVICE_OBJECT +0x008 Vpb : Ptr32 _VPB +0x00c FsContext : Ptr32 Void +0x010 FsContext2 : Ptr32 Void +0x014 SectionObjectPointer : Ptr32 _SECTION_OBJECT_POINTERS +0x018 PrivateCacheMap : Ptr32 Void +0x01c FinalStatus : Int4B +0x020 RelatedFileObject : Ptr32 _FILE_OBJECT +0x024 LockOperation : UChar +0x025 DeletePending : UChar +0x026 ReadAccess : UChar +0x027 WriteAccess : UChar +0x028 DeleteAccess : UChar +0x029 SharedRead : UChar +0x02a SharedWrite : UChar +0x02b SharedDelete : UChar +0x02c Flags : Uint4B +0x030 FileName : _UNICODE_STRING +0x038 CurrentByteOffset : _LARGE_INTEGER +0x040 Waiters : Uint4B +0x044 Busy : Uint4B +0x048 LastLock : Ptr32 Void +0x04c Lock : _KEVENT +0x05c Event : _KEVENT +0x06c CompletionContext : Ptr32 _IO_COMPLETION_CONTEXT
能力值:
( LV2,RANK:10 )
11 楼
牛啊 和大牛多学习了 谢谢大家
能力值:
( LV2,RANK:10 )
12 楼
lkd> dt _SEGMENT_OBJECT
nt!_SEGMENT_OBJECT
+0x000 BaseAddress : Ptr32 Void
+0x004 TotalNumberOfPtes : Uint4B
+0x008 SizeOfSegment : _LARGE_INTEGER
+0x010 NonExtendedPtes : Uint4B
+0x014 ImageCommitment : Uint4B
+0x018 ControlArea : Ptr32 _CONTROL_AREA
+0x01c Subsection : Ptr32 _SUBSECTION
+0x020 LargeControlArea : Ptr32 _LARGE_CONTROL_AREA
+0x024 MmSectionFlags : Ptr32 _MMSECTION_FLAGS
+0x028 MmSubSectionFlags : Ptr32 _MMSUBSECTION_FLAGS
从_SEGMENT_OBJECT偏移到Ptr32 _CONTROL_AREA是偏移0x18
但该程序
ns= ObReferenceObjectByHandle( KeyHandle, 0, NULL, KernelMode, &pKey, NULL ) ;
if( !NT_SUCCESS(ns)) return ns;
fullUniName.Buffer = ExAllocatePool( PagedPool, MAXPATHLEN*2);//1024*2
fullUniName.MaximumLength = MAXPATHLEN*2;
__try
{
pFile=(PVOID)*(ULONG *)((char *)pKey+20);
pFile=(PVOID)*(ULONG *)((char *)pFile); //这里为什么会直接取没有偏移呢?奇怪
pFile=(PVOID)*(ULONG *)((char *)pFile+36);
能力值:
( LV2,RANK:10 )
13 楼
其实也就是_SEGMENT_OBJECT结构的BaseAddress成员,指向一个_CONTROL_AREA结构
但是我看头文件定义好像没有这么写
能力值:
( LV2,RANK:10 )
14 楼
其实基本上也理解了 只是对里面很多不熟悉 看来得多练习啊