首页
社区
课程
招聘
[求助]请问 大牛欢愉ssdt hook NtOpenProcess问题
发表于: 2009-11-27 19:55 6655

[求助]请问 大牛欢愉ssdt hook NtOpenProcess问题

2009-11-27 19:55
6655
NtOpenProcess我的理解是打开进程吧~~,我看些网友的保护进程关闭 也就是在NtOpenProcess里面获取进程ID 然后比较返回STATUS_ACCESS_DENIED
但是我这样做感觉完全没有作用 我都没有比较直接全部返回 STATUS_ACCESS_DENIED

NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,
               ACCESS_MASK DesiredAccess,
               POBJECT_ATTRIBUTES ObjectAttributes,
               PCLIENT_ID ClientId)
{
  DbgPrint("NtOpenProcess() called");
  return STATUS_ACCESS_DENIED;
}
请问这个是什么意思呢?
还有我HOOK的MyNtCreateProcess没有反应 不知道为什么大牛讲解哈

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
xp下和2003 要hook NtCreateProcessEx,以前在别的人的文章里说的。
2009-11-28 13:11
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上 那么NtOpenProcess  直接return STATUS_ACCESS_DENIED;
为什么会对程序没有任何影响呢
2009-11-28 17:11
0
雪    币: 212
活跃值: (10)
能力值: ( 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;
       
       
}
2009-11-28 18:05
0
雪    币: 722
活跃值: (123)
能力值: ( 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是不是早了点?
2009-11-28 20:56
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
就是这个理儿

lz 的代码 中
NTSTATUS __stdcall MyNtCreateProcessEx(

然后还 NTSTATUS state =   realCreateProcess(ProcessHandle,
2009-11-28 21:49
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
我给你的建议:把SSDT原理搞明白再做SSDT HOOK
2009-11-28 22:30
0
雪    币: 212
活跃值: (10)
能力值: ( 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);
这些代码也都是网上找的 但是就是调试不过
}
2009-11-29 13:28
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
蓝屏 不蓝了 但是不知道如何在我的mycreateprocess获得镜像名称 请教大家哈
2009-11-29 18:09
0
雪    币: 722
活跃值: (123)
能力值: ( 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
2009-11-29 21:05
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
牛啊 和大牛多学习了 谢谢大家
2009-12-9 13:03
0
雪    币: 212
活跃值: (10)
能力值: ( 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);
2009-12-9 13:28
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
其实也就是_SEGMENT_OBJECT结构的BaseAddress成员,指向一个_CONTROL_AREA结构
但是我看头文件定义好像没有这么写
2009-12-9 14:00
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
其实基本上也理解了 只是对里面很多不熟悉 看来得多练习啊
2009-12-9 14:02
0
游客
登录 | 注册 方可回帖
返回
//